1

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

为了得到一个数组,其中每个索引代表 1 个像素,我将字节数组中的所有位存储到 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 位。如何缩放/告诉 OpenGL 值 1023 表示白色,值 0 表示黑色?

或者 :

有没有一种方法可以直接将 ImgData 作为 ByteArray 输入,OpenGL 执行一些魔术并从存储在 ByteArray 中的每 10 位中创建 1 个像素?我读过一些关于 glPixelStore、像素打包/解包等的内容,但我不知道这是否真的能够满足我的需要以及如何使用它。

4

1 回答 1

2

你没有。

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

此外,OpenGL 也不能存储这样的像素数据;没有GL_LUMINANCE10GL_R10 图像格式。您可以将其存储为某种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)进行上传。并且不要忘记无符号整数的字节序问题。

于 2013-07-22T18:54:29.980 回答