我通过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打包/拆包等的内容,但我无法弄清楚这是否真的能够做我需要的以及如何使用它。
答案 0 :(得分:2)
你没有。
OpenGL的pixel transfer system无法处理非字节对齐的像素数据。你不能有一个10位像素的数组;每个像素必须从字节边界开始。
此外,OpenGL也不能存储这样的像素数据;没有GL_LUMINANCE10
或GL_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问题。