调用glTexImage2D清除数据缓冲区
问题描述:
我正在使用LWJGL作为它的OpenGL绑定,我试图用纹理绘制四边形。我成功地做到了这一点,但是有一个奇怪的副作用,我不确定它为什么会出现。调用glTexImage2D清除数据缓冲区
下面的代码在第一次加载纹理时(在第一次渲染之前)执行。当我绑定纹理/绘制四边形时,我保存了textureID
的值。下面的设置代码是从找到的答案中获得的here。
int textureID = GL11.glGenTextures(); // Generate texture ID
GL11.glBindTexture(GL11.GL_TEXTURE_2D, textureID); // Bind texture ID
// Setup wrap mode
GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_S, GL11.GL_CLAMP);
GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_T, GL11.GL_CLAMP);
// Setup texture scaling filtering
GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST);
GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST);
// Send texel data to OpenGL
GL11.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA8, image.getWidth(), image.getHeight(), 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, buffer);
在渲染循环,我画了四用下面的代码:
int texture = TextureLoader.loadTexture(TextureLoader.loadImage("/pc_run/run3.png"));
GL11.glBindTexture(GL11.GL_TEXTURE_2D, texture);
GL11.glBegin(GL11.GL_QUADS);
{
GL11.glTexCoord2f(0.0f, 0.0f);
GL11.glVertex2f(-hw, -hh);
GL11.glTexCoord2f(1.0f, 0.0f);
GL11.glVertex2f(+hw, -hh);
GL11.glTexCoord2f(1.0f, 1.0f);
GL11.glVertex2f(+hw, +hh);
GL11.glTexCoord2f(0.0f, 1.0f);
GL11.glVertex2f(-hw, +hh);
}
GL11.glEnd();
到目前为止,这个工程(而且也披挂glPushMatrix()
/glPopMatrix()
调用之间)。但是,不管我到目前为止所绘制的GLContext是什么都没有显示出来。在初始化代码中删除对GL11.glTexImage2D
的调用,则不会显示精灵,但其他所有内容(无纹理)都会正确显示。
答
您需要为不应该纹理化的对象禁用纹理处理(glDisable(GL_TEXTURE_2D)
)。
+0
谢谢。如果这是记录在某处我真的错过了大好时光。 – 2013-11-23 15:30:23
为什么你要为每一帧重新加载纹理?这会很快消耗掉你的记忆。纹理不是垃圾收集。使生成的纹理ID成为类成员变量并仅加载一次纹理! – datenwolf 2012-08-05 09:26:57
我只在初始化GL时创建纹理。 – efritz 2012-08-05 20:46:14
我只是问,因为您在描述为渲染代码的代码中调用了TextureLoader.loadTexture。 – datenwolf 2012-08-05 21:32:56