Example/Program Interface Uniforms In Blocks

From OpenGL.org
< Example
Revision as of 10:27, 8 August 2013 by Alfonse (Talk | contribs) (Fixed small code bug.)

Jump to: navigation, search

Iteration over all uniforms within each uniform block.

GLint numBlocks = 0;
glGetProgramInterfaceiv(prog, GL_UNIFORM_BLOCK, GL_ACTIVE_RESOURCES, &numBlocks );
const GLenum blockProperties[1] = {GL_NUM_ACTIVE_VARIABLES}
const GLenum activeUnifProp[1] = {GL_ACTIVE_VARIABLES}
const GLenum unifProperties[3] = {GL_NAME_LENGTH​, GL_TYPE​, GL_LOCATION};
for(int blockIx = 0; blockIx < numBlocks; ++numBlocks)
  GLint numActiveUnifs = 0;
  glGetProgramResourceiv(prog, GL_UNIFORM_BLOCK, blockIx, 1, blockProperties, 1, NULL, numActiveUnifs);
  std::vector<GLint> blockUnifs(numActiveUnifs);
  glGetProgramResourceiv(prog, GL_UNIFORM_BLOCK, blockIx, 1, activeUnifProp, numActiveUnifs, NULL, &blockUnifs[0]);
  for(int unifIx = 0; unifIx < numActiveUnifs; ++unifIx)
    GLint values[3];
    glGetProgramResourceiv(prog, GL_UNIFORM, unifIx, 3, unifProperties, 4, NULL, values);
    //Get the name. Must use a std::vector rather than a std::string for C++03 standards issues.
    //C++11 would let you use a std::string directly.
    std::vector<char> nameData(values[0]);
    glGetProgramResourceName(prog, GL_UNIFORM, blockUnifs[unifIx], nameData.size(), NULL, &nameData[0]);
    std::string name(nameData.begin(), nameData.end() - 1);