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   

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   Moderators   

9742
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?
zlib: eJzVVLsSAiEQ6/1qCwoK i7PxA/2S2zMOZljYB1TO ZG7OhUtiduH9egZQCJH9 KcJyo4Wq9t0/RXkKmjx+ cgU4FIMWHhKCU+o/Nx2R LEPgQWLtnfcErbiEl0u4 0UrMghhZewgYcptoEF42 YMj+Z1kg+bVvqxhyo17h nUf+h4b2W4bR4XO01TJ7 qFNzA7jjbxyL71Avh6Tv odnFk4hnxxAf4w6496Kd OgH7/RxC

#3   Members   

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   Members   

2589
Like
0Likes
Like

Posted 30 April 2013 - 01:38 AM

Is fog disabled?



#5   Members   

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   

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   

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   

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   

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   

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   

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   

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.