Search code examples
c++alignmentglslvulkanssbo

Unexpeced value upon accessing an SSBO float


I am trying to calculate a morph offset for a gpu driven animation.

To that effect I have the following function (and SSBOS):

layout(std140, binding = 7) buffer morph_buffer
{
   vec4 morph_targets[];
};

layout(std140, binding = 8) buffer morph_weight_buffer
{
   float morph_weights[];
};

vec3 GetMorphOffset()
{
    vec3 offset = vec3(0);
    for(int target_index=0; target_index < target_count; target_index++)
    {
        float w1 = morph_weights[1];
        offset += w1 * morph_targets[target_index * vertex_count + gl_VertexIndex].xyz;
    }
   return offset;
}

I am seeing strange behaviour so I opened renderdoc to trace the state:

enter image description here

As you can see, index 1 of the morph_weights SSBO is 0. However if I step over in the built in debugger for renderdoc I obtain:

enter image description here

Or in short, the variable I get back is 1, not 0.

So I did a little experiment and changed one of the values and now the SSBO looks like this:

enter image description here

And now I get this:

enter image description here

So my SSBO of type float is being treated like an ssbo of vec4's it seems. I am aware of alignment issues with vec3's, but IIRC floats are fair game. What is happenning?


Solution

  • Upon doing a little bit of asking around.

    The issue is the SSBO is marked as std140, the correct std for a float array is std430.

    For the vulkan GLSL dialect, an alternative is to use the scalar qualifier.