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