在Open GL中,是否可以启用具有常规深度测试的多边形,但是当实际上将深度缓冲区值写入深度缓冲区时,我想编写一个自定义值?
(原因是我要渲染一个粒子系统,该系统应与场景中的几何形状进行深度测试,但是我想在粒子系统所在的地方写一个非常大的深度值,从而利用深度 - 模糊后处理步骤,以进一步模糊粒子系统)
更新为了进一步完善这个问题,是否可以在多个通行证中渲染的情况下可能会有可能吗?
你不。
OpenGl不允许您 lie 。深度测试测试深度缓冲区中的值与要写入深度缓冲区的输入值。测试通过后,测试的深度值将写入深度缓冲区。时期。
您无法(AB)使用深度测试来执行除测试深度值以外的其他操作。
arb_conservative_depth/gl 4.2确实允许您非常有限的形式。基本上,您保证实现只会以使其比原始值更小或更大的方式更改深度。但是即使到那时,它也只能在特定情况下工作,然后只有在您指定的限制范围内只有时间。
执行早期片段测试将同样不允许您这样做。该规范明确指出,在您的着色器执行之前,深度将写成。因此,您写入gl_FragDepth
的任何内容都将被忽略。
单一通过的一种方法是进行深度测试"手动"。
将glDepthFunc
设置为GL_ALWAYS
然后在片段着色器中,采样深度缓冲区的当前值,并根据 discard;
要采样深度缓冲区的当前值,您要么需要ARM_shader_framebuffer_fetch_depth_stencil
(通常在移动平台上)或NV_texture_barrier
。然而,如果同一绘制的多个彼此渲染的多个粒子将产生未定义的结果,而在这种情况下,前者将使用在同一位置呈现的最后一个粒子的书面深度值。
您也可以在渲染粒子之前将当前深度缓冲区复制到深度纹理中,而无需任何扩展,然后将深度纹理用于手动深度测试。这也避免了彼此呈现的粒子会干扰,因为它们都将使用旧的深度值进行手动测试。
您可以使用fragment着色器中的gl_fragdepth来编写您的自定义值。
gl_FragDepth = 0.3;
https://www.khronos.org/registry/opengl-refpages/gl4/html/gl_fragdepth.xhtml