调用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的调用,则不会显示精灵,但其他所有内容(无纹理)都会正确显示。

+0

为什么你要为每一帧重新加载纹理?这会很快消耗掉你的记忆。纹理不是垃圾收集。使生成的纹理ID成为类成员变量并仅加载一次纹理! – datenwolf 2012-08-05 09:26:57

+0

我只在初始化GL时创建纹理。 – efritz 2012-08-05 20:46:14

+0

我只是问,因为您在描述为渲染代码的代码中调用了TextureLoader.loadTexture。 – datenwolf 2012-08-05 21:32:56

您需要为不应该纹理化的对象禁用纹理处理(glDisable(GL_TEXTURE_2D))。

+0

谢谢。如果这是记录在某处我真的错过了大好时光。 – 2013-11-23 15:30:23