在 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 的评论提示了解决方案。
我可以使用 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 的评论提示了解决方案。