簡體   English   中英

通過僅綁定一個統一塊來生成“ GL_INVALID_VALUE錯誤。”

[英]“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。對於每個程序0, index的輸出是0,但其中一個是4294967295。

不可能將統一塊緩沖區綁定到計算着色器。 這就是為什么使用計算着色器的着色器程序的索引輸出為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();
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM