最近,我了解了数据类型的Union存储说明符-它特别适用于OpenGL / DirectX转换矩阵,因为我不想继续使用固定函数管道中不推荐使用的gluLookAt、gluOrtho和各种MatrixStack函数。它非常棒,我最近创建了4x4基本转换矩阵类,它的内部数据是联合打包的,以允许以不同的方式访问矩阵中的数据。问题是,当我想要创建一种按列聚合/访问数据的方法时,而不必做一些奇怪的事情
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.c1访问列,或者只访问col.c (c是整个列的float4 )。然而,如果这个理想是为了列访问的更大正义而被扼杀的话(尽管,倾向于不是函数,因为我可以用特殊的结构和函数来做到这一点。它只是不太方便,而且比直接通过数据成员访问数据慢一点)。
我花了相当多的时间试图用google-fu来抨击这一点,但我想不出如何创建一个非连续的联盟。
发布于 2011-12-06 21:51:31
正如Marcelo所指出的,C++既不是行主要的,也不是列主要的。它就是你所投入的东西。如果您将float
数组中的前四个值称为“列”,这是可以接受的。如果你称之为“行”,那也没问题。
通常,您不应该在约定之间来回切换。不要开发可以“两个都做”的结构;只需要选择一方并坚持使用它。如果你把你的矩阵设为行序,那么它们就是行序。当您将它们上传到OpenGL时,您可以手动转置它们,也可以只将GL_TRUE
作为glUniformMatrix
的“转置”参数。
更多细节are available。
https://stackoverflow.com/questions/8407058
复制