我想传递一个具有深度值的矩阵到openGL的z缓冲区。在某处我发现我可以使用:
glDrawPixels(640,480,GL_DEPTH_COMPONENT,GL_FLOAT,normalizedMappedDepthMat.ptr());
…在OpenGL中使用纹理绑定是否可以改变z缓冲值?如果是这样,如何?
使用可编程管道,您可以在片段着色器中写入gl_FragDepth
,有效地设置每个像素的z值。有了这个特性,你可以很容易地通过渲染一个全屏四边形来实现渲染到深度缓冲区的特性(或者其他东西,如果你只想覆盖整个缓冲区的一个子区域)。使用相当现代的GL,您将能够使用具有足够精度的单通道纹理格式,如GL_R32F。对于较旧的GL版本,您可以手动将标准8Bit纹理的RGB或RGBA通道组合为24或32位值。
然而,有一些小细节你必须考虑进去。只有在启用GL_DEPTH_TEST
时才会写入深度缓冲区。当然,这可能会丢弃一些片段(如果深度缓冲区之前没有被清除)。解决这个问题的一种方法是在深度缓冲渲染期间将glDepthFunc()
设置为GL_ALWAYS
。
您还必须记住,渲染写入所有缓冲区,而不仅仅是深度缓冲区。如果不想修改颜色缓冲区,可以将glDrawBuffer()
设置为GL_NONE
,或者可以使用glColorMask()
来防止覆盖它。如果使用模板缓冲区,当然也应该禁用或屏蔽对它的写入。