0

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

所有四边形都使用相同的纹理,除了四边形 B。四边形 B 使用 alpha 贴图和所有其他四边形正在使用的基础纹理。

下面的代码示例是我如何使用固定功能多纹理绘制 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 时,带纹理的 Quads A 和 C 会改变颜色并最终比 Quad B 更暗。

当我删除对 GL_TEXTURE1 的任何提及时,一切都很好地呈现,没有变暗,尽管我失去了 Quad B 上的 alpha 映射。

有什么建议或提示吗?我的 glTexEnvi 调用有问题吗?

4

3 回答 3

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
于 2011-06-29T21:04:24.223 回答
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
.....
于 2011-06-29T20:59:32.323 回答
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
于 2011-07-01T19:24:00.743 回答