在opengl中显示16位无符号整数

时间:2015-08-04 12:06:31

标签: c++ opengl

我想要一种简单的方法来实现这一点,但似乎是将参数变为glTexImage2D。我有一个std::vector<uint16_t> depth_buffer,在逐帧的基础上有来自kinect的深度测量。它们正好有640 x 480,每个像素一次深度测量。如果这个世界走了我的路,那么电话应该是

glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE16, 640, 480, 0, GL_LUMINANCE16, GL_UNSIGNED_SHORT, depth_buffer.data());

其中 internalFormat (第三个参数)是GL_LUMINANCE16因为它们是16位无符号整数,而格式是相同的,因为这正是数据的方式进来。 type 参数应该是GL_UNSIGNED_SHORT ...因为这些是短路而不是字节。

令人惊讶的是,如果我将其改为

glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE16, 640, 480, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, depth_buffer.data());

其中 internalFormat 仍然是GL_LUMINANCE16格式只有GL_LUMINANCE而没有16类型GL_UNSIGNED_BYTE,然后我得到某事。事情显然被忽略了,但只是改为GL_UNSIGNED_SHORT并没有削减它。

根据您阅读的文档,格式(第二个GL_LUMINANCE)可能会或不会允许16之后(任何人都知道原因?实验似乎证实了这一点) )。但我主要担心的是GL_UNSIGNED_**SHORT**似乎无效(全黑或全白),具体取决于 internalFormat - 格式组合。

我在这里尝试了大量的组合,我正在寻找正确的方法。有人建议实现这个目标吗?我并不反对使用fbo,但如果可能的话,我真的想避免使用它......因为它绝对应该是可行的。

2 个答案:

答案 0 :(得分:4)

我不打扰GL_LUMINANCE,这是旧版OpenGL的一个过时功能(不,严重的,不使用它)。在现代环境中,您可以使用:

  • 内部格式GL_R16。所有这些意味着“一个通道,16位,标准化”。

  • 格式GL_RED。 (格式不是大小,因此GL_LUMINANCE16在这里是非法的,GL_R16也是非法的。)

  • 输入GL_UNSIGNED_SHORT

答案 1 :(得分:2)

(第二个)格式参数仅用于告知数据中包含的,而不是如何布局。因此, GL_LUMINANCE16 是要传递给格式参数的无效标记(仅允许 internalformat 参数)。

要解压缩数据的布局由类型参数控制到glTexImage 用于解压缩的像素存储设置 glPixelStorei 对于 GL_UNPACK_ ... 参数。很可能你的“跳过”是由于不匹配的像素存储解包参数造成的。