最近我了解了数据类型的Union存储说明符 - 它特别适用于OpenGL / DirectX转换矩阵,因为我不想继续使用已弃用的gluLookAt,gluOrtho和固定的各种MatrixStack函数 - 功能管道。这真是太棒了,我最近创建了4x4基本转换矩阵类,其内部数据是联合打包的,可以通过不同的方式访问Matrix中的数据。问题是当我想创建一种通过其列聚合/访问数据的方式时,而不必做出一些奇怪的
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访问colums,或者只是col [0] .c(c是整列的float [4])。然而,如果这个理想是为了更大的列访问正义而被杀死(尽管,倾向于非函数,因为我可以用一个特殊的结构和函数来做它。它比访问它更方便和慢一点数据直接通过数据成员)。
我花了相当多的时间试图用google-fu来抨击它,但我无法弄清楚如何建立一个不连续的联盟。
答案 0 :(得分:2)
正如Marcelo所指出的,C ++既不是行主要也不是列主要。这正是你所投入的。如果您将float
数组中的前四个值称为“列”,那么就可以了。如果你把它称为“行”,那也可以。
通常,您不应在约定之间来回切换。不要开发能够做到“两者”的结构;只挑一边坚持下去。如果你的矩阵是行主要的,那么它们就是行专业。当您将它们上传到OpenGL时,您可以手动转置它们,或只是将GL_TRUE
传递给glUniformMatrix
的“转置”参数。
更多详情are available。