0

ユニフォーム バッファ オブジェクトを複数のシェーダにバインドする際に問題があります。

次のコードの実行:

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、4294967295 のプログラムを除いて、各プログラム 0 です。

4

1 に答える 1

0

均一なブロック バッファーを計算シェーダーにバインドすることはできません。これが、計算シェーダーを使用したシェーダー プログラムの index の出力が 4294967295 である理由です。

編集: 4294967295 は GL_INVALID_INDEX の値であるためです。

私の意見では、2 つの可能な解決策があります。

  1. シェーダー プログラムのリストを 2 つの部分に分けます。1 つ目はすべてのレンダリング シェーダー用で、2 つ目はすべてのコンピューティング シェーダー用です。その後、レンダリングのものを繰り返します。
  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();
    }
}
于 2015-01-06T16:38:57.727 に答える