1

USB 経由で 10 ビットのピクセル (グレースケール) を取得し、それらをバイト配列に格納しています。たとえば、最初のバイト (imgData[0]) には、最初のピクセルの最初の 8 ビットが含まれます。2 番目のバイト (imgData[1]) には、最初のピクセルの最後の 2 ビットと 2 番目のピクセルの最初の 6 ビットが含まれます。

各インデックスが 1 ピクセルを表す配列を取得するために、bytearray のすべてのビットを BitSet に格納し、BitSet から Integer 配列に格納しました

以前は、byteBuffer を作成して 8 ビット イメージのみをテクスチャとして表示していました。

private static ByteBuffer buffer;

包んだ

buffer = ByteBuffer.wrap(imgData);

と使用

gl.glTexImage2D(GL2.GL_TEXTURE_2D, 0, 1, 1280, 1024, 0,
                GL2.GL_LUMINANCE, GL2.GL_UNSIGNED_BYTE, buffer);

10 ビット データを使用する必要がある場合は、おそらく IntBuffer を使用する必要があり、32 ビットを使用できます。しかし、私は10ビットしか必要としません。1023 の値が白を意味し、値 0 が黒を意味することを OpenGl にスケーリング/伝えるにはどうすればよいですか?

または:

ImgData を ByteArray として直接入力し、OpenGL が何らかの魔法を実行して、ByteArray に格納されている 10 ビットごとに 1 ピクセルを作成する方法はありますか? glPixelStore、ピクセルのパッキング/アンパッキングなどについて読んだことがありますが、これが本当に必要なことを実行できるかどうか、およびこれを使用する方法がわかりませんでした。

4

1 に答える 1

2

あなたはそうしない。

OpenGL のピクセル転送システムは、バイト単位で整列されていないピクセル データを処理できません。10 ビット ピクセルの配列を持つことはできません。すべてのピクセルはバイト境界で開始する必要があります。

さらに、OpenGL はそのようなピクセル データも保存できません。GL_LUMINANCE10またはGL_R10 画像フォーマットがありません。フォーマットで保存することはできますがGL_RGB10_A2、それはまだ問題です。

最善の方法は、10 ビット ピクセルの配列を前処理し、各ピクセルを 32 ビット RGB10_A2 形式に変換することです (10 ビットを複製し、アルファをフルに設定します)。次に、GL_RGBA のピクセル転送フォーマットとピクセル転送タイプGL_UNSIGNED_INT_10_10_10_2(または、パフォーマンス上の理由から、おそらくGL_UNSIGNED_INT_2_10_10_10_REV) でアップロードできます。また、符号なし整数のエンディアンの問題についても忘れないでください。

于 2013-07-22T18:54:29.980 に答える