调用glTexImage2D会清除数据缓冲区

时间:2012-08-05 00:08:14

标签: java opengl lwjgl

我正在使用LWJGL进行OpenGL绑定,我正在尝试使用纹理绘制四边形。我已经成功地做到了,但是有一个奇怪的副作用,我不确定它为什么会出现。

首次加载纹理时(第一次渲染之前)执行以下代码。当我绑定纹理/绘制四边形时,我保存textureID的值。以下设置代码取自here的SO答案。

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

1 个答案:

答案 0 :(得分:2)

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