JAVA/Jogl/OpenGL 显示存储在字节数组中的 10 位图像数据

标签 java opengl jogl

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

为了获得每个索引代表 1 个像素的数组,我将字节数组中的所有位存储到 BitSet 中,并将 BitSet 中的所有位存储到整数数组中

我之前只通过创建 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、像素打包/解包等的内容,但我不知道这是否真的能够满足我的需要以及如何使用它。

最佳答案

你不知道。

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)。并且不要忘记无符号整数的字节序问题。

关于JAVA/Jogl/OpenGL 显示存储在字节数组中的 10 位图像数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17789781/

相关文章:

c# - OpenTK 多线程?

c - OpenGL - 从模型 View 矩阵获取翻译参数

java - OpenGL 的关键。 Java/斯卡拉/ python

java - JOGL透明背景

java - 如何从苹果全局开发者证书和 .p12 文件中提取公钥和私钥?

java - 将KeyListener添加到Jpanel

java - selectitem 和 selectitems 标签的区别

java - 为什么要返回 Iterator 低耦合 (OOP)?

python - 是否可以将 3D 模型导入 pyglet?