【问题标题】:GLSL, multiple uniform blocksGLSL,多个统一块
【发布时间】:2013-06-07 02:45:15
【问题描述】:

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

【问题讨论】:

    标签: opengl glsl


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多