我有一个简单的OpenGL应用程序,其中在屏幕上显示了2个对象:
1)粒子系统,其中每个粒子都通过glTexImage2D()调用进行纹理映射。在drawEvent函数中,将其绘制为带有4 glVertex3f的GL_TRIANGLE_STRIP。
2)从目标文件加载的3D文本,其中使用glNewList / glGenLists加载每个点,并将每个点存储为glVertex。我通过调用glCallList来绘制它。
问题是,一旦我调用glTexImage2D()以.bmp文件映射我的粒子,则3D文本将不会显示在屏幕上。粒子看起来很好。 (这是不期望的)
如果我不调用glTexImage2D,那么我会同时看到3D文本和粒子系统。在这种情况下,粒子系统看起来很可怕,因为我没有任何纹理贴图。 (这是预期的)
有谁知道为什么使用通话清单和glTexImage2D可能会相互冲突?
编辑我也忘了提:我确实调用glBindTexture(GL_TEXTURE_2D,this-> texture);在调用粒子系统之前在drawLoop中。
EDIT2我仅在系统启动时调用一次glTexImage2D()(当我纹理映射位图时)
最佳答案
glTexImage2D将纹理上传到video-ram(简化表示)。
如果OpenGL允许您在列表内放置glTexImage2D调用,则它也必须将像素数据存储在列表中。现在,如果执行该列表会发生什么?您将全部增益上载相同的图像数据到相同的纹理。
那没有意义,因此被忽略了。
如果要在两次绘制调用之间更改纹理,请使用glBindTexure。该调用将设置当前纹理。它要快得多。
关于通过glTexImage2D上传的图片:每个纹理仅执行一次。要么在程序开始时(如果很小),要么每次从磁盘加载新内容。