Greetings:
I would like to set up a light properties structure in the vertex shader - something like
struct Light
{
uniform vec4 ambientColors;
etc.
};
and then specify a light in the shader
Light light0;
Finally, I want to assign light properties from within the app program with
glGetUniformLocation(programId, "light0.ambientColors");
etc.
But this doesn’t work. It seems the uniform declaration of a structure member isn’t acceptable. Is this the case or am I missing something?
Thanks,
Sam
Remember: a struct doesn’t define variables; it is just a prototype.
struct Foo
{
int bar;
};
Foo stuff;
Using C++ lingo Foo::bar
is a non-static member of the class Foo
. It therefore does not name a variable. However, stuff.bar
is a variable. It’s the use of a prototype that creates variables.
Uniforms are first and foremost variables. Therefore, a uniform cannot be inside of a prototype definition.
However, a uniform’s type can be a struct:
struct Foo
{
int bar;
};
uniform Foo stuff;
stuff.bar
is now a uniform variable. It has a specific uniform location. See the OpenGL Wiki for further details.
Thank you, Alfonse. That clears it up totally.