2011-03-04 128 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; 
}