繁体   English   中英

以“列优先”格式C ++访问类/联合数据

[英]Accessing Class / Union Data in “Column-Major” Format C++

最近,我了解了用于数据类型的联合存储说明符-它特别适用于OpenGL / DirectX转换矩阵,因为我不想继续使用固定功能管道中已弃用的gluLookAt,gluOrtho和各种MatrixStack函数。 真是太棒了,最近我创建4x4基本Transformation Matrix类非常有趣,该类的内部数据经过联合打包,以允许使用不同的方式访问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或col [0] .c(c是整个列的float [4])访问列。 但是,如果要为了实现更大的列访问公正而牺牲这一理想(尽管倾向于非功能,因为我可以使用特殊的结构和功能来实现它。这比访问不那么方便,也有点慢)直接通过数据成员获取数据)。

我花了很多时间试图用google-fu来打击它,但是我不知道如何建立一个不连续的联合。

正如Marcelo指出的那样,C ++既不是行优先的,也不是列优先的。 它只是您输入的内容。 如果将float数组中的前四个值称为“列”,则可以。 如果您称其为“行”,那么也可以。

通常,您不应在约定之间来回切换。 不要开发可以“两全其美”的结构; 只需选择一面并坚持下去。 如果您将矩阵设为行主要,则它们为行主要。 当你将它们上传到OpenGL,则可以手动调换他们或者只是通过GL_TRUE为的“变调”参数glUniformMatrix

提供更多详细信息

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM