多纹理使整个场景变暗!

时间:2011-06-29 20:10:35

标签: opengl alphablending multitexturing

我使用3个四边形A,B和C实现了一个场景。四个C位于四边形B后面。四边形B位于四A顶部。

所有四边形都使用相同的纹理,但Quad B除外。四边形B使用alpha贴图和所有其他Quads正在使用的基本纹理。

下面的代码示例是我如何使用固定功能多纹理绘制Quad B.

GLuint alphaGLTexture; 
SDL_SurfaceToGLTexture(aTexture, &alphaGLTexture);

GLuint baseGLTexture;
SDL_SurfaceToGLTexture(baseTexture, &baseGLTexture);

glActiveTexture(GL_TEXTURE0);
glEnable(GL_TEXTURE_2D);
glBindTexture (GL_TEXTURE_2D, alphaGLTexture);

glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB, GL_TEXTURE);
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_REPLACE);

glActiveTexture(GL_TEXTURE1);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, baseGLTexture); 

glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB, GL_PREVIOUS);
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE2_RGB, GL_TEXTURE);
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB, GL_ALPHA);
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_MODULATE);

glTranslatef(0.0f, 0.0f, 0.0f);

double u_coord = 0.0f, v_coord = 0.0f;

// Renders Quad B
glActiveTexture(GL_TEXTURE0)
glBegin(GL_QUADS);

// remainder of code modifies u_coord, v_coord and draws the other glVertex3f's.
glMultiTexCoord2f(GL_TEXTURE0, u_coord, v_coord);
glMultiTexCoord2f(GL_TEXTURE1, u_coord, v_coord);
glVertex3f(posax, posay, posaz);

当我将多纹理alpha贴图应用于Quad B时,纹理四边形A和C会改变颜色并最终比Quad B更暗。

当我删除对GL_TEXTURE1的任何提及时,所有内容都很好地渲染,没有变暗,但是我在Quad B上丢失了alpha映射。

任何建议或提示?我的glTexEnvi电话有问题吗?

3 个答案:

答案 0 :(得分:1)

您需要禁用所有纹理单元,以便所有纹理都不会影响场景的其余部分。根据代码的外观,您可能只是忘记跟踪您的状态。

添加

glActiveTexture(GL_TEXTURE0);
glDisable(GL_TEXTURE_2D); // or whatever texture target used

glActiveTexture(GL_TEXTURE1);
glDisable(GL_TEXTURE_2D); // or whatever texture target used

glActiveTexture(GL_TEXTURE…);
glDisable(GL_TEXTURE_2D); // or whatever texture target used

答案 1 :(得分:0)

如果您没有将其用于其他四边形,请尝试禁用纹理单元1:

// draw Quad B
....

glActiveTexture(GL_TEXTURE0);
glEnable(GL_TEXTURE_2D);

glActiveTexture(GL_TEXTURE1);
glDisable(GL_TEXTURE_2D);

// draw Quad A
.....

// draw Quad C
.....

答案 2 :(得分:0)

您可以根据每个纹理单元是否需要它来启用和禁用每帧GL_TEXTURE_2D(就像其他答案所建议的那样)。或者,你可以解开你不需要的纹理,这应该快得多:

glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D,0);

glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D,0);

glActiveTexture(GL_TEXTURE2);
glBindTexture(GL_TEXTURE_2D,0);

glActiveTexture(GL_TEXTURE0); //make sure to set the active texture unit back to 0