【问题标题】:What are the usual troubleshooting steps for OpenGL textures not showing?OpenGL 纹理未显示的常见故障排除步骤是什么?
【发布时间】:2009-04-11 14:09:11
【问题描述】:

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

  • 相机方向没有改变。
  • 我可以看到矢量(当着色而不是纹理时)。

任何常见的嫌疑人?

【问题讨论】:

  • 你看到的不是只有纹理,还是有纹理的对象?
  • 嗯,好吧,我知道这些对象就在那里,正如我所说,但我不能确定它们不会以某种方式消失(尽管这不太可能,因为引入颜色只是 1 次代码更改)。 ..
  • 所以你确实看到了没有纹理的物体?例如。有一些颜色但没有纹理?
  • 是的,“我可以看到矢量(当彩色而不是纹理时)。”通过简单地引入 glColor3f(0, 0, 1.0);在矢量之前我看到一个蓝色方块。

标签: opengl textures


【解决方案1】:

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

  • glEnable(GL_TEXTURE_2D);出席

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

【讨论】:

  • 即使我有这两个,问题仍然没有解决。在进行了一些繁重的重构之后,它又开始工作了。我怀疑这可能是翻译问题,但无论如何感谢您的建议;我接受了这个答案,因为它的支持率最高! :)
  • 我的纹理确实有问题,调用glEnable(GL_TEXTURE_2D); 解决了我的问题。谢谢。
  • 在我的例子中,glUseProgram(0) 解决了这个问题,因为在我的代码的另一个地方我忘了重置它。
【解决方案2】:

我不时遇到的一个常见问题是

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST);

但我忘了提供 mipmap。快速修复:

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);

【讨论】:

  • 谢谢你,它用 OpenGL 4.1+ 保存了我的培根
【解决方案3】:

还有几件事要检查:

  • glColorMaterial(...);确保颜色不会覆盖纹理
  • glEnable/glDisable(GL_LIGHTING);有时光照会洗掉纹理
  • glDisable(GL_BLEND);确保您没有混合纹理
  • 确保纹理坐标设置正确。

【讨论】:

    【解决方案4】:

    我假设您已经实现了诸如 glEnable(GL_TEXTURE_2D) 和纹理绑定之类的必备操作,因为您的纹理之前工作正常,然后突然它们就不会显示了。

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

    我通常做的是创建纹理创建的手动 Init 函数,该函数在 App 的 Init 函数中调用。因此,我保证在绑定发生时应用程序存在。

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

    【讨论】:

      【解决方案5】:

      在渲染纹理对象之前使用 glColor3ub(255,255,255) 是否有帮助?我认为默认的 OpenGL 状态将当前 glColor 乘以传入的纹素;一个杂散的 glColor3ub(0,0,0) 会使你的所有纹理看起来都是黑色的。

      【讨论】:

        【解决方案6】:

        我花了一些时间才弄清楚...

        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,而是使用引擎包装器。否则,您的代码无法与引擎代码的其余部分配合使用。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-12-27
          • 1970-01-01
          • 2019-08-19
          • 2012-11-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多