我想要一种简单的方法来实现这一点,但似乎是将参数变为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,但如果可能的话,我真的想避免使用它......因为它绝对应该是可行的。
答案 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_ ... 参数。很可能你的“跳过”是由于不匹配的像素存储解包参数造成的。