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


Sponsor:

#2 fastcall22   Crossbones+   -  Reputation: 4113

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?
c3RhdGljIGNoYXIgeW91cl9tb21bMVVMTCA8PCA2NF07CnNwcmludGYoeW91cl9tb20sICJpcyBmYXQiKTs=

#3 Shawn619   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 irreversible   Crossbones+   -  Reputation: 1233

Like
0Likes
Like

Posted 30 April 2013 - 01:38 AM

Is fog disabled?



#5 Shawn619   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 Shawn619   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 SuperVGA   Members   -  Reputation: 1118

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 Shawn619   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 SuperVGA   Members   -  Reputation: 1118

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 Shawn619   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 SuperVGA   Members   -  Reputation: 1118

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