C++ 在opengl中显示16位无符号整数
我想用一种简单的方法来实现这一点,但似乎是在修改参数。我有一个C++ 在opengl中显示16位无符号整数,c++,opengl,C++,Opengl,我想用一种简单的方法来实现这一点,但似乎是在修改参数。我有一个std::vector depth_buffer,在逐帧的基础上,有来自kinect的深度测量。其中有640x480个,每像素一个深度测量。如果世界按照我的方式发展,那就应该是 glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE16, 640, 480, 0, GL_LUMINANCE16, GL_UNSIGNED_SHORT, depth_buffer.data()); 其中internalFo
std::vector depth_buffer
,在逐帧的基础上,有来自kinect的深度测量。其中有640x480个,每像素一个深度测量。如果世界按照我的方式发展,那就应该是
glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE16, 640, 480, 0, GL_LUMINANCE16, GL_UNSIGNED_SHORT, depth_buffer.data());
其中internalFormat(第三个参数)是GL\u LUMINANCE16
,因为它们是16位无符号整数,而format是相同的,因为这正是数据的输入方式。类型参数应该是GL\u UNSIGNED\u SHORT
…因为它们是短字符而不是字节
令人惊讶的是,如果我把它改成
glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE16, 640, 480, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, depth_buffer.data());
如果internalFormat仍然是GL\u LUMINANCE16
,格式只是GL\u LUMINANCE16
,没有16
,类型是GL\u UNSIGNED\u BYTE
,那么我得到一些东西。事情显然被跳过了,但仅仅更改为GL\u UNSIGNED\u SHORT
并不能解决问题
根据您阅读的文档,格式(第二个GL_亮度
)可能允许也可能不允许后面的16
(有人知道为什么吗?实验似乎证实了这一点)。但我主要关心的是,为什么GL\u UNSIGNED\u**SHORT**
似乎无效(全黑或全白),这取决于内部格式-格式组合
我在这里尝试了大量猥亵的组合,我正在寻找正确的方法。有人对实现这一目标有什么建议吗?我并不反对使用fbo,但如果可能的话,我真的希望避免使用它……因为它肯定是可行的。第二个格式参数仅用于说明数据中包含的内容,而不是数据的布局方式。因此,GL_LUMINANCE16是传递给format参数的无效标记(仅允许用于internalformat参数)
数据解包的布局由GLTEXAGE的类型参数和glPixelStorei为GLU解包参数设置的解包像素存储设置控制。您的“跳过”很可能是由于像素存储解包参数不匹配造成的。我不会为
GL\u亮度
而烦恼,它是OpenGL旧版本中过时的功能(不,说真的,不要使用它)。在现代环境中,您可以使用:
- 内部格式
。所有这一切意味着“一个通道,16位,标准化”GL_R16
- 格式
。(格式没有大小,因此GL\u RED
在这里是非法的,GL_LUMINANCE16
也非法。)GL_R16
- 键入
GL\u UNSIGNED\u SHORT
GL\u UNSIGNED\u BYTE
会显示与以前相同的跳过模式,只是现在所有内容都是红色。这有道理吗?我玩了一些GL_R16UI
和其他一些,但也没有骰子。还有其他想法吗?不管怎样,感谢您的回复和提示GL_LUMINANCE
:)纹理中的最小值和最大值是多少?有没有可能它不是黑色的,只是真的很暗?嗯,你肯定知道这里有什么东西。它应该是min=0
和max=65535
,因为它们是USHORT。我将数据转换为depth[I]=65535-depth[I]
,得到了一些看似合法的东西,尽管本质上非常红色;)我想也许把gldeptrange
改成0-65535
可以解决这个问题,但那没有任何帮助。我是否应该尝试找到一种方法,通过GL将事物映射到0-1?我真的不想修改深度数据本身,因为它稍后将用于实际项目;)我正要回答,但老实说,听起来您并没有阅读任何文档,而是依赖于函数和常量名。请阅读文件。例如,在Kinect文档中,它将解释它在深度缓冲区中放置的内容(freenect提供物理mm或原始11位数据,但从未规范化16位数据)。OpenGL文档解释了gldeptrange()
更改光栅化器的深度输出。而glTexImage2D()
文档解释了哪些格式和类型是允许的或不允许的。我知道这些是因为我读了文件。很抱歉你觉得我在浪费你的时间。在提出问题之前,我已经为此工作了大约4天。我使用11位模式,但libfreenect将其填充为16位(10bit也是如此)。可能是65535(表示测量错误,例如数据包丢失)。0表示超出范围。无论如何,你给我的已经够多了。我会继续修补它gldeptrange()
是一个疏忽,主要是出于绝望。请注意,我特别引用了文档,并询问为什么格式不能有16。不管怎样,谢谢你帮我把事情朝着好的方向发展,迪特里希。