3D draw colors bleed into 2D draw colors

Started by
10 comments, last by Shawn619 11 years ago

When I draw things in 3D perspective, which contains green lighting, it bleeds into my 2D ortho drawings.

In this picture, I draw my 3d scene on the large left-side viewport, and draw my 2d scene on the smaller right-side viewport(which contains a 2d red triangle):

(you can see the full red triangle has been tainted with green colors from previous 3d drawings)

2mgtwci.jpg

This is my drawing structure:


//start 3d drawing
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glViewport(0, 0, windowWidth/1.3, windowHeight);
glClearColor(0,0.5,0.5,0);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(60.0, (float)windowWidth / (float)windowHeight, 0.4, 9000.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glEnable(GL_DEPTH_TEST);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glEnable(GL_NORMALIZE);
glEnable(GL_COLOR_MATERIAL);
 
//draw 3d primitives + model and view transforms
 
//2D drawing
glClear(GL_DEPTH_BUFFER_BIT);
glViewport(windowWidth/1.3, 0, windowWidth, windowHeight);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0.0f, windowWidth, windowHeight, 0.0f, 0.0f, 1.0f);
glDisable(GL_DEPTH_TEST);
glDisable(GL_CULL_FACE);
glDisable(GL_TEXTURE_2D);
glDisable(GL_LIGHTING);
 
//draw red triangle
glPushMatrix();
    glColor3f(1.0f, 0.0f, 0.0f);
    glBegin(GL_TRIANGLES); 
        glVertex3f(0.0f, 0.0f, 0.0f); 
        glVertex3f(20.0f, 20.0f, 0.0f);
        glVertex3f(70.0f, 20.0f, 0.0f);
    glEnd(); 
glPopMatrix();
 
//swap buffers
glutSwapBuffers();
 
Advertisement
A wild guess, but I see a glEnable/glDisable pair for every OpenGL state except GL_COLOR_MATERIAL. Perhaps your 2d triangles are inheriting your 3d object's green material color?

That's a good guess, and I thought that would work, but it had no effect.

The only green material that is given off is from my light[0] in 3d drawing. Your post made me think of also doing "glDisable(GL_LIGHT0)", but even that had no effect.

Is fog disabled?

I don't use fog in my game, but I tried disabling it anyways, and it didn't work.

(see latest post)

Remember to

glUseProgram(0);
To properly disable the shader.

I'm uncertain with regard to what glDeleteProgram does on its own, but I really doubt that you need to call it every frame...

Solved!

Thanks superVGA, I had the concept of disableing and deleteing a shader confused.

I forgot to include the fact that I used glUseProgram, so disableing the shader before drawing 2d by calling glUseProgram(0) fixed my problem.

One last question though, how is it that i'm able to

glDisable(GL_LIGHTING);
glDisable(GL_LIGHT0);
glUseProgram(shaderOne);

yet my shader still works? Is it because GL_LIGHTING only pertains to OpenGL's fixed-function lighting, and not to GLSL shaders?

Exactly. AFAIK there's no fixed functionality once you enable a shader meant to output or change that purpose.
As such, you can still have fixed function fragments if you're only using a vertex shader.
You can still get vertex lightning if you leave the pipeline alone, but I honestly don't know where that is ultimately computed.

Oh ok, if the shader effectively "cuts off" fixed-function communication, then will


GLfloat specular[] = {1.0, 1.0, 1.0, 1.0};
glLightfv(GL_LIGHT2, GL_SPECULAR, specular);

still be passed into the shader, so I can access it like so:


gl_LightSource[2].specular

?

This topic is closed to new replies.

Advertisement