【问题标题】: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()防止覆盖。当然,如果您使用模板缓冲区,您还应该禁用或屏蔽对其的写入。

    【讨论】:

      猜你喜欢
      • 2016-11-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-24
      • 2016-05-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多