【问题标题】:Change the values of OpenGL's z-buffer改变 OpenGL 的 z-buffer 的值
【发布时间】:2015-05-15 13:54:13
【问题描述】:
我想将一个带有深度值的矩阵传递到openGL的z-buffer中。Somewhere我发现我可以使用glDrawPixels(640,480,GL_DEPTH_COMPONENT,GL_FLOAT,normalizedMappedDepthMat.ptr());
其中 mat 是一个 opencv Mat。是否可以使用纹理绑定更改 OpenGL 中的 z-buffer 值?如果可以,如何?
【问题讨论】:
标签:
c++
opengl
depth-buffer
zbuffer
【解决方案1】:
使用可编程管道,您可以在片段着色器中写入gl_FragCoord,有效地设置每个像素的 z 值。使用该功能,您可以通过渲染全屏四边形(或其他内容,如果您只想覆盖整个缓冲区的子区域)轻松实现渲染到深度缓冲区功能。使用相当现代的 GL,您将能够使用具有足够精度的单通道纹理格式,例如 GL_R32F。对于较旧的 GL 版本,您可以手动将标准 8 位纹理的 RGB 或 RGBA 通道组合为 24 位或 32 位值。
但是,您必须考虑一些小细节。只有在启用GL_DEPTH_TEST 时才会写入深度缓冲区。这当然可能会丢弃您的一些片段(如果之前未清除深度缓冲区)。解决此问题的一种方法是在深度缓冲区渲染期间将 glDepthFunc() 设置为 GL_ALWAYS。
您还必须记住,渲染写入到所有缓冲区,而不仅仅是深度缓冲区。如果不想修改颜色缓冲区,可以将glDrawBuffer()设置为GL_NONE,也可以使用glColorMask()防止覆盖。当然,如果您使用模板缓冲区,您还应该禁用或屏蔽对其的写入。