C++ OpenGL为计算着色器设置SSBO

C++ OpenGL为计算着色器设置SSBO,c++,opengl,graphics,opengl-4,C++,Opengl,Graphics,Opengl 4,我一直无法将数据发送到SSBO以供计算着色器使用。不幸的是,和我不能使他们的示例代码工作,人们似乎做了非常轻微的不同的事情-有人能帮忙吗 (我已经删掉了我所写的代码中我认为不相关的其他部分-。以下是我迄今为止得到的: 使用某些数据初始化SSBO std::vector<glm::vec4> data = { glm::vec4(1.0, 0.0, 0.0, 1.0), glm::vec4(1.0, 0.0, 0.0, 1.0) }; GLuint SSBO; glGenBuffer

我一直无法将数据发送到SSBO以供计算着色器使用。不幸的是,和我不能使他们的示例代码工作,人们似乎做了非常轻微的不同的事情-有人能帮忙吗

(我已经删掉了我所写的代码中我认为不相关的其他部分-。以下是我迄今为止得到的:

使用某些数据初始化SSBO

std::vector<glm::vec4> data = { glm::vec4(1.0, 0.0, 0.0, 1.0), glm::vec4(1.0, 0.0, 0.0, 1.0) };

GLuint SSBO;
glGenBuffers(1, &SSBO);
glBindBuffer(GL_SHADER_STORAGE_BUFFER, SSBO);
glBufferData(GL_SHADER_STORAGE_BUFFER, data.size() * sizeof(glm::vec4), &data[0], GL_DYNAMIC_DRAW);

//the khronos docs put this line in
//glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 1, SSBO);

glBindBuffer(GL_SHADER_STORAGE_BUFFER, 0);
计算着色器

#version 430 core

layout(binding = 0, rgba16f) uniform image2D outTexture;

layout(std430, binding = 1 ) readonly buffer bufferData
{
    vec4 data[];
};

layout (local_size_x = 16, local_size_y = 8) in;
void main(void) {
    ivec2 px = ivec2(gl_GlobalInvocationID.xy);
    ivec2 size = imageSize(outTexture);

    vec3 color;
    if(data.length() > 0)
    {
        //green = data
        color = vec3(0.2, 0.6, 0.2);
    } else
    {
        //red = bad
        color = vec3(0.6, 0.2, 0.2);
    }

    imageStore(outTexture, px, vec4(color, 1.0));
}
当前我的屏幕显示红色,表示没有通过SSBO发送数据

编辑:


发现问题。计算着色器中的.length()方法不起作用。

我在计算着色器中发现问题


.length()返回了错误的值。我查询了数据[0]和数据[1],它们在计算着色器中返回了正确设置的值-因此这就是问题所在(但我不一定有解决方案)

我在计算着色器中发现了问题

.length()返回了错误的值。我查询了数据[0]和数据[1],它们在计算着色器中返回了正确设置的值-所以这就是问题所在(但我不一定有解决方案)

#version 430 core

layout(binding = 0, rgba16f) uniform image2D outTexture;

layout(std430, binding = 1 ) readonly buffer bufferData
{
    vec4 data[];
};

layout (local_size_x = 16, local_size_y = 8) in;
void main(void) {
    ivec2 px = ivec2(gl_GlobalInvocationID.xy);
    ivec2 size = imageSize(outTexture);

    vec3 color;
    if(data.length() > 0)
    {
        //green = data
        color = vec3(0.2, 0.6, 0.2);
    } else
    {
        //red = bad
        color = vec3(0.6, 0.2, 0.2);
    }

    imageStore(outTexture, px, vec4(color, 1.0));
}