Opengl es 在OpenGL中进行每片段深度测试

Opengl es 在OpenGL中进行每片段深度测试,opengl-es,fragment-shader,opengl-es-3.0,depth-testing,Opengl Es,Fragment Shader,Opengl Es 3.0,Depth Testing,我可以使用glEnable(GL\u depth\u TEST)在OpenGL中打开/关闭深度测试 但这会为整个draw调用打开/关闭测试 我想在每个片段的基础上控制测试 这是为了实现以下效果:在棋盘模式中,基本体的一半像素可能被遮挡,但另一半始终被绘制,即使帧缓冲区中存在更靠近相机的遮挡对象 要进行说明,请参见此示例,其中只有金字塔的一半像素可能被其前面的框遮挡 请注意,首先绘制的是红色框,绘制绿色棱锥体时,红色框已经在帧缓冲区中 另外请注意:我将最后使用特殊深度测试绘制对象,因此不会出现先绘

我可以使用
glEnable(GL\u depth\u TEST)在OpenGL中打开/关闭深度测试
但这会为整个draw调用打开/关闭测试

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

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

要进行说明,请参见此示例,其中只有金字塔的一半像素可能被其前面的框遮挡

请注意,首先绘制的是红色框,绘制绿色棱锥体时,红色框已经在帧缓冲区中

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

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

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

                float xm2 = mod( gl_FragCoord.x, 2.0 );
                float ym2 = mod( gl_FragCoord.y, 2.0 );
                if ( int(xm2) != int(ym2) )
                        discard;
但在我的例子中,我不想在每个片段的基础上完全放弃,我只想在每个片段的基础上切换深度测试


我的目标是OpenGLES3.0

这可以通过绘制(红色)网格两次轻松实现:

  • 首先正常绘制所有碎片,启用深度测试
  • 下一步,在没有深度测试的情况下再次绘制,并丢弃一半碎片

这个解决方案是由@derhass的评论提出的。

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