0

我正在尝试在一个 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 个块并且只打印“矩阵”块?

4

1 回答 1

4

确保您在着色器的其余部分中实际使用了该统一块。GLSL 编译器被允许、鼓励并且很可能从着色器中删除任何未使用的制服和属性。这就是为什么在此优化后生成的制服被称为“活动”制服的原因,以及为什么在着色器代码中声明但未以其他方式使用的制服可以(并且很可能会)在生成的可执行文件中消失的原因。

于 2013-06-06T18:45:15.110 回答