与用于深度比较的值相比,如何编写对深度缓冲区的值



在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

相关内容

  • 没有找到相关文章

最新更新