OpenGL - Unable to render colors other than white

2019-07-28 17:55发布

问题:

I'm trying to render a colored cube after rendering other cubes that have textures. I have multiple "Drawer" objects that conform to the Drawer interface, and I pass each a reference to the GL object to the draw( final GL gl ) method of each individual implementing class. However, no matter what I do, I seem unable to render a colored cube.

Code sample:

gl.glDisable(GL.GL_TEXTURE_2D);

gl.glColor3f( 1f, 0f, 0f );
gl.glBegin(GL.GL_QUADS);
// Front Face
Point3f point = player.getPosition();

gl.glNormal3f(0.0f, 0.0f, 1.0f);
//gl.glTexCoord2f(0.0f, 0.0f);

gl.glVertex3f(-point.x - 1.0f, -1.0f, -point.z + 1.0f);
//gl.glTexCoord2f(1.0f, 0.0f);

gl.glVertex3f(-point.x + 1.0f, -1.0f, -point.z + 1.0f);
//continue rendering rest of cube. ...
gl.glEnd();
gl.glEnable(GL.GL_TEXTURE_2D);

I've also tried throwing the glColor3f calls before each vertex call, but that still gives me a white cube. What's up?

回答1:

There are a few things you need to make sure you do.

First off:

gl.glEnable(gl.GL_COLOR_MATERIAL);

This will let you apply colors to your vertices. (Do this before your calls to glColor3f.)

If this still does not resolve the problem, ensure that you are using blending properly (if you're using blending at all.)

For most applications, you'll probably want to use

gl.glEnable(gl.GL_BLEND);
gl.glBlendFunc(gl.GL_SRC_ALPHA,gl.GL_ONE_MINUS_SRC_ALPHA);

If neither of these things solve your problem, you might have to give us some more information about what you're doing/setting up prior to this section of your code.



回答2:

If lighting is enabled, color comes from the material, not the glColor vertex colors. If your draw function that you mentioned is setting a material for the textured objects (and a white material under the texture would be common) then the rest of the cubes would be white. Using GL_COLOR_MATERIAL sets up OpenGL to take the glColor commands and update the material instead of just the vertex color, so that should work.

So, simply put, if you have lighting enabled, try GL_COLOR_MATERIAL.



回答3:

One thing you might want to try is: glBindTexture(GL_TEXTURE_2D, 0); to bind the texture to nil.



回答4:

Some things to check:

  • Is there a shader active?
  • Any gl-errors?
  • What other states did you change? For example GL_COLOR_MATERIAL, blending or lighting will change the appearance of your geometry.
  • Does it work if you draw the non-textured cube first? And if it does try to figure out at which point it turns white. It's also possible that the cube will only show up in the correct color in the first frame, then there's definitely a GL state involved.
  • Placing glPushAttrib/glPopAttrib at the beginning/end of your drawing methods might help, but it's better to figure out what caused the problem in the first place.


标签: java opengl jogl