我将统一缓冲区对象绑定到多个着色器时遇到了一些问题。
执行以下代码:
for(auto& shaderIter : shaderHandler.getShaderPrograms()){
shaderIter.second->bind();
GLuint programID = shaderIter.second->programId();
GLuint index = glFuncs->glGetUniformBlockIndex(programID, "MatrixUBO");
glFuncs->glUniformBlockBinding(programID, index, UBO_MATRICES_BINDING_POINT);
shaderIter.second->release();
}
导致错误消息
QOpenGLDebugMessage("APISource", 1281, "GL_INVALID_VALUE error generated. Uniform block index exceeds the maximum supported uniform buffers.", "HighSeverity", "ErrorType")
着色器程序的类型是QOpenGLShaderProgram。我使用这些着色器程序使用顶点,几何,片段和计算着色器。
GL_MAX_{VERTEX, FRAGMENT, GEOMETRY}_UNIFORM_BLOCKS
的值为14. index
的输出对于每个程序0除外,其中一个是4294967295。
答案 0 :(得分:0)
无法将统一块缓冲区绑定到计算着色器。这就是具有计算着色器的着色器程序的索引输出为4294967295的原因。
编辑:因为4294967295是GL_INVALID_INDEX的值。
我的观点中有两种可能的解决方案:
编辑:有可能获得与着色器程序相关的所有着色器的QList,并且可以检查每个着色器的类型。所以我将代码更改为以下内容,这对我有用。
for(auto& shaderProgramIter : shaderHandler.getShaderPrograms()){
bool isComputeShader = false;
for(auto& shaderIter : shaderProgramIter.second->shaders())
{
if(shaderIter->shaderType() == QOpenGLShader::Compute)
isComputeShader = true;
}
if(!isComputeShader)
{
shaderProgramIter.second->bind();
GLuint programID = shaderProgramIter.second->programId();
GLuint index = glFuncs->glGetUniformBlockIndex(programID, "MatrixUBO");
glFuncs->glUniformBlockBinding(programID, index, UBO_MATRICES_BINDING_POINT);
shaderProgramIter.second->release();
}
}