hi,
i am working on some scene graph glslang extension. so i depend somewhat on glPush/PopAttrib.
here a short code snip:
void setup1()
{
static float blue[4] = {0, 0, 1, 1};
glUseProgramObjectARB(_programObj1);
int colorpos = glGetUniformLocationARB(_programObj1, "color");
if (colorpos >= 0)
glUniform4fvARB(colorpos, 1, blue);
}
void setup2()
{
static float green[4] = {0, 1, 0, 1};
glUseProgramObjectARB(_programObj2);
int colorpos = glGetUniformLocationARB(_programObj2, "color");
if (colorpos >= 0)
glUniform4fvARB(colorpos, 1, green);
glBlendFunc(GL_ONE, GL_ONE);
glEnable(GL_BLEND);
glDepthFunc(GL_EQUAL);
glEnable(GL_DEPTH_TEST);
}
void draw()
{
glPushMatrix();
glRotatef(angl, 1,1,1);
glutSolidCube(2);
glPopMatrix();
}
void display()
{
glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);
glColor3f(1,0.5f,0.5f);
glPushAttrib(GL_CURRENT_BIT);
glPushAttrib(GL_ENABLE_BIT);
glPushAttrib(GL_TEXTURE_BIT);
glPushAttrib(GL_LIGHTING_BIT);
glPushAttrib(GL_COLOR_BUFFER_BIT);
glPushAttrib(GL_DEPTH_BUFFER_BIT);
glPushMatrix();
glTranslatef(-1.5,0,-5);
setup1();
draw();
setup2();
draw();
glPopMatrix();
//glUseProgramObjectARB(0);
glPopAttrib();
glPopAttrib();
glPopAttrib();
glPopAttrib();
glPopAttrib();
glPopAttrib();
glPushMatrix();
glTranslatef(1.5,0,-5);
draw();
glPopMatrix();
glutSwapBuffers();
angl += 0.3f;
}
where program1 and program2 are the same source, but i needed different programs:
fragment:
uniform vec4 color;
void main()
{
gl_FragColor = gl_Color*color;
}
vertex:
void main()
{
gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
gl_FrontColor = gl_Color;
}
the code above should render a red lighted cube on the right and some bright blueisch cube in the left. GL_LIGHT0 and GL_COLOR_MATERIAL enabled.
but, on ATi glSlang the lighting state isn’t recovered, so the right cube is only red without lighting (even when calling glUseProgramObject(0)).
also a problem is the recovery from before used program objects with bound uniforms. on nvidia drivers (61.12) it works fine to push a program object and use another with other uniforms on the same slots. when you pop the program object the old is bound with the previous uniforms. on ATi the uniforms aren’t reloaded. well i could find a way to live with that, but is this a bug or will this be solved in future releases.
please no flames about driver quality. i want to know what the right behavior should be. thx.