c++ - 以 "Column-Major"格式访问类/union 数据 C++

标签 c++ opengl matrix directx unions

最近我了解了数据类型的 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/

相关文章:

c++ - 如何比较 std::map 中的所有项目?

java - LWJGL - 文本颜色改变背景颜色

Matlab 向量乘以元胞数组

r - 行的累积和直至选择行号,然后对 R 中的列矩阵求和

c++ - 存储表达式模板仿函数

c++ - SetCheck 用于多个按钮或使用转换字符串来定义

java - 集合与容器的区别

java - 向上或向下看时 LookAt 矩阵会变形

delphi - OpenGL 中的奇怪行为

r - 用项目共存频率构建一个稀疏矩阵(用于分析产品的交叉销售)