Example Code: Difference between revisions
Jump to navigation
Jump to search
Example code index. |
|||
Line 1: | Line 1: | ||
This is a list of all of the example code used throughout the wiki. | This is a list of all of the example code used throughout the wiki. | ||
== Program | == Program Introspection == | ||
{{main|Program | {{main|Program Introspection}} | ||
{{:Example/Program Interface Non Block Uniforms}} | {{:Example/Program Interface Non Block Uniforms}} | ||
{{:Example/Program Interface Uniforms In Blocks}} | {{:Example/Program Interface Uniforms In Blocks}} |
Revision as of 03:38, 22 January 2013
This is a list of all of the example code used throughout the wiki.
Program Introspection
Main article: Program Introspection
Iteration over all non-block uniform variables, fetching their names, types, and locations:
GLint numUniforms = 0;
glGetProgramInterfaceiv(prog, GL_UNIFORM, GL_ACTIVE_RESOURCES, &numUniforms);
const GLenum properties[4] = {GL_BLOCK_INDEX, GL_TYPE, GL_NAME_LENGTH, GL_LOCATION};
for(int unif = 0; unif < numUniforms; ++unif)
{
GLint values[4];
glGetProgramResourceiv(prog, GL_UNIFORM, unif, 4, properties, 4, NULL, values);
// Skip any uniforms that are in a block.
if(values[0] != -1)
continue;
// 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[2]);
glGetProgramResourceName(prog, GL_UNIFORM, unif, nameData.size(), NULL, &nameData[0]);
std::string name(nameData.begin(), nameData.end() - 1);
}
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; ++blockIx)
{
GLint numActiveUnifs = 0;
glGetProgramResourceiv(prog, GL_UNIFORM_BLOCK, blockIx, 1, blockProperties, 1, NULL, &numActiveUnifs);
if(!numActiveUnifs)
continue;
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, blockUnifs[unifIx], 3, unifProperties, 3, 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);
}
}