2015-04-21 85 views
1

我正在制作一个LWJGL游戏,并且通过使用openGL,我相信我的最佳选择是使用纹理并使用四边形渲染它们。但是,我似乎只能找到有关从整个图像只有一个纹理的图像加载纹理的信息。我想要做的是读取整个spritesheet并能够将其分离成不同的纹理。有没有一个简单的方法来做到这一点?LWJGL:从多个贴图获取纹理

回答

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; 
} 

你现在能够返回textureIDglBindTexture(GL_TEXTURE_2D, textureID);绑定,如果你需要的质感。 这样你只需要将BufferedImage分成所需的部分。

我推荐阅读:LWJGL Textures and Strings