LWJGL: получение текстуры из .png с несколькими текстурами

Я делаю игру с LWJGL и с помощью openGL, я считаю, что мой лучший вариант — использовать текстуры и визуализировать их с помощью четырехугольников. Однако я могу найти только информацию о загрузке текстуры из изображения, где все изображение представляет собой только ОДНУ текстуру. Что я хотел бы сделать, так это прочитать весь спрайт-лист и иметь возможность разделить его на разные текстуры. Есть ли несколько простой способ сделать это?


person CosmicKidd    schedule 21.04.2015    source источник


Ответы (1)


Вы можете загрузить изображение, например, из файл .png в BufferedImage с

public static BufferedImage loadImage(String location)
{
    try {
        BufferedImage image = ImageIO.read(new File(location));
        return image;
    } catch (IOException e) {
        System.out.println("Could not load texture: " + location);
    }
    return null;
}

Теперь вы можете вызвать getSubimage(int x, int y, int w, int h) для полученного BufferedImage, что даст вам отдельную часть. Теперь вам просто нужно создать текстуру BufferedImage. Этот код должен выполнять работу:

public static int loadTexture(BufferedImage image){
    if (image == null) {
        return 0;
    }

    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() * BYTES_PER_PIXEL); //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(); //FOR THE LOVE OF GOD DO NOT FORGET THIS

     // You now have a ByteBuffer filled with the color data of each pixel.
    // Now just create a texture ID and bind it. Then you can load it using 
    // whatever OpenGL method you want, for example:

    int textureID = glGenTextures();
    glBindTexture(GL_TEXTURE_2D, textureID);

    //setup wrap mode
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL12.GL_CLAMP_TO_EDGE);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL12.GL_CLAMP_TO_EDGE);

    //setup texture scaling filtering
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);

    //Send texel data to OpenGL
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, image.getWidth(), image.getHeight(), 0, GL_RGBA, GL_UNSIGNED_BYTE, buffer); //GL_RGBA8 was GL_RGB8A

    return textureID;
}

Теперь вы можете связать возвращенный textureID с glBindTexture(GL_TEXTURE_2D, textureID);, если вам нужна текстура. Таким образом, вам нужно только разделить BufferedImage на нужные части.

Я рекомендую прочитать это: Текстуры и строки LWJGL

person Tanix    schedule 06.05.2015