LWJGL ライブラリを使用して、openGL のテクスチャとして画像を読み込もうとしています。これまでにわかったことから、テクスチャを ByteBuffer として openGL に渡す必要があります。私が今持っているのは、画像を正しくロードして BufferedImage オブジェクトに保存するコードです。問題は、BufferedImage から、openGL で使用するための適切な形式のデータを含む ByteBuffer に取得する方法がわからないことです (関数 GL11.glTexImage2D() の入力として)。助けていただければ幸いです。
6635 次
4 に答える
7
これは、スペースインベーダーの例から、あなたが望むことを行うメソッドです。(おもう)
/**
* 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;
}
于 2011-04-22T17:08:09.707 に答える
2
前の回答に対するより直接的なアプローチは、 を使用image.getRGB
してカラー モデルの変換を行うことです。以下は、Java 8ドキュメントからの抜粋ですgetRGB
。
TYPE_INT_ARGB
イメージ データの一部から、デフォルトの RGB カラー モデル ( ) およびデフォルトの sRGB カラー スペースの整数ピクセルの配列を返します。デフォルトのモデルがイメージの ColorModel と一致しない場合、色の変換が行われます。このメソッドを使用する場合、返されるデータの各カラー コンポーネントの精度は 8 ビットのみです。
public static ByteBuffer imageToBuffer(BufferedImage image) {
int[] pixels = image.getRGB(0, 0, image.getWidth(), image.getHeight(), null, 0, image.getWidth());
ByteBuffer buffer = ByteBuffer.allocateDirect(pixels.length * 4);
for (int pixel : pixels) {
buffer.put((byte) ((pixel >> 16) & 0xFF));
buffer.put((byte) ((pixel >> 8) & 0xFF));
buffer.put((byte) (pixel & 0xFF));
buffer.put((byte) (pixel >> 24));
}
buffer.flip();
return buffer;
}
返されたバッファはGL_RGBA
ですGL_UNSIGNED_BYTE
。
于 2019-01-21T16:27:32.427 に答える