Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/146.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的值';s-z缓冲区_C++_Opengl_Depth Buffer_Zbuffer - Fatal编程技术网

C++ 更改OpenGL的值';s-z缓冲区

C++ 更改OpenGL的值';s-z缓冲区,c++,opengl,depth-buffer,zbuffer,C++,Opengl,Depth Buffer,Zbuffer,我想将带有深度值的矩阵传递到openGL的z缓冲区中。我发现我可以使用glDrawPixels(640480,GL_DEPTH_组件,GL_FLOAT,normalizedMappeddedPthmat.ptr()); 其中mat是opencv mat。是否可以使用纹理绑定更改OpenGL中的z缓冲区值?如果可以,如何更改?通过可编程管道,可以写入片段着色器中的gl\u FragCoord,有效地设置每像素z值。使用该功能,您可以通过渲染全屏四元体(或者,如果您只想覆盖整个缓冲区的一个子区域,

我想将带有深度值的矩阵传递到openGL的z缓冲区中。我发现我可以使用
glDrawPixels(640480,GL_DEPTH_组件,GL_FLOAT,normalizedMappeddedPthmat.ptr());


其中mat是opencv mat。是否可以使用纹理绑定更改OpenGL中的z缓冲区值?如果可以,如何更改?

通过可编程管道,可以写入片段着色器中的
gl\u FragCoord
,有效地设置每像素z值。使用该功能,您可以通过渲染全屏四元体(或者,如果您只想覆盖整个缓冲区的一个子区域,则可以执行“渲染到深度缓冲区”(render to depth buffer)功能,从而非常轻松地实现该功能。使用合理的现代GL,您将能够使用单通道纹理格式,并具有足够的精度,如GL_R32F。对于较旧的GL版本,可以手动将标准8位纹理的RGB或RGBA通道组合为24或32位值

然而,你必须考虑一些小细节。只有启用了
GL\u depth\u测试
时,才会写入深度缓冲区。当然,这可能会丢弃一些片段(如果之前没有清除深度缓冲区)。解决此问题的一种方法是在深度缓冲区渲染期间将
glDepthFunc()
设置为
GL\u ALWAYS

还必须记住,渲染写入所有缓冲区,而不仅仅是深度缓冲区。如果不想修改颜色缓冲区,可以将
glDrawBuffer()
设置为
GL\u NONE
,也可以使用
glColorMask()
防止覆盖它。如果使用模具缓冲区,当然还应该禁用或屏蔽对其的写入