C++ OpenGL为计算着色器设置SSBO
我一直无法将数据发送到SSBO以供计算着色器使用。不幸的是,和我不能使他们的示例代码工作,人们似乎做了非常轻微的不同的事情-有人能帮忙吗 (我已经删掉了我所写的代码中我认为不相关的其他部分-。以下是我迄今为止得到的: 使用某些数据初始化SSBOC++ 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
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));
}