|
1
1
检查纹理坐标。如果设置错误,您可以看到仅一个或两个texel映射到整个原语。记住,OpenGL是一个状态机。检查是否在错误的时间更改纹理坐标状态。您可能在代码的稍后点设置纹理坐标,然后当您返回重新绘制这些元素时,状态对于将纹理映射到代码是可以接受的。 如果这仅仅是一个时间问题,纹理加载OpenGL调用没有及时执行,并且线程代码是正确的,那么在加载纹理后尝试添加对glflush()的调用。glflush()导致执行所有挂起的opengl命令。 |
|
|
2
3
如果纹理的颜色不正确,则很可能加载了错误的RGB顺序。确保在glteximage2d中,图像格式使用了正确的枚举。确保组件的数量是正确的,并且在格式参数中获得了RGB像素的顺序。 尽管可能与显示错误的纹理无关,但OpenGL不支持多线程绘制,因此请确保您没有在拥有上下文的线程之外的其他线程上执行任何绘制工作。 编辑:是否有一个引用渲染器,以便验证图像像素是否按预期加载?我强烈建议编写一个要加载的小程序,然后立即将像素保存到一个文件中,这样可以确保获得正确的纹理结果。 |
|
|
3
1
当你说:
对我来说,这听起来不像是强大的保护:记住OpenGL是一个具有大量内部状态的状态机。您需要确保OpenGL状态是您在进行调用时所期望的状态,并且某些调用序列不会被其他线程的调用中断。 我不是OpenGL线程安全专家,但在我看来,这可能是您的问题所在。 |
|
|
4
0
检查用作纹理的图像的大小和压缩。我认为OpenGL纹理大小必须是2的幂… |
|
|
5
0
你不能在一条线中加载一个纹理并在其他不同的线中使用它,因为你会看到一个漂亮的白色纹理。要做到这一点,在使用任何OpenGL函数之前,必须在不同线程之间加载OpenGL上下文。 |
|
|
6
0
如果使用glintercept检查代码,请确保启用: 螺纹检查=真; 在gliconfig.ini文件中。 查看日志,似乎有相当多的OpenGL调用是主上下文之外的主上下文。 |
|
|
7
0
可以在另一个线程中加载纹理而不获得白色纹理。问题是,一旦初始化了OpenGL窗口,OpenGL上下文就会“绑定”到这个线程。在加载纹理时,必须停用主线程中的上下文,并且在开始加载纹理之前,必须激活该线程中的上下文。 您可以使用以下类: 语境:H:
Context.cpp:
这就是你要做的:
|