代码之家  ›  专栏  ›  技术社区  ›  Nick Bolton

OpenGL纹理未显示的常见故障排除步骤是什么?

  •  11
  • Nick Bolton  · 技术社区  · 16 年前

    在应用程序中进行一些更改后,我的纹理将不再显示。到目前为止,我已经检查了以下内容:

    • 摄像机的方向没有改变。
    • 我可以看到向量(当颜色而不是纹理时)。

    有什么常见的嫌疑犯吗?

    6 回复  |  直到 7 年前
        1
  •  9
  •   dragonfly    16 年前

    您可能需要检查以下内容:

    • glEnable(GL_TEXTURE_2D); 存在

    • glBindTexture(GL_TEXTURE_2D, texture[i]); glBindTexture(GL_TEXTURE_2D, 0); 当你不再需要质地时

        2
  •  2
  •   Andrei Krotkov    16 年前

    还有一些事情需要检查:

    • glcolormaterial(…);确保颜色不会覆盖纹理
    • glenable/gldisable(gl_lighting);有时照明会洗掉纹理
    • gldisable(gl_混合);确保不混合纹理
    • 确保纹理坐标设置正确。
        3
  •  1
  •   Jonas Byström    12 年前

    我经常遇到的一个常见问题是

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST);
    

    但我忘了提供mipmap。Quickfix:

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
    
        4
  •  0
  •   genpfault    16 年前

    在渲染纹理对象之前,glcolor3ub(255255255)是否有帮助?我认为默认的OpenGL状态将当前的glcolor乘以传入的texel;杂散的glcolor3ub(0,0,0)将使所有纹理看起来都是黑色的。

        5
  •  0
  •   Jav_Rock Rahul N    13 年前

    我假设你已经执行了一些必须的操作,比如glenable(gl_texture_2d)和纹理绑定,因为你的纹理以前工作得很好,后来突然就不显示了。

    如果您正在执行面向对象的代码,您可能希望纹理生成发生在实际执行绘制的线程被实例化时,换句话说:避免在构造函数中执行或从构造函数调用,这可能会在窗口或将要使用纹理对象的应用程序打开之前实例纹理对象。

    我通常做的是创建一个纹理创建的手动初始化函数,这个函数在应用的init函数中调用。因此,我保证在绑定发生时应用程序存在。

    更多信息在这里: http://www.opengl.org/wiki/Common_Mistakes#The_Object_Oriented_Language_Problem

        6
  •  0
  •   kungfooman    7 年前

    我花了点时间才弄明白…

    glMatrixMode(GL_TEXTURE);
    glLoadIdentity();
    glDisable(GL_TEXTURE_GEN_S);
    glDisable(GL_TEXTURE_GEN_T);
    glDisable(GL_TEXTURE_GEN_R);
    glDisable(GL_TEXTURE_GEN_Q);
    

    还要确保解开你的东西:

    glBindBuffer(GL_ARRAY_BUFFER, 0);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
    glBindVertexArray(0);
    

    如果您使用的是经过优化的第三方引擎,那么它可能有一个用于OpenGL的“直接状态访问”层(不使用较慢的OpenGL查询功能)。如果是这样,不要直接调用OpenGL,而是使用引擎包装器。否则,您的代码与其他引擎代码不匹配。

    推荐文章