我有一个简单的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()一次(当我纹理映射位图时)
答案 0 :(得分:1)
它可能根本不是glTexImage2D和glCallList的冲突。你的纹理映射好吗?你有适当的设置纹理坐标吗?尝试检查顶点与纹理坐标不匹配。
答案 1 :(得分:1)
glTexImage2D将纹理上传到video-ram(简称为)。
如果OpenGL允许你在列表中放置glTexImage2D调用,它也必须将像素数据存储在列表中。现在如果要执行列表会发生什么?您可以将相同的图像数据上传到相同的纹理中。
这没有任何意义,因此它被遗漏了。
如果要在绘制调用之间更改纹理,请使用glBindTexure。该调用设置当前纹理。它快得多。
关于通过glTexImage2D上传图片的方法:每个纹理只做一次。在程序开始时(如果它很小)或每次从磁盘加载新内容时。
答案 2 :(得分:0)
我已经解决了这个问题。 在使用GL_TEXTURE_2D之前,您需要设置enable function => glEnable(GL_TEXTURE_2D); 在使用glCallList之前,还需要设置disable function => glDisable(GL_TEXTURE_2D);