C++ 更改OpenGL的值';s-z缓冲区
我想将带有深度值的矩阵传递到openGL的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值。使用该功能,您可以通过渲染全屏四元体(或者,如果您只想覆盖整个缓冲区的一个子区域,
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()
防止覆盖它。如果使用模具缓冲区,当然还应该禁用或屏蔽对其的写入