如何在OpenGL中为std430布局正确填充和对齐数据

时间:2014-05-13 10:03:28

标签: c++ opengl glsl

在Shader存储对象中使用它时,我无法使用以下结构:

着色器中的定义:

struct Object
{
    vec4                color;
    mat3                transform;
    float               depth;
    float               pObjIndex;
    //float align1;
    //float align2;
};

layout (std430, binding = 0) buffer Objects
{
  Object objects[];
};

我的理解是,对象结构在GLSL中由其最大成员(即vec4,即16字节边界)对齐。 (mat3被视为vec3的3元素数组,并以12字节边界对齐)。 vec4,mat3和2浮点数为72个字节。当我将结构填充到最近的16字节倍数 - 80 - 有两个浮点数时,它没有正常工作,就像没有填充一样。

此结构的两种变体布局 - 带有2个浮点数的填充且没有任何填充 - 不正确吗?

1 个答案:

答案 0 :(得分:3)

mat3实际上是3 vec4 s,因为每个vec3是3个浮点数,与16个字节对齐(或者至少它不能跨越16个字节的边界)

struct Object
{
    float[4]           color;
    float[4][3]         transform;
    float           depth;
    float           pObjIndex;
    //float align1;
    //float align2;
};