GLSL 4.50弄乱了我的Shader存储缓冲区对象

时间:2015-02-27 22:53:01

标签: opengl glsl shader vertex-shader opengl-4

我的顶点着色器代码在GLSL 4.30中工作正常但在升级到GLSL 4.50之后,它似乎无法从SSBO中读取值。 以下是将数据卸载到缓冲区的代码:

glBindBuffer(GL_SHADER_STORAGE_BUFFER, buf_plumeX);
glBufferSubData(GL_SHADER_STORAGE_BUFFER, 0, sizeof(GLFrame->PlumeSetP->plX), GLFrame->PlumeSetP->plX);
glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 7, buf_plumeX);

glBindBuffer(GL_SHADER_STORAGE_BUFFER, buf_plumeY);
glBufferSubData(GL_SHADER_STORAGE_BUFFER, 0, sizeof(GLFrame->PlumeSetP->plY), GLFrame->PlumeSetP->plY);
glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 6, buf_plumeY);

glBindBuffer(GL_SHADER_STORAGE_BUFFER, buf_plumeZ);
glBufferSubData(GL_SHADER_STORAGE_BUFFER, 0, sizeof(GLFrame->PlumeSetP->plZ), GLFrame->PlumeSetP->plZ);
glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 5, buf_plumeZ);

在着色器中,我使用以下代码读取这些缓冲区:

layout ( std140, binding = 7) buffer PlumeBufferX {
float plumeX[];
};

layout ( std140, binding = 6) buffer PlumeBufferY {
float plumeY[];
};

layout ( std140, binding = 5) buffer PlumeBufferZ {
float plumeZ[];
};

我计算一个偏移并获取该特定偏移处的数据:

vec3 p = vec3(plumeX[offset], plumeY[offset], plumeZ[ offset] );

现在无论我如何计算基于此p位置渲染点的偏移量,看起来它们都在零值附近! 我确信这不是我用GLSL 4.30获得的行为,因为我录制了我的渲染视频。 知道是什么导致了这个问题,为什么我的SSBO被GLSL 4.50清零了?

感谢。

1 个答案:

答案 0 :(得分:0)

我最终使用glMapBuffer而不是glBufferSubData,并使用动态绑定而不是this page中描述的硬编码绑定 它有效!