Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在opengl中显示16位无符号整数_C++_Opengl - Fatal编程技术网

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旧版本中过时的功能(不,说真的,不要使用它)。在现代环境中,您可以使用:

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

  • 格式
    GL\u RED
    。(格式没有大小,因此
    GL_LUMINANCE16
    在这里是非法的,
    GL_R16
    也非法。)

  • 键入
    GL\u UNSIGNED\u SHORT


好的,这在某种意义上对format参数是有意义的。事实上,跳过是因为我告诉它在短字节时使用字节。Hmmmm。你的建议在理论上是有意义的,而且你的格式与datenwolf的回答一致。但是,使用这些参数会显示所有黑色:/更改为
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。不管怎样,谢谢你帮我把事情朝着好的方向发展,迪特里希。