0

1 つの GLSL シェーダーで複数のユニフォーム ブロックを使用しようとしています。次のコードを使用してシェーダーをデバッグし、利用可能なユニフォーム ブロックを出力します。

void printUniformBlocks(void)
{
    GLint numBlocks;
    GLint nameLen;

    vector<string> nameList;

    glGetProgramiv(this->program, GL_ACTIVE_UNIFORM_BLOCKS, &numBlocks);
    nameList.reserve(numBlocks);

    cout << "found " << numBlocks << " block in shader" << endl;

    for (int blockIx = 0; blockIx < numBlocks; blockIx++) {
        glGetActiveUniformBlockiv(this->program, blockIx, GL_UNIFORM_BLOCK_NAME_LENGTH, &nameLen);

        vector<GLchar> name; 
        name.resize(nameLen);
        glGetActiveUniformBlockName(this->program, blockIx, nameLen, NULL, &name[0]);

        nameList.push_back(std::string());
        nameList.back().assign(name.begin(), name.end() - 1); //Remove the null terminator.

    }

    for (unsigned int il = 0; il < nameList.size(); il++) {
        cout << "Block name: " << nameList[il] << endl;
    }

}

私のシェーダーには次のものがあります

layout(std140) uniform Matrices {
    mat4 model[16];
};


layout(std140) uniform Matrices2 {
    mat4 model2[16];
};
.....

これがシェーダーで 1 つのブロックのみを報告し、「Matrices」ブロックのみを出力する理由は何でしょうか?

4

1 に答える 1

4

シェーダーの残りの部分で実際にその均一なブロックを使用していることを確認してください。GLSL コンパイラは、未使用のユニフォームと属性をシェーダーから削除することが許可され、奨励されており、かなり可能性が高いです。これが、この最適化の後に生成されるユニフォームが「アクティブな」ユニフォームと呼ばれる理由であり、シェーダー コード内で宣言されているがそれ以外の方法で使用されていないユニフォームが結果の実行可能ファイルで消える可能性がある (そしておそらくそうなる) 理由です。

于 2013-06-06T18:45:15.110 に答える