"GL_INVALID_VALUE error generated."仅绑定一个统一块
"GL_INVALID_VALUE error generated." by binding just one Uniform Block
我在将统一缓冲区对象绑定到多个着色器时遇到了一些问题。
执行以下代码:
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的程序。
无法将统一块缓冲区绑定到计算着色器。这就是使用计算着色器的着色器程序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();
}
}
相关文章:
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 运行同一解决方案的另一个项目的项目
- 挂起和取消挂起一个文件DLL
- 用C++中的一个变量定义一个常量
- 函数向量_指针有不同的原型,我可以构建一个吗
- 在c++中用vector填充一个简单的动态数组
- 如何在选项卡视图Qt中设置一个新项目,并保存以前的项目
- 预处理器:插入结构名称中的前一个行号
- 我在c++代码中生成了一个运行时#3异常
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- 从链接列表c++中删除一个项目
- 告诉一个 const char 数组,除了编译时 C 样式的字符串外,它不以 '