首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >访问“列-主要”格式的C++中的类/联合数据

访问“列-主要”格式的C++中的类/联合数据
EN

Stack Overflow用户
提问于 2011-12-07 05:25:17
回答 1查看 518关注 0票数 1

最近,我了解了数据类型的Union存储说明符-它特别适用于OpenGL / DirectX转换矩阵,因为我不想继续使用固定函数管道中不推荐使用的gluLookAt、gluOrtho和各种MatrixStack函数。它非常棒,我最近创建了4x4基本转换矩阵类,它的内部数据是联合打包的,以允许以不同的方式访问矩阵中的数据。问题是,当我想要创建一种按列聚合/访问数据的方法时,而不必做一些奇怪的事情

代码语言:javascript
代码运行次数:0
运行
复制
float* Column(int index);

函数。我知道C++以行为主的形式存储数据,那么如何提供列访问呢?这里有?在我下面的矩阵数据声明中,我在哪里迷路了。

代码语言:javascript
代码运行次数:0
运行
复制
//#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来抨击这一点,但我想不出如何创建一个非连续的联盟。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-12-07 05:51:31

正如Marcelo所指出的,C++既不是行主要的,也不是列主要的。它就是你所投入的东西。如果您将float数组中的前四个值称为“列”,这是可以接受的。如果你称之为“行”,那也没问题。

通常,您不应该在约定之间来回切换。不要开发可以“两个都做”的结构;只需要选择一方并坚持使用它。如果你把你的矩阵设为行序,那么它们就是行序。当您将它们上传到OpenGL时,您可以手动转置它们,也可以只将GL_TRUE作为glUniformMatrix的“转置”参数。

更多细节are available

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8407058

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档