【问题标题】:Multitexturing is darkening the entire scene!多重纹理使整个场景变暗!
【发布时间】:2011-06-29 20:10:34
【问题描述】:

我使用 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 贴图应用到四边形 B 时,纹理四边形 A 和 C 会改变颜色并最终比四边形 B 更暗。

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

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

【问题讨论】:

    标签: opengl alphablending multitexturing


    【解决方案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
    

    【讨论】:

    • 正在调用 glActiveTexture(GL_TEXTUREN);与调用 glEnable(GL_TEXTURE_2D) 同义; ?
    • @ct: 不,它切换当前激活的纹理单元,glEnable/glDisable(GL_TEXTURE_…) 启用/禁用激活的纹理单元。这很像 glMatrixMode。
    【解决方案2】:

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

    // draw Quad B
    ....
    
    glActiveTexture(GL_TEXTURE0);
    glEnable(GL_TEXTURE_2D);
    
    glActiveTexture(GL_TEXTURE1);
    glDisable(GL_TEXTURE_2D);
    
    // draw Quad A
    .....
    
    // draw Quad C
    .....
    

    【讨论】:

      【解决方案3】:

      您可以根据每个纹理单元是否需要每帧启用和禁用 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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-10-25
        • 1970-01-01
        • 1970-01-01
        • 2013-11-13
        • 2018-08-26
        • 1970-01-01
        相关资源
        最近更新 更多