以“Column-Major”格式C ++访问类/联合数据

时间:2011-12-06 21:25:17

标签: c++ opengl matrix directx unions

最近我了解了数据类型的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来抨击它,但我无法弄清楚如何建立一个不连续的联盟。

1 个答案:

答案 0 :(得分:2)

正如Marcelo所指出的,C ++既不是行主要也不是列主要。这正是你所投入的。如果您将float数组中的前四个值称为“列”,那么就可以了。如果你把它称为“行”,那也可以。

通常,您不应在约定之间来回切换。不要开发能够做到“两者”的结构;只挑一边坚持下去。如果你的矩阵是行主要的,那么它们就是行专业。当您将它们上传到OpenGL时,您可以手动转置它们,或只是将GL_TRUE传递给glUniformMatrix的“转置”参数。

更多详情are available