最近我了解了数据类型的 union 存储说明符 - 它特别适用于 OpenGL/DirectX 转换矩阵使用,因为我不想继续使用已弃用的 gluLookAt、gluOrtho 和固定的各种 MatrixStack 函数-函数流水线。这太棒了,我最近在创建 4x4 基本转换矩阵类时获得了很多乐趣,它的内部数据是 union 打包的,以允许以不同的方式访问矩阵中的数据。问题是当我想创建一种按列聚合/访问数据的方法时,而不必做一些奇怪的事情
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 来解决这个问题,但我不知道如何创建一个非连续的 union 。
最佳答案
正如 Marcelo 所指出的,C++ 既不是行优先也不是列优先。这正是您放入其中的内容。如果您将 float
数组中的前四个值称为“列”,就可以了。如果您将其称为“行”,也可以。
通常,您不应在约定之间来回切换。不要开发可以做到“两者”的结构;只需选择一个方面并坚持下去。如果你让你的矩阵成为行优先的,那么它们就是行优先的。当您将它们上传到 OpenGL 时,您可以手动转置它们或只为 glUniformMatrix
的“转置”参数传递 GL_TRUE
.
更多详情 are available .
关于c++ - 以 "Column-Major"格式访问类/union 数据 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8407058/