Std140和std430布局的差异

ki0zmccv  于 2022-09-26  发布在  其他
关注(0)|答案(1)|浏览(771)

我在布局std140和std430之间的差异方面遇到了麻烦。

这是我在.cpp中的代码struct

struct Particle {
    glm::vec3 position = glm::vec3(0);
    float density = 1;
};

for (int z = 0; z < d; ++z) {
    for (int y = 0; y < d; ++y) {
        for (int x = 0; x < d; ++x) {
            int index = z * d * d + y * d + x;
            if (index >= num) break;

            // dam break
            m_InitParticles[index].position = glm::vec3(x, y, z) * distance;
            m_InitParticles[index].position += glm::vec3(getJitter(), getJitter(), getJitter());
            m_InitParticles[index].density = index;
        }
    }
}

和计算着色器代码

struct Particle {
    vec3 position;
    float density;
};
layout(std140, binding = 0) restrict buffer Particles{
    Particle particles[];
};

看起来我得到了正确的数据std430 data in renderdoc

pack#(std430) 
struct Particle {
    vec3 position;
    float t;
}

当我使用pack#(std140)时,该结构似乎有一个8N空间std140 in renderdoc

pack#(std430) 
struct Particle {
    vec3 position;
    float t;
}

对于std140,glGetActiveUniformsiv返回偏移量012

为什么struct vec + float会占用标准140中的额外空间?

5fjcxozz

5fjcxozz1#

官方OpenGL维基已经为您提供了覆盖范围:
OpenGL规范(OpenGL 4.5,第7.6.2.2节,第137页)很好地涵盖了std140布局的规则。其中最重要的一点是,类型数组不一定是紧密打包的。这样的块中的浮点数组不等同于C/C中的浮点数组。数组步长(数组元素之间的字节数)总是向上舍入为ve4的大小(即:16字节)。因此,只有当类型是16字节的倍数时,数组才会与其C/C定义匹配

**警告:**对于ve3组件,实现有时会得到错误的std140布局。建议您手动填充您的结构/数组,并完全避免使用ve3。

相关问题