JAVA / Jogl / OpenGL显示10位imageData,存储在字节数组中

时间:2013-07-22 14:11:30

标签: java opengl jogl

我通过USB获得10位像素(灰度)并将它们存储在一个字节数组中。 因此,例如第一个字节(imgData [0])包含第一个像素的前8位。第二个字节(imgData [1])包含第一个像素的最后2位和第二个像素的前6位等...

要获得一个数组,其中每个索引代表1个像素,我将所有位从bytearray存储到BitSet中,并从BitSet存储到整数数组

我之前只创建了一个8位图像作为纹理,创建了一个byteBuffer:

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位。如何缩放/告诉OpenGl值1023表示白色,值0表示黑色?

或者:

有没有办法可以直接输入ImgData作为ByteArray,OpenGL执行一些魔术并在ByteArray中存储的每10位中创建1个像素? 我读过一些关于glPixelStore,Pixel打包/拆包等的内容,但我无法弄清楚这是否真的能够做我需要的以及如何使用它。

1 个答案:

答案 0 :(得分:2)

你没有。

OpenGL的pixel transfer system无法处理非字节对齐的像素数据。你不能有一个10位像素的数组;每个像素必须从字节边界开始。

此外,OpenGL也不能存储这样的像素数据;没有GL_LUMINANCE10GL_R10 image format。您可以将其存储为GL_RGB10_A2格式,但这仍然是一个问题,因为

您可以做的最好的事情是预处理10位像素阵列,将每个像素转换为32位RGB10_A2格式(复制10位,并将alpha设置为完整)。然后,您可以使用GL_RGBA的像素传输格式和像素传输类型GL_UNSIGNED_INT_10_10_10_2上传(或者,出于性能原因,可能GL_UNSIGNED_INT_2_10_10_10_REV)。并且不要忘记无符号整数的endian问题。