【问题标题】:Doing a per-fragment DEPTH_TEST in OpenGL在 OpenGL 中执行每个片段的 DEPTH_TEST
【发布时间】:2019-10-15 21:24:15
【问题描述】:

我可以使用glEnable( GL_DEPTH_TEST ); 在 OpenGL 中打开/关闭深度测试 但这会打开/关闭整个绘图调用的测试。

我想控制每个片段的测试。

这是为了达到以下效果:在棋盘模式中,图元的一半像素可能被遮挡,但另一半始终被绘制,即使帧缓冲区中有遮挡对象离相机更近。

为了说明,请看这个例子,其中只有一半的金字塔像素可能被前面的框遮挡。

注意先绘制红色框,绘制绿色金字塔时已经在帧缓冲区中。

另外注意:我会最后绘制带有特殊深度测试的物体,所以不会出现先绘制红框的情况。

出于我的目的,以这种方式绘制的所有对象都是凸面的,并且永远不会遮挡自身。

我知道如何在片段着色器中获得棋盘图案:

                float xm2 = mod( gl_FragCoord.x, 2.0 );
                float ym2 = mod( gl_FragCoord.y, 2.0 );
                if ( int(xm2) != int(ym2) )
                        discard;

但就我而言,我不想在每个片段的基础上完全丢弃,我只想在每个片段的基础上切换深度测试。

我的目标是 OpenGL-ES 3.0。

【问题讨论】:

  • 这根本不是深度测试的工作方式。你所要求的只是不可能的。您可以通过执行两个绘图调用并在其间切换深度测试来实现这样的效果,每个只绘制一组棋盘图案(即使用模板缓冲区,在 FS 中丢弃也可以,只是效率低得多)。另一种方法可能只是将 gl_FragDepth 设置为 0 以用于那些您希望始终通过测试的片段。
  • "为了说明,请看这个例子,其中金字塔的一半像素可能被前面的框遮挡。" 那么,你到底想要什么如果以相反的顺序绘制对象会发生什么?
  • 如果对象的一部分与自身重叠会发生什么?
  • 我认为这个 XY 问题的 X 是一种情况,即 OP 希望能够部分地查看一个对象,即使它被前景的东西遮住了。例如在高尔夫比赛中击球时,即使前面有风景,您也想看到球。我认为@derhass gl_FragDepth 的建议将解决 OPs 的问题,应该作为一个 andwer 提供。
  • @derhass 您的第一个建议对我有用。如果你写出来,我会把它标记为答案。将深度设置为 0 不适合我的应用程序,因为我需要完整的 z 缓冲区来进行对象拾取。

标签: opengl-es fragment-shader opengl-es-3.0 depth-testing


【解决方案1】:

这很容易通过绘制(红色)网格两次来实现:

  • 首先正常绘制,所有片段,启用深度测试。
  • 接下来再次绘制它,不进行深度测试,并丢弃一半的片段。

@derhass 的评论提示了解决方案。

【讨论】:

    猜你喜欢
    • 2017-04-14
    • 1970-01-01
    • 2012-12-29
    • 1970-01-01
    • 1970-01-01
    • 2012-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多