当前位置: 首页 > 知识库问答 >
问题:

LWJGL纹理不渲染

洪国兴
2023-03-14

我试图弄清楚为什么我不能用LWJGL 3渲染任何纹理。我尝试了多种加载(PNGDecoder、STB、BufferedImage)和渲染纹理的方法。但结果总是一个白色的四边形。

主要类:

public static void main(String[] args)
{
    glfwInit();
    window = glfwCreateWindow(640, 480, "TEST", 0, 0);
    glfwShowWindow(window);
    glfwMakeContextCurrent(window);
    GL.createCapabilities();

    GL11.glEnable(GL11.GL_TEXTURE_2D);

    Loader loader = new Loader();
    TestRenderer renderer = new TestRenderer();
    ModelTexture texture = new ModelTexture(loader.loadTextureManual("blue"));
    while(!glfwWindowShouldClose(window))
    {
        glfwPollEvents();
        renderer.prepare();
        renderer.renderWithFixedFunctions(texture);
        glfwSwapBuffers(window);
        clearErrorBuffer(true);
    }
    loader.cleanUp();
}

加载方法:

    public int loadTextureManual(String fileName)
{
    String imagePath = "./res/" + fileName + ".png";
    try {
        System.out.println("Trying to load texture \""+imagePath+"\"");

        BufferedImage bi = ImageIO.read(new File(imagePath));
        int width = bi.getWidth();
        int height = bi.getHeight();

        int[] pixels_raw = new int[width*height];
        pixels_raw = bi.getRGB(0, 0, width, height, null, 0, width);

        ByteBuffer pixels = BufferUtils.createByteBuffer(width*height*4);

        for(int i = 0; i < width; i++)
        {
            for(int j = 0; j < height; j++)
            {
                int pixel = pixels_raw[i*width+j];
                pixels.put((byte) ((pixel >> 16) & 0xFF));  //RED
                pixels.put((byte) ((pixel >> 8) & 0xFF));   //GREEN
                pixels.put((byte) ((pixel) & 0xFF));        //BLUE
                pixels.put((byte) ((pixel >> 24) & 0xFF));  //ALPHA
            }
        }

        pixels.flip();

        byte[] info = new byte[pixels.capacity()];
        pixels.get(info);

        int textureID = GL11.glGenTextures();

        if(GL.getCapabilities().GL_EXT_texture_filter_anisotropic)
        {
            float amount = Math.min(ANISOTROPIC_FILTERING_AMOUNT, GL11.glGetFloat(EXTTextureFilterAnisotropic.GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT));
            GL11.glTexParameterf(GL11.GL_TEXTURE_2D, EXTTextureFilterAnisotropic.GL_TEXTURE_MAX_ANISOTROPY_EXT, amount);
        }
        else
        {
            System.out.println("Anisotropic filtering not supported!");
        }

        GL11.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA, width, height, 0,
                GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, pixels);

        GL11.glBindTexture(GL11.GL_TEXTURE_2D, textureID);

        return textureID;
    }
    catch (Exception e)
    {
        e.printStackTrace();
        System.err.println("Couldn'l load texture \""+imagePath+"\"");
        System.exit(-1);
    }
    return 0;
}

渲染方法:

public void renderWithFixedFunctions(ModelTexture texture)
{
    glBindTexture(GL_TEXTURE_2D, texture.getID());
    glBegin(GL_QUADS);
    glTexCoord2f(0, 0);
    glVertex2f(-0.5f, 0.5f);

    glTexCoord2f(0, 1);
    glVertex2f(0.5f, 0.5f);

    glTexCoord2f(1, 1);
    glVertex2f(0.5f, -0.5f);

    glTexCoord2f(1, 0);
    glVertex2f(-0.5f, -0.5f);
    glEnd();
}

ModelTexture类只是存储一些现在不使用的信息,blue.png是16x16的png文件。

这是我在启动程序时得到的输出:

共有1个答案

夏英发
2023-03-14

看起来像一个不完整的纹理。

将GL_TEXTURE_MIN_FILTER设置为GL_NEARESTGL_LINEAR(默认值为GL_NEAREST_MIPMAP_LINEAR)或上传完整的 mipmap 链。

 类似资料:
  • 使用LWJGL的OpenGL版本1.1和2D纹理,我发现自己卡住了... 出于某种原因,LWJGL引擎不会在2D图层上渲染加载的纹理...相反,我得到了一个白色正方形... 我假设我很有可能在代码的某个地方遗漏了什么..以下是与此类事件相关的全部代码.. 加载OpenGL环境: 进入2D绘图模式(用于绘制纯色正方形的功能-通过glcolor函数进行测试,然后通过glvertex调用尺寸): 加载映

  • 在过去的一个小时左右,我一直在尝试修复一个错误,使我尝试渲染的纹理只是单一颜色。奇怪的是,这种加载纹理的方法以前对我来说非常有效,没有这样的问题。这是我如何加载纹理(来自BufferedImage): 这就是纹理如何绘制到屏幕上: 上面的代码在显示列表中。任何想法可能导致四边形呈现为单一颜色?

  • 有问题显示纹理在我的3D框在LWJGL使用光滑。早些时候我犯了一个错误: BasicShader类: BasicVertex.vs basicfragment.fs

  • 我正在尝试在OpenGL/LWJGL中制作一个简单的按钮, 我可以正确地渲染我的2D四边形,但是当我实现纹理时,整个四边形只有大约3/4的部分得到了纹理,就像这样:https://dl.dropboxusercontent.com/u/60223805/glerror1.png 如果我删除纹理坐标,我得到这个:https://dl.dropboxusercontent.com/u/60223805

  • 纹理根本不渲染,几何体都是黑色的。 截图:http://i.imgur.com/ypMdQY4.png 代码:http://pastebin.com/SvB8rxxt 我也会链接到我试图渲染的纹理和transformations.py模块,但是我没有被允许放置两个以上链接的声誉。谷歌搜索“现代opengl 02”会给你前者的教程,“转换py”会给你后者。 搜索“纹理材料开始”以查找纹理材料的设置位

  • 假设我有一个金字塔…我知道如何绘制它,我知道如何为整个金字塔设置纹理,但如何为每面墙设置不同的纹理? 我通过在 我试图通过添加<code>GL11.glBindTexture(GL11.GL_TEXTURE_2D,TEXTURE.getTextureID())来绑定纹理 后,但