【发布时间】:2015-08-31 14:33:10
【问题描述】:
我在使用 OpenGL 时遇到了一些令人困惑的问题,它相当简单,但我没有找到任何直接相关的信息。
我想要做什么
我每帧创建几个新纹理,创建后我立即绑定它们,将它们用于绘图,然后立即删除它们。
问题
如果我在使用后立即删除每个纹理,则要绘制的最后一个将替换以前的纹理(但它们的不同几何形状可以正常工作)。如果我在所有绘制完成后批量删除,它会按预期工作,但是如果我在删除纹理后进行任何绘制调用,最后一次绘制调用中使用的纹理会替换旧的(这可能是一些常见的永久精灵纹理)。
调试结果
我尝试过使用 glFlush(),它似乎根本没有做任何事情,根本不删除纹理会给出正确的行为,并且在删除纹理和调用 SwapBuffers() 之间根本不绘制任何东西有效。
代码
这不是我的代码的样子,但相关部分归结为:
int Tex1, Tex2, Tex3;
glGenTextures(1, &Tex1);
glBindTexture(GL_TEXTURE_2D, Tex1);
// ... Fill Texture with data, set correct filtering etc.
glDrawElements(GL_TRIANGLES, ...); // Using Tex1
glGenTextures(1, &Tex2);
glBindTexture(GL_TEXTURE_2D, Tex2);
// ... Fill Texture with data, set correct filtering etc.
glDrawElements(GL_TRIANGLES, ...); // Using Tex2
// I delete some textures here.
glDeleteTextures(1, &Tex1);
glDeleteTextures(1, &Tex2);
// If I comment out this section, everything works correctly
// If I leave it in, this texture replaces Tex1 and Tex2, but
// the geometry is correct for each geometry batch.
glGenTextures(1, &Tex3);
glBindTexture(GL_TEXTURE_2D, Tex3);
// ... Fill Texture with data, set correct filtering etc.
glDrawElements(GL_TRIANGLES, ...); // Using Tex3
glDeleteTextures(1, &Tex3);
// ...
SwapBuffers();
我怀疑这可能与 OpenGL 缓冲我的绘图调用有关, 当它们被实际处理时,纹理被删除了?但这对我来说真的没有意义,为什么在删除以前的纹理之后绘制其他东西会导致这种行为?
更多上下文
生成的纹理是文本字符串,可能会或可能不会改变每一帧,现在我为每一帧的每个字符串创建新的纹理,然后渲染纹理并在之后立即丢弃它。位图数据是使用 Windows GDI 生成的。
我并不是真的在寻找有关效率的建议,理想情况下,我想要一个答案,可以引用文档说明使用此类临时纹理进行渲染的预期/正确行为,以及这种方法可能存在的常见问题。
【问题讨论】:
-
如果你这边没有奇怪的错误(除了到目前为止粘贴的代码),这似乎是一个驱动程序错误。您使用的是哪个驱动程序?您是否有机会使用另一个 GL 实现来测试您的代码?
-
您好,我已经更新了适用于windows的nvidia驱动程序,这次我完全忘记考虑驱动程序的错误了,有机会我会尽快在其他硬件上进行测试,谢谢。
-
删除tex1和tex2后尝试glFinish会怎样?
标签: c++ winapi opengl textures