Java - LWJGL 中的绑定纹理导致白屏
Java - Binding texture in LWJGL causes white screen
最近我一直在尝试实现我自己的 PNG 纹理 decoder/loader,但是就像我之前的几次尝试一样,结果是一样的...没有纹理。
这是我目前用于加载图像的代码(不是我的!我忘记了网站):
public static TextureObject loadTexture(BufferedImage image)
{
int[] pixels = new int[image.getWidth() * image.getHeight()];
image.getRGB(0, 0, image.getWidth(), image.getHeight(), pixels, 0, image.getWidth());
ByteBuffer buffer = BufferUtils.createByteBuffer(image.getWidth() * image.getHeight() * 4); //4 for RGBA, 3 for RGB
for(int y = 0; y < image.getHeight(); y++){
for(int x = 0; x < image.getWidth(); x++){
int pixel = pixels[y * image.getWidth() + x];
buffer.put((byte) ((pixel >> 16) & 0xFF)); // Red component
buffer.put((byte) ((pixel >> 8) & 0xFF)); // Green component
buffer.put((byte) (pixel & 0xFF)); // Blue component
buffer.put((byte) ((pixel >> 24) & 0xFF)); // Alpha component. Only for RGBA
}
}
buffer.flip();
GL11.glEnable(GL11.GL_TEXTURE_2D);
int textureID = GL11.glGenTextures();
GL11.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA8, image.getWidth(), image.getHeight(), 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, buffer);
return new TextureObject(textureID, image.getWidth(), image.getHeight());
}
搜索类似的问题都返回相同的原因,未启用 GL_TEXTURE_2D。
我已经启用了它,并给出了我的四边形纹理坐标。
当我绑定我的纹理并尝试渲染它,opengl 决定它想让整个屏幕变白。我在我的项目中有 Slick-Util 用于测试,它使一切正常。
但是,如果我的 render()
函数中有以下代码:
GL11.glColor3f(1.0F, 1.0F, 1.0F);
if(RenderUtil.fontTexture != null) RenderUtil.renderTexturedQuad(RenderUtil.fontTexture, 40, 40, 150, 150);
Main.t.bind();
GL11.glBegin(GL11.GL_QUADS);
GL11.glTexCoord2f(0, 0);
GL11.glVertex2f(0, 0);
GL11.glTexCoord2f(0, 1);
GL11.glVertex2f(0, 512);
GL11.glTexCoord2f(1, 1);
GL11.glVertex2f(512, 512);
GL11.glTexCoord2f(1, 0);
GL11.glVertex2f(512, 0);
GL11.glEnd();
...主要是 if(RenderUtil.fontTexture != null) RenderUtil.renderTexturedQuad(RenderUtil.fontTexture, 40, 40, 150, 150)
,OpenGL 不会渲染任何东西。即使绑定光滑的纹理并尝试渲染也会失败。这是完整的 renderTexturedQuad()
方法:
public static void renderTexturedQuad(TextureObject texture, int x, int y, int w, int h)
{
GL11.glColor3f(1.0F, 1.0F, 1.0F);
GL11.glEnable(GL11.GL_TEXTURE_2D);
TextureUtil.bind(texture);
GL11.glPushMatrix();
GL11.glTranslatef(x, y, 0);
GL11.glBegin(GL11.GL_QUADS);
GL11.glTexCoord2f(0, 0);
GL11.glVertex2f(0, 0);
GL11.glTexCoord2f(0, 1);
GL11.glVertex2f(0, h);
GL11.glTexCoord2f(1, 1);
GL11.glVertex2f(w, h);
GL11.glTexCoord2f(1, 0);
GL11.glVertex2f(w, 0);
GL11.glEnd();
GL11.glPopMatrix();
}
我唯一看到的可能设置错误的是纹理的绑定?
如果你不推荐我去图书馆或类似的地方,我会更愿意,这是一种学习经历:)
您需要先绑定纹理,然后再将图像数据加载到其中。如果你不这样做,glTexImage2D 不知道在哪里加载数据。
您可以通过调用绑定纹理:
GL11.glBindTexture(GL11.GL_TEXTURE_2D, textureID);
之前:
GL11.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA8, image.getWidth(), image.getHeight(), 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, buffer);
您还应该在加载图像数据后调用这些行:
GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_S, GL11.GL_REPEAT);
GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_T, GL11.GL_REPEAT);
GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_LINEAR);
GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST);
最近我一直在尝试实现我自己的 PNG 纹理 decoder/loader,但是就像我之前的几次尝试一样,结果是一样的...没有纹理。 这是我目前用于加载图像的代码(不是我的!我忘记了网站):
public static TextureObject loadTexture(BufferedImage image)
{
int[] pixels = new int[image.getWidth() * image.getHeight()];
image.getRGB(0, 0, image.getWidth(), image.getHeight(), pixels, 0, image.getWidth());
ByteBuffer buffer = BufferUtils.createByteBuffer(image.getWidth() * image.getHeight() * 4); //4 for RGBA, 3 for RGB
for(int y = 0; y < image.getHeight(); y++){
for(int x = 0; x < image.getWidth(); x++){
int pixel = pixels[y * image.getWidth() + x];
buffer.put((byte) ((pixel >> 16) & 0xFF)); // Red component
buffer.put((byte) ((pixel >> 8) & 0xFF)); // Green component
buffer.put((byte) (pixel & 0xFF)); // Blue component
buffer.put((byte) ((pixel >> 24) & 0xFF)); // Alpha component. Only for RGBA
}
}
buffer.flip();
GL11.glEnable(GL11.GL_TEXTURE_2D);
int textureID = GL11.glGenTextures();
GL11.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA8, image.getWidth(), image.getHeight(), 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, buffer);
return new TextureObject(textureID, image.getWidth(), image.getHeight());
}
搜索类似的问题都返回相同的原因,未启用 GL_TEXTURE_2D。
我已经启用了它,并给出了我的四边形纹理坐标。
当我绑定我的纹理并尝试渲染它,opengl 决定它想让整个屏幕变白。我在我的项目中有 Slick-Util 用于测试,它使一切正常。
但是,如果我的 render()
函数中有以下代码:
GL11.glColor3f(1.0F, 1.0F, 1.0F);
if(RenderUtil.fontTexture != null) RenderUtil.renderTexturedQuad(RenderUtil.fontTexture, 40, 40, 150, 150);
Main.t.bind();
GL11.glBegin(GL11.GL_QUADS);
GL11.glTexCoord2f(0, 0);
GL11.glVertex2f(0, 0);
GL11.glTexCoord2f(0, 1);
GL11.glVertex2f(0, 512);
GL11.glTexCoord2f(1, 1);
GL11.glVertex2f(512, 512);
GL11.glTexCoord2f(1, 0);
GL11.glVertex2f(512, 0);
GL11.glEnd();
...主要是 if(RenderUtil.fontTexture != null) RenderUtil.renderTexturedQuad(RenderUtil.fontTexture, 40, 40, 150, 150)
,OpenGL 不会渲染任何东西。即使绑定光滑的纹理并尝试渲染也会失败。这是完整的 renderTexturedQuad()
方法:
public static void renderTexturedQuad(TextureObject texture, int x, int y, int w, int h)
{
GL11.glColor3f(1.0F, 1.0F, 1.0F);
GL11.glEnable(GL11.GL_TEXTURE_2D);
TextureUtil.bind(texture);
GL11.glPushMatrix();
GL11.glTranslatef(x, y, 0);
GL11.glBegin(GL11.GL_QUADS);
GL11.glTexCoord2f(0, 0);
GL11.glVertex2f(0, 0);
GL11.glTexCoord2f(0, 1);
GL11.glVertex2f(0, h);
GL11.glTexCoord2f(1, 1);
GL11.glVertex2f(w, h);
GL11.glTexCoord2f(1, 0);
GL11.glVertex2f(w, 0);
GL11.glEnd();
GL11.glPopMatrix();
}
我唯一看到的可能设置错误的是纹理的绑定?
如果你不推荐我去图书馆或类似的地方,我会更愿意,这是一种学习经历:)
您需要先绑定纹理,然后再将图像数据加载到其中。如果你不这样做,glTexImage2D 不知道在哪里加载数据。
您可以通过调用绑定纹理:
GL11.glBindTexture(GL11.GL_TEXTURE_2D, textureID);
之前:
GL11.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA8, image.getWidth(), image.getHeight(), 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, buffer);
您还应该在加载图像数据后调用这些行:
GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_S, GL11.GL_REPEAT);
GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_T, GL11.GL_REPEAT);
GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_LINEAR);
GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST);