【问题标题】:Use uniform buffer of uvec3[]使用 uvec3[] 的统一缓冲区
【发布时间】:2016-03-21 18:46:47
【问题描述】:

我有以下统一缓冲区:

uniform EDGE_ID_TO_START_POS{
    uint[12*3] pos;
} edgeIdToStartPos;

写入此缓冲区可以正常工作:

#define EDGE_ID_TO_START_POS_SIZE (12*3)
    const uint32_t edgeIdToStartPos_constBuffer[EDGE_ID_TO_START_POS_SIZE] = {
        /* 0*/ 0, 0, 0, /* 1*/ 0, 1, 0, /* 2*/ 1, 0, 0, /* 3*/ 0, 0, 0,
        /* 4*/ 0, 0, 1, /* 5*/ 0, 1, 1, /* 6*/ 1, 0, 1, /* 7*/ 0, 0, 1,
        /* 8*/ 0, 0, 0, /* 9*/ 0, 1, 0, /*10*/ 1, 1, 0, /*11*/ 1, 0, 0
    };
    glBindBuffer(GL_UNIFORM_BUFFER, ubo);
    glBufferData(GL_UNIFORM_BUFFER, EDGE_ID_TO_START_POS_SIZE * sizeof(uint32_t), edgeIdToStartPos_constBuffer, GL_STATIC_DRAW);
    glBindBuffer(GL_UNIFORM_BUFFER, 0);

现在我想将统一缓冲区更改为以下结构:

uniform EDGE_ID_TO_START_POS{
    uvec3[12] pos;
} edgeIdToStartPos;

这种结构更有意义,也更容易使用。它应该具有与以前版本相同的内存布局(?)。 但是,从这个结构中读取时,只有向量 0..3 包含数据。所有索引为 4 或更高的uvecs 都包含零。

为什么会发生这种情况,如何正确初始化这样的统一缓冲区? (C/C++, glew, glfw)

【问题讨论】:

    标签: opengl glsl


    【解决方案1】:

    uvec3 有 16 个字节的对齐方式,因此您必须添加填充。请参阅 OpenGL 4.5 规范,第 7.6.22 节:

    如果成员是一个三分量向量,其分量消耗 N 个基本机器单元,则基本对齐为 4N

    它的外观如下:

    static const int EDGE_ID_TO_START_POS_SIZE = 12 * 4;
    const uint32_t edgeIdToStartPos_constBuffer[EDGE_ID_TO_START_POS_SIZE] = {
        /* 0*/ 0, 0, 0, 0, /* 1*/ 0, 1, 0, 0, /* 2*/ 1, 0, 0, 0, /* 3*/ 0, 0, 0, 0,
        /* 4*/ 0, 0, 1, 0, /* 5*/ 0, 1, 1, 0, /* 6*/ 1, 0, 1, 0, /* 7*/ 0, 0, 1, 0,
        /* 8*/ 0, 0, 0, 0, /* 9*/ 0, 1, 0, 0, /*10*/ 1, 1, 0, 0, /*11*/ 1, 0, 0, 0,
    };
    

    【讨论】:

    • 这是你不应该在统一/存储块中使用任何类型的 vec3 的原因之一。
    • 这样写会有效吗(似乎可行):#define EDGE_ID_TO_DIRECTION_SIZE (12*3) const GLuvec3 edgeIdToDirection_constBuffer[12] = { /* 0*/ GLuvec3{ 0, 1, 0 }, /* 1*/ GLuvec3{ 1, 0, 0 }, ... }; With struct GLuvec3{GLuint x, y, z;};
    • @NicolBolas:我不相信vec3 是错误的,只要您知道填充...如果您使用vec4,您可能想知道第四个组件应该是什么用于,然后你必须记住它实际上只是一个vec3
    • @maja:没有GLuvec3这样的类型,我上次检查过。
    • @DietrichEpp 我自己制作了包含 3 个 GLuint 值的结构,这显然会导致相同的填充。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-23
    • 1970-01-01
    • 1970-01-01
    • 2012-06-02
    • 1970-01-01
    • 2022-11-20
    相关资源
    最近更新 更多