LWJGL зависает при загрузке изображения PNG с помощью Slick2D TextureLoader

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

Текстура, которую я пытаюсь использовать, представляет собой изображение PNG размером 1024 x 1024,

введите здесь описание изображения

Я также пытался использовать гораздо меньшее изображение 16 x 16 пикселей,

16x16

но я получаю тот же результат.

Оба изображения физически в порядке, никаких ошибок не регистрируется, и последнее, что выводится в консоли, принадлежит Slick2D, заявляя, что

ИНФОРМАЦИЯ: Использовать Java PNG Loader = true

Это особенность ОС или я что-то не так делаю?


person Jojodmo    schedule 22.11.2015    source источник
comment
Можете ли вы запустить pngcheck на своих изображениях и проверить, в порядке ли они физически? Вероятно, так оно и есть — вероятность того, что два образа плохие (если только вы не создали их оба с помощью одного и того же (плохого) программного обеспечения), довольно мала, но все же стоит проверить. Можете ли вы добавить одно из этих изображений к вашему вопросу?   -  person Jongware    schedule 22.11.2015
comment
@Jongware Я добавил оба изображения к вопросу. Они оба физически в порядке, и я создал их с помощью Photoshop.   -  person Jojodmo    schedule 22.11.2015


Ответы (2)


Как оказалось, Slick2D не совместим с GLFW на OS X. Из-за этого мне пришлось использовать stb< /a> привязка LWJGL 3.0 STBImage, org.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;
}

И это работает, как ожидалось

введите здесь описание изображения

person Jojodmo    schedule 22.11.2015

Я думаю, что код просто имеет путь к изображению, но, несмотря на тип файла, который вы ставите после него (.png), он не знает тип файла, попробуйте:

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

если это не сработает, я мог перепутать "", поэтому, если вы снова получите сообщение об ошибке, попробуйте вместо этого (но, скорее всего, это не сработает)

FileInputStream file = new FileInputStream(filename + ".png", "PNG");
person Bryan    schedule 22.11.2015
comment
Спасибо за ответ, но это не работает. FileInputStream принимает только один аргумент. - person Jojodmo; 22.11.2015
comment
Может, попробовать .PNG вместо .png? РЕДАКТИРОВАТЬ: о, я вижу, что это зависит от ОС... Странно, потому что я могу передать два аргумента.... Может быть, это моя версия LWJGL или Slick-Util:/ - person Bryan; 23.11.2015