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