Consider the following code, which prints out the name of uniforms in a program:
Code :GLint numUniforms; glGetProgramiv(program, GL_ACTIVE_UNIFORMS, &numUniforms); std::cout << "Num uniforms: " << numUniforms << "\n"; for(int ix = 0; ix < numUniforms; ++ix) { GLint length; glGetActiveUniformsiv(program, 1, (GLuint*)&ix, GL_UNIFORM_NAME_LENGTH, &length); std::vector<GLchar> str(length); glGetActiveUniformName(program, ix, length, NULL, &str[0]); std::string name(str.begin(), str.end()); std::cout << ix << ":\t" << name << "\n"; }
Now considering the following Vertex Shader:
Code :#version 330 uniform BlockName { float a_name; } instance_name; uniform float a_name; in vec3 position; void main() { gl_Position.xyz = position.xyz * a_name * instance_name.a_name; gl_Position.w = 1.0; }
If the fragment shader has no other uniforms, we would expect to see 2 uniforms come out of this code. And on both NVIDIA and AMD drivers, I do. The problem is what they're named.
On AMD, they're called "a_name" and "instance_name.a_name". On NVIDIA, they're called "a_name" and "BlockName.a_name".
I'm fairly sure NVIDIA is correct here, but I can't say that they are because... the actual OpenGL spec does not say. Or if it does, I certainly can't find it.
So one of them is wrong. Or maybe both are. I don't know. Does anyone know? Will the ARB ever bother clarifying it?