OpenGL纹理加载问题

这是一个非常模糊的问题,所以请随时澄清这个项目的任何事情。

我正在研究一个非常大的应用程序,最近一个非常令人困惑的错误已经出现在纹理上。 我们正在加载的一些纹理正在加载 - 我已经加入代码并运行 - 但所有OpenGL渲染的纹理都是奇怪的粉色/白色条纹纹理。

你甚至会建议你开始调试这种情况?

  • 该项目是多线程的,但互斥量确保所有OpenGL调用都不会被其他任何中断。
  • 有些纹理正在加载,有些则没有。 它们都以完全相同的方式加载。
  • 我确定所有纹理都存在
  • “粉色/白色”纹理绝对加载到内存中 - 在将任何其他纹理加载到OpenGL后不久,它们就会变得可见。
  • 我很困惑,不知道还有什么可能是错的。 是否有一个OpenGL命令可以在glTexImage之后调用,这会强制纹理变得可用?

    编辑:这不是关于命令失败,主要是时间问题。 粉红色/白色纹理显示一段时间,直到加载更多纹理。 就好像纹理排队了,队列在某个时间暂停。

    下一步编辑:我得到了glIntercept日志正常工作,这是它输出(在整个程序崩溃之前)

    http://freetexthost.com/1kdkksabdg

    下一步编辑:我知道一个事实,纹理加载在OpenGL内存中,但由于某些原因,它们并没有在程序中进行渲染。


    检查你的纹理坐标。 如果它们设置错误,则可以看到只有一个或两个texels映射到整个基元。 请记住,OpenGL是一个状态机。 检查你是否在错误的时间改变纹理坐标状态。 您可能会在代码中稍后设置纹理坐标,然后当您重新绘制这些元素时,状态对于将纹理映射到代码是可以接受的。

    如果它只是一个时间问题,其中纹理加载OpenGL调用没有及时执行,并且线程代码是正确的,请尝试在加载纹理后添加对glFlush()的调用。 glFlush()会导致执行所有挂起的OpenGL命令。


    如果你的纹理颜色不正确,那么很可能是你加载了错误的RGB顺序。 确保在你的glTexImage2D中使用了适合你的图像格式的正确枚举。 确保组件的数量是正确的,并且您在格式参数右侧获得RGB像素的顺序。

    尽管可能与您的纹理不相关,但OpenGL不支持多线程绘制,因此请确保您没有在拥有该上下文的线程上执行任何绘制工作。

    编辑:你有一个参考渲染器,所以你可以验证图像像素是否按预期加载? 我强烈建议编写一个小例程来加载,然后立即将像素保存到一个文件中,这样您就可以确保获得正确的纹理结果。


    当你说:

    该项目是多线程的,但互斥量确保所有OpenGL调用都不会被其他任何中断。

    这听起来不像对我有足够的保护:记住OpenGL是一个具有大量内部状态的状态机。 您需要确保OpenGL状态与您打电话时期望的一致,并且某些调用序列不会被来自其他线程的调用中断。

    我不是OpenGL线程安全方面的专家,但是在我看来,您的问题可能在哪里。

    链接地址: http://www.djcxy.com/p/33979.html

    上一篇: OpenGL texture loading issue

    下一篇: Drawing on top of previous frame with an offscreen texture