更改OpenGL的z缓冲区的值

时间:2015-05-15 13:54:13

标签: c++ opengl depth-buffer zbuffer

我想将带深度值的矩阵传递到openGL的z缓冲区。Somewhere我发现我可以使用glDrawPixels(640,480,GL_DEPTH_COMPONENT,GL_FLOAT,normalizedMappedDepthMat.ptr());

其中mat是一个opencv Mat。是否可以使用纹理绑定更改OpenGL中的z-buffer值?如果是,如何?

1 个答案:

答案 0 :(得分:3)

使用可编程管道,您可以在片段着色器中写入gl_FragCoord,有效地设置每像素z值。使用该功能,您可以通过渲染全屏四边形(或其他内容,如果您只想覆盖整个缓冲区的子区域)轻松实现渲染到深度缓冲功能。使用相当现代的GL,您将能够使用具有足够精度的单通道纹理格式,如GL_R32F。使用较旧的GL版本,您可以手动将标准8Bit纹理的RGB或RGBA通道组合为24或32位值。

但是,您需要考虑一些细节。仅在启用GL_DEPTH_TEST时才会写入深度缓冲区。这当然可能会丢弃一些碎片(如果之前没有清除深度缓冲区)。解决此问题的一种方法是在深度缓冲区渲染过程中将glDepthFunc()设置为GL_ALWAYS

您还必须记住,渲染写入所有缓冲区,而不仅仅是深度缓冲区。如果您不想修改颜色缓冲区,可以将glDrawBuffer()设置为GL_NONE,也可以使用glColorMask()来覆盖颜色缓冲区。如果你使用模板缓冲区,你当然也应该禁用或屏蔽写入它。