2011-12-06 1 views
0

최근 데이터 형식에 대한 Union 저장 지정자에 대해 배웠습니다. 특히 OpenGL/DirectX 변환 매트릭스 사용에 대한 내용입니다. 사용되지 않는 gluLookAt, gluOrtho 및 고정 함수 파이프 라인의 다양한 MatrixStack 함수가 있습니다. 환상적이었고 최근 Matrix에서 데이터에 액세스하는 여러 가지 방법을 허용하기 위해 내부 데이터가 결합 된 4x4 기본 변환 매트릭스 클래스를 만드는 데 많은 재미를 보았습니다. 내가/집계의 열을 기준으로 데이터에 액세스하는 방법을 만들 때 문제가 몇 가지 이상한"Column-Major"형식의 클래스/유니언 데이터 액세스 C++

float* Column(int index); 

기능을하지 않고도이다. C++에서 데이터를 행 주요 형식으로 저장한다는 것을 알고 있으므로 어떻게 열 액세스를 제공합니까? 저기있어? 내 아래 행렬 데이터 선언에서 내가 잃어버린 곳을.

//#define ROW_EFFIN_MAJOR 
union { 
    struct { 
#ifdef ROW_EFFIN_MAJOR 
// Eat one of several nasty things, OpenGL :| 
     float m11, m12, m13, m14, 
       m21, m22, m23, m24, 
       m31, m32, m33, m34, 
       m41, m42, m43, m44; 
#else 
     float m11, m21, m31, m41, 
       m12, m22, m32, m42, 
       m13, m23, m33, m43, 
       m14, m24, m34, m44; 
#endif 
    }; 
    float m[16]; 
    // Use at your own risk: m[1] COLUMNMAJOR is not the same as m[1] ROWMAJOR 
    // Rows! 
    union MatrixRow { 
     struct { 
      float r1, r2, r3, r4; 
     }; 
     float r[4]; 
    } row[4]; 
    // .... Columns...? 
    union MatrixColumn { 
     // TODO: 
     // Set Union 
     // Column Access ? 
     // ??? 
     // Profit 
    } col[???]; 
}; 

조언, 팁, 트릭 또는 도움이 필요합니다. 이상적으로 col [0] .c1 또는 col [0] .c (c는 전체 열의 float [4] 임)로 열에 액세스하고 싶습니다. 그러나이 이상이 열 액세스의 더 큰 정의를 위해 죽임 당할 경우 (비록 함수와는 별도로 기울어 져 있기 때문에 특별한 구조체와 함수로 수행 할 수 있기 때문에 바람직하지 않습니다. 데이터 멤버를 통해 직접 데이터).

나는 이것을 google-fu로 bash하려고 꽤 많은 시간을 보냈지 만, 인접하지 않은 결합을 만드는 방법을 알 수는 없습니다.

+1

C++에는 다차원 배열 개념이 없으므로 주요 차원 개념이 없습니다. 배열 배열의 개념을 지원하지만, 내부 배열 열 또는 행을 호출하는지 여부는 대부분 당신에게 달려 있습니다. 행을 초기화 할 때 일반적으로 소스 코드 행과 일치하기 때문에 행으로 참조하는 것이 더 일반적이지만 순전히 우연입니다. –

+1

Aaah union abuse! –

+0

@WTP 연합 학대, 응? 특히 MatrixRow 유니온을 사용하여 디버거 비주얼 라이저를 만들뿐만 아니라 포인터 점프를 시작하지 않고도 네 개의 순차적 데이터 요소에 액세스하고 그룹화 할 수있을 때 악용 사례로 보지 않습니다. 내 'Union Vector4'를 완성하면 더욱 재미있게 될 것입니다. : D – Andhera

답변

2

Marcelo가 지적한대로 C++는 행 중대도 아니고 열 중대도 아닙니다. 그것은 정확히 당신이 그것에 넣은 것입니다. float 배열의 처음 네 개의 값을 "열"이라고하면 괜찮습니다. 당신이 그것을 "행"이라 부르면, 그것도 좋습니다.

일반적으로 규칙을 앞뒤로 전환하면 안됩니다. "둘 다"할 수있는 구조체를 개발하지 마십시오. 옆구리를 골라서 붙잡아 라. 매트릭스를 행 메이저로 만들면, 행 메이저가됩니다. OpenGL에 업로드 할 때 수동으로 조 변경하거나 glUniformMatrix의 "transpose"매개 변수에 GL_TRUE을 전달하면됩니다.

세부 사항 are available.

+0

글쎄, 답변 주셔서 감사합니다. 저는 "건너 뛰기 4 건너 뛰기"방식으로 데이터를 확장 할 수는 없다는 것을 알았지 만, 내가 추측하는지 확인하는 것이 좋습니다. 나는 너를 지금 당장 대답 할 것이지만, 나는 언젠가 그 주위를 돌아 다닐 수 있기를 진심으로 희망한다. – Andhera

+0

빠른 측면 질문으로서 : 당신이 전달하는 모든 단일 행렬에 대해 glUniformMatrix에 사실을 부여하지 않는 것은 약간 느립니다. OpenGL은 매번 행렬을 바꿔야하기 때문입니다? 내 말은, 매트릭스를 조 변경하려면 기술적으로 SWAP 명령이 6 개 뿐이지 만 ... – Andhera