Java - LWJGL 中的绑定纹理导致白屏

Posted

技术标签:

【中文标题】Java - LWJGL 中的绑定纹理导致白屏【英文标题】:Java - Binding texture in LWJGL causes white screen 【发布时间】:2015-01-14 02:23:03 【问题描述】:

最近我一直在尝试实现我自己的 PNG 纹理解码器/加载器,但是就像我之前的几次尝试一样,结果是一样的……没有纹理。 这是我目前用于加载图像的代码(不是我的!我忘记了网站):

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();

我看到的唯一可能设置错误的是我的纹理绑定?

如果你不推荐我去图书馆或同等机构,我更愿意,这是一种学习体验:)

【问题讨论】:

TextureUtil.bind(texture); 是做什么的? @Dawnkeeper GL11.glBindTexture(GL11.GL_TEXTURE_2D, texture.GL_TEX_ID);,我想这只是对 GL11 方法的不必要引用。刚刚注意到你修复了我的帖子,谢谢 :) 还是要习惯它。 您确定您的纹理加载正确吗?您可以尝试来自 Slick 的 texture = TextureLoader.getTexture("PNG", ResourceLoader.getResourceAsStream("res/image.png"));,而不是您自己的方法来测试它。见here @Dawnkeeper 我确实尝试过 :) 目前这对我来说是唯一的渲染方式。如果我在渲染自己的纹理之前绑定并渲染光滑纹理,则光滑纹理不会渲染并且屏幕变白。好像屏幕不清晰。 白色可以是你的四边形吗(你正在设置那个颜色)? BufferedImage 是你的纹理?您能否验证它是否正确加载,例如通过使用 ImageIO 将 int 写入文件? 【参考方案1】:

在将图像数据加载到纹理之前,您需要绑定纹理。如果你不这样做,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);

【讨论】:

以上是关于Java - LWJGL 中的绑定纹理导致白屏的主要内容,如果未能解决你的问题,请参考以下文章

Android项目启动时短暂的黑屏白屏处理

Android启动APP时黑屏白屏

Android启动APP时黑屏白屏

首屏白屏时间如何计算

移动端加载页面白屏问题

14-1 启动白屏问题解决与启动屏开发-1