【问题标题】:LWJGL hangs when loading PNG image using Slick2D TextureLoader使用 Slick2D TextureLoader 加载 PNG 图像时 LWJGL 挂起
【发布时间】:2015-11-22 03:15:40
【问题描述】:

在 Mac OS X El Capitan,OpenGL 4.1 版上,我的 LWJGL 3.0 应用程序在调用 Slick2D 函数 TextureLoader.getTexture() 时挂起

这是我试图用来加载纹理的代码。它与主循环在同一个线程上运行,并在设置窗口后调用。

FileInputStream file = new FileInputStream("src/AppIcon.png");
texture = TextureLoader.getTexture("PNG", file);

文件确实存在,我注释掉贴图的代码时代码运行正常,就是这个方法

public int loadTexture(String filename){
    Texture texture = null;
    try{
        FileInputStream file = new FileInputStream(filename + ".png");
        //The app freezes here
        texture = TextureLoader.getTexture("png", file);
        //"LOADED" is never printed to the console.
        System.out.println("LOADED");
    }
    catch(FileNotFoundException e){
        e.printStackTrace();
    }
    catch(IOException e){
        e.printStackTrace();
    }
     return texture.getTextureID();
}

我尝试使用的纹理是 1024 x 1024 PNG 图像,

我也尝试过使用更小的 16 x 16 像素图像,

但我得到了相同的结果。

两个图像在物理上都没有问题,没有记录错误,在控制台中打印的最后一件事来自 Slick2D,说明

信息:使用 Java PNG 加载器 = true

这是特定于操作系统的错误,还是我做错了什么?

【问题讨论】:

  • 您能否在您的图像上运行pngcheck 并检查它们是否正常?他们可能是 - 两个图像坏的可能性非常低(除非你用相同的(坏的)软件创建它们),但仍然值得检查。您可以将其中一张图片添加到您的问题中吗?
  • @Jongware 我已将这两个图像都添加到问题中。它们的身体都很好,我用 Photoshop 制作了它们

标签: java opengl lwjgl slick2d


【解决方案1】:

事实证明,Slick2D 与 OS X 上的 GLFW 不兼容。因此,我不得不使用 stb 绑定,即 LWJGL 3.0 的 STBImageorg.lwjgl.stb.STBImage

这是我使用的代码

public int loadTexture(String filename){
    ByteBuffer imageBuffer;
    try{
        imageBuffer = readFile(filename);
    }
    catch (IOException e) {
        throw new RuntimeException(e);
    }

    IntBuffer w = BufferUtils.createIntBuffer(1);
    IntBuffer h = BufferUtils.createIntBuffer(1);
    IntBuffer comp = BufferUtils.createIntBuffer(1);

    ByteBuffer image = STBImage.stbi_load_from_memory(imageBuffer, w, h, comp, 0);
    if(image == null){
        throw new RuntimeException("Failed to load image: " + STBImage.stbi_failure_reason());
    }

    this.width = w.get(0);
    this.height = h.get(0);
    this.comp = comp.get(0);

    if(this.comp == 3){
        GL11.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGB, this.width, this.height, 0, GL11.GL_RGB, GL11.GL_UNSIGNED_BYTE, image);
    }
    else{
        GL11.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA, this.width, this.height, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, image);

        GL11.glEnable(GL11.GL_BLEND);
        GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
    }

    GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_LINEAR);
    GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_LINEAR);

    GL11.glEnable(GL11.GL_TEXTURE_2D);

    return GL11.glGenTextures();
}

private ByteBuffer readFile(String resource) throws IOException{
    File file = new File(resource);

    FileInputStream fis = new FileInputStream(file);
    FileChannel fc = fis.getChannel();

    ByteBuffer buffer = BufferUtils.createByteBuffer((int) fc.size() + 1);

    while(fc.read(buffer) != -1);

    fis.close();
    fc.close();
    buffer.flip();

    return buffer;
}

它按预期工作

【讨论】:

    【解决方案2】:

    我认为代码只有图像的路径,但是尽管您在其后放置了文件类型 (.png),但它不知道文件类型,请尝试:

    FileInputStream file = new FileInputStream(filename + ".png", PNG);
    

    如果这不起作用,我可能弄乱了“”,所以如果你再次遇到错误,请尝试这个(但它可能不起作用)

    FileInputStream file = new FileInputStream(filename + ".png", "PNG");
    

    【讨论】:

    • 感谢您的回复,但这不起作用。 FileInputStream 只接受一个参数。
    • 也许尝试“.PNG”而不是“.png”?编辑:哦,我看到它是特定于操作系统的......很奇怪,因为我可以传递两个参数......也许是我的 LWJGL 或 Slick-Util 版本:/
    猜你喜欢
    • 1970-01-01
    • 2012-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-17
    • 2016-11-09
    相关资源
    最近更新 更多