2011-03-04 81 views
5

我想加载一个图像作为使用LWJGL库的openGL的纹理。从我发现到目前为止,我需要将纹理作为ByteBuffer传递给openGL。我现在所拥有的是一些正确加载图像的代码,并将其存储在BufferedImage对象中。问题是,我不知道如何从一个BufferedImage一个字节缓冲区,其中包含了使用正确的格式用OpenGL数据获取(作为函数GL11.glTexImage2D输入())。 非常感谢帮助!如何使用LWJGL加载用作openGL纹理的图像?

回答

6

下面是Space Invaders示例中的一个方法,可以根据需要进行操作。 (我认为)

/** 
* Convert the buffered image to a texture 
*/ 
private ByteBuffer convertImageData(BufferedImage bufferedImage) { 
    ByteBuffer imageBuffer; 
    WritableRaster raster; 
    BufferedImage texImage; 

    ColorModel glAlphaColorModel = new ComponentColorModel(ColorSpace 
      .getInstance(ColorSpace.CS_sRGB), new int[] { 8, 8, 8, 8 }, 
      true, false, Transparency.TRANSLUCENT, DataBuffer.TYPE_BYTE); 

    raster = Raster.createInterleavedRaster(DataBuffer.TYPE_BYTE, 
      bufferedImage.getWidth(), bufferedImage.getHeight(), 4, null); 
    texImage = new BufferedImage(glAlphaColorModel, raster, true, 
      new Hashtable()); 

    // copy the source image into the produced image 
    Graphics g = texImage.getGraphics(); 
    g.setColor(new Color(0f, 0f, 0f, 0f)); 
    g.fillRect(0, 0, 256, 256); 
    g.drawImage(bufferedImage, 0, 0, null); 

    // build a byte buffer from the temporary image 
    // that be used by OpenGL to produce a texture. 
    byte[] data = ((DataBufferByte) texImage.getRaster().getDataBuffer()) 
      .getData(); 

    imageBuffer = ByteBuffer.allocateDirect(data.length); 
    imageBuffer.order(ByteOrder.nativeOrder()); 
    imageBuffer.put(data, 0, data.length); 
    imageBuffer.flip(); 

    return imageBuffer; 
} 
+0

我已经想通了,谢谢:) 我只是标记答案为答复的努力 – Bartvbl 2011-04-23 10:04:19

1

当施加作为纹理是不正确的,这意味着,接受的解决方案可能不会产生相同的结果对各种图像I使用由Ron但是图像的颜色上述方案。

试图修复与色彩的问题,我试图用原来的BufferedImageColorModel,它可以通过调用BufferedImage#getColorModel访问。但是,它给了我一个例外,原始图像的ColorModelWritableRaster对象不兼容。

我找了一个解决方案,我发现this之一。我不使用Raster.createInterleavedRaster创建WritableRaster,而是使用ColorModel#createCompatibleWritableRaster

希望这会有所帮助。这里是代码:

public static ByteBuffer load(BufferedImage bufferedImage) { 

    WritableRaster raster = bufferedImage.getColorModel().createCompatibleWritableRaster 
     (bufferedImage.getWidth(), bufferedImage.getHeight()); 
    BufferedImage textureImage = new BufferedImage(bufferedImage.getColorModel(), raster, 
     true, new Hashtable<>()); 

    Graphics graphics = textureImage.getGraphics(); 
    graphics.setColor(new Color(0, 0, 0)); 
    graphics.fillRect(0, 0, 256, 256); 
    graphics.drawImage(bufferedImage, 0, 0, null); 

    byte[] data = ((DataBufferByte) textureImage.getRaster().getDataBuffer()).getData(); 

    ByteBuffer imageBuffer = ByteBuffer.allocate(data.length); 
    imageBuffer.order(ByteOrder.nativeOrder()); 
    imageBuffer.put(data, 0, data.length); 
    imageBuffer.flip(); 

    return imageBuffer; 
}