【问题标题】:"GL_INVALID_VALUE error generated." by binding just one Uniform Block“生成了 GL_INVALID_VALUE 错误。”通过绑定一个统一块
【发布时间】:2015-01-06 16:38:57
【问题描述】:

我在将统一缓冲区对象绑定到多个着色器时遇到了一些问题。

以下代码的执行:

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 的程序。

【问题讨论】:

    标签: c++ qt opengl shader compute-shader


    【解决方案1】:

    无法将统一块缓冲区绑定到计算着色器。这就是带有计算着色器的着色器程序的 index 输出为 4294967295 的原因。

    编辑:因为 4294967295 是 GL_INVALID_INDEX 的值。

    我认为有两种可能的解决方案:

    1. 将着色器程序列表分为两部分。第一个用于所有渲染着色器,第二个用于所有计算着色器。之后,只需迭代渲染的。
    2. 询问每个着色器是否是计算着色器,然后只为渲染着色器进行绑定。但我不知道如果它是渲染或计算着色器,是否有可能访问这些信息。

    编辑:有可能获得与着色器程序相关的所有着色器的 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();
        }
    }
    

    【讨论】:

    • 顺便说一句,这并不是输出值的真正含义(至少不是应该如何解释)。这实际上是统一缓冲区对象扩展引入的GL_INVALID_INDEX
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-25
    • 1970-01-01
    • 1970-01-01
    • 2017-12-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多