问题 OpenGL纹理没有显示的常见故障排除步骤是什么?


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

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

任何通常的嫌疑人?


7707
2018-04-11 14:09


起源

在纹理化时,您是否只看到纹理或物体? - dragonfly
嗯,我知道对象就在那里,正如我所说,但我不能确定它们不会以某种方式消失(虽然这不太可能,因为引入颜色只是1代码更改)... - Nick Bolton
所以你看到对象虽然没有纹理?例如。在一些着色但没有纹理? - dragonfly
是的,“我可以看到矢量(当有色而不是纹理时)。”通过简单介绍glColor3f(0,0,1.0);在矢量之前,我看到一个蓝色方块。 - Nick Bolton


答案:


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

  • glEnable(GL_TEXTURE_2D); 存在

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


9
2018-04-11 14:26



虽然我有这两个,但问题仍未得到解决。在做了一些重型重构后,它又开始工作了。我怀疑这可能是一个翻译问题,但无论如何,谢谢你的建议;我接受了这个答案,因为它有最高的赞成票! :) - Nick Bolton
我的纹理和调用确实有问题 glEnable(GL_TEXTURE_2D); 解决了我的问题。谢谢。 - Hooray Im Helping
就我而言, glUseProgram(0) 解决了这个问题,因为在我的代码的另一个地方,我忘了重置它。 - Michal Fapso


还有一些事情需要检查:

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

2
2018-04-12 01:18





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

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST);

但我忘了提供mipmap。快速解决:

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);

1
2018-03-21 22:50



谢谢你,它用OpenGL 4.1+保存了我的培根 - Cardano


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


0
2018-04-16 20:15





我假设您必须执行像glEnable(GL_TEXTURE_2D)和纹理绑定这样的操作,因为您的纹理之前工作正常然后突然他们不会显示。

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

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

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


0
2017-08-28 03:55





我花了一些时间想出来......

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,而是使用引擎包装器。否则,您的代码与其余的引擎代码不兼容。


0
2017-11-25 10:29