GLSL,多个统一块

时间:2013-06-06 18:24:18

标签: opengl glsl

我正在尝试在一个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个块而只打印“矩阵”块?这可能是什么原因?

1 个答案:

答案 0 :(得分:4)

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

相关问题