在 Open GL 中,是否可以在启用常规深度测试的情况下渲染多边形,但是当深度缓冲区值实际写入深度缓冲区时,我想写入自定义值?
(原因是我正在渲染一个粒子系统,应该针对场景中的几何体进行深度测试,但我想在粒子系统所在的位置写一个非常大的深度值,从而利用深度模糊后期进一步模糊粒子系统的处理步骤)
更新 为了进一步细化这个问题,是否可以不进行多次渲染?
在 Open GL 中,是否可以在启用常规深度测试的情况下渲染多边形,但是当深度缓冲区值实际写入深度缓冲区时,我想写入自定义值?
(原因是我正在渲染一个粒子系统,应该针对场景中的几何体进行深度测试,但我想在粒子系统所在的位置写一个非常大的深度值,从而利用深度模糊后期进一步模糊粒子系统的处理步骤)
更新 为了进一步细化这个问题,是否可以不进行多次渲染?
你没有。
OpenGL 不允许你说谎。深度测试根据要写入深度缓冲区的传入值测试深度缓冲区中的值。一旦该测试通过,测试的深度值将被写入深度缓冲区。时期。
除了测试深度值之外,您不能(ab)使用深度测试来做其他事情。
ARB_conservative_depth/GL 4.2确实允许您使用非常有限的形式。基本上,您向实现承诺您只会以使其小于或大于原始值的方式更改深度。但即便如此,它也只能在特定情况下起作用,而且只要你保持在你指定的范围内。
强制执行早期片段测试同样不允许您这样做。规范明确指出深度将在着色器执行之前写入。所以你写的任何东西gl_FragDepth
都会被忽略。
一次通过的一种方法是“手动”进行深度测试。
设置glDepthFunc
为GL_ALWAYS
然后在片段着色器中,对深度缓冲区的当前值进行采样,并根据它丢弃片段使用discard;
要对深度缓冲区的当前值进行采样,您需要ARM_shader_framebuffer_fetch_depth_stencil
(通常在移动平台上)或NV_texture_barrier
. 然而,如果同一个 drawcall 的多个粒子在彼此之上渲染,则后者将产生未定义的结果,而在这种情况下,前者将使用在同一位置渲染的最后一个粒子的写入深度值。
您也可以在渲染粒子之前将当前深度缓冲区复制到深度纹理中,然后使用该深度纹理进行手动深度测试,从而无需任何扩展。这也避免了相互叠加渲染的粒子会产生干扰,因为它们都将使用旧的深度值进行手动测试。
您可以在片段着色器中使用 gl_FragDepth 来编写您的自定义值。
gl_FragDepth = 0.3;
https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/gl_FragDepth.xhtml