【问题标题】:LWJGL Textures not renderingLWJGL 纹理不渲染
【发布时间】:2017-09-26 20:12:22
【问题描述】:

我试图弄清楚为什么我无法使用 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 文件。

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

【问题讨论】:

    标签: java opengl lwjgl


    【解决方案1】:

    看起来像incomplete texture

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

    【讨论】:

    • 感谢您的帮助,但还有另外两个问题。 1. 我在 glBindTexture 2 之前使用了 glTexImage2D。我在 Windows 8 上创建了带有绘画的 PNG,但它们不起作用。我什至无法用 PS CS5 打开它们,但其他人可以打开它们。
    猜你喜欢
    • 2020-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-28
    相关资源
    最近更新 更多