在 OpenGL 中对每个片段进行 DEPTH_TEST

Doing a per-fragment DEPTH_TEST in OpenGL

我可以使用 glEnable( GL_DEPTH_TEST ); 在 OpenGL 中切换深度测试 on/off 但这会切换整个绘图调用的测试 on/off。

我想在每个片段的基础上控制测试。

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

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

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

另请注意:我会在最后绘制特殊深度测试的对象,因此不会出现先绘制红框的情况。

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

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

                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。

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

  • 首先正常绘制,所有片段,启用深度测试。
  • 接下来再画一遍,没有 depth-test,并丢弃一半的片段。

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