Jump to content

  • Log In with Google      Sign In   
  • Create Account

3D draw colors bleed into 2D draw colors


Old topic!

Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.


  • You cannot reply to this topic
11 replies to this topic

#1   Members   -  Reputation: 342

Like
0Likes
Like

Posted 29 April 2013 - 07:49 PM

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();
 


#2   Crossbones+   -  Reputation: 9185

Like
1Likes
Like

Posted 29 April 2013 - 09:14 PM

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?

gzip: H4sIAAAAAAAEAG1QTUvEMBC991e8nvaiFfYoS7yo sLCo6MnjtJ1ugmkiyWRL/72z3T1YEQIJ8z4zA2Xp yPvt1qBpGrRFIJZkk9FyRyUzHCbKIHgn4hnZOrm1 TD0mG0HCCs+QGDGWziKXI6Wm2n++GYwUVH2mrGEE PnGCVQ8K8+JYfXA6URDEQfMZh5h6g5eoAlWJdeEI bbH2qYZf7XMUfw8f/Q0oMeZYNL9/WHF0uFEshvMr XYujd9SycFb+F18QcSOvlJauZ8ejqevdnV7/d550 e0t6prmunh73Bu+vz4c/XUeOQXfJgvKNkhf95U8/ Dtgmy5IBAAA=


#3   Members   -  Reputation: 342

Like
0Likes
Like

Posted 29 April 2013 - 10:22 PM

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.



#4   Crossbones+   -  Reputation: 2492

Like
0Likes
Like

Posted 30 April 2013 - 01:38 AM

Is fog disabled?



#5   Members   -  Reputation: 342

Like
0Likes
Like

Posted 30 April 2013 - 09:18 AM

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



#6   Members   -  Reputation: 342

Like
0Likes
Like

Posted 30 April 2013 - 02:28 PM

(see latest post)


Edited by Shawn619, 30 April 2013 - 02:51 PM.


#7   Members   -  Reputation: 1132

Like
1Likes
Like

Posted 30 April 2013 - 02:45 PM

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...

#8   Members   -  Reputation: 342

Like
0Likes
Like

Posted 30 April 2013 - 02:52 PM

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?



#9   Members   -  Reputation: 1132

Like
0Likes
Like

Posted 30 April 2013 - 02:59 PM

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.

#10   Members   -  Reputation: 342

Like
0Likes
Like

Posted 30 April 2013 - 03:09 PM

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

?


Edited by Shawn619, 30 April 2013 - 03:09 PM.


#11   Members   -  Reputation: 1132

Like
0Likes
Like

Posted 30 April 2013 - 03:12 PM

Yes you can. :)
I've only done it once, but this article explains what you want to do:
http://www.opengl.org/sdk/docs/tutorials/ClockworkCoders/lighting.php

It's only the output that you cut off. Some shader versions require explicit declaration of the valid inputs however, so you may have to write that too, somewhere.

#12   Members   -  Reputation: 342

Like
0Likes
Like

Posted 30 April 2013 - 03:23 PM

Thanks a lot, that makes sense now! :)






Old topic!

Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.




PARTNERS