我的顶点着色器代码在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清零了?
谢谢。
我最终使用了glMapBuffer而不是glBufferSubData,并使用了动态绑定而不是本页中描述的硬编码绑定它有效!