7

LWJGL ライブラリを使用して、openGL のテクスチャとして画像を読み込もうとしています。これまでにわかったことから、テクスチャを ByteBuffer として openGL に渡す必要があります。私が今持っているのは、画像を正しくロードして BufferedImage オブジェクトに保存するコードです。問題は、BufferedImage から、openGL で使用するための適切な形式のデータを含む ByteBuffer に取得する方法がわからないことです (関数 GL11.glTexImage2D() の入力として)。助けていただければ幸いです。

4

4 に答える 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 に答える