是否可以在Unity的HDRP中创建DepthMask效果?

Jos*_*ley 3 shader rendering pipeline unity-game-engine depth-buffer



我已经为此苦苦挣扎了一段时间,但我无法弄清楚是否可以为HDRP创建一个DepthMask着色器(如此处所述)

对于我的确切用途,我试图在应用了材质的任何形状上创建一个“洞”,以显示在所有内容后面渲染的不同相机的内容。

我尝试摆弄着色器内的渲染队列、不同的 ZTest 和 ZWrite 组合,以及我发现的着色器的一些变体。最重要的是,我尝试摆弄我能想到的基本 HDRP 着色器的每个配置,这可能会有所作为。

我能得到的最接近的结果是使物体后面的透明材料消失。这确实意味着,如果我将所有不透明材质设置为透明,我会得到我想要的效果,但这并不理想,因为它破坏的东西比解决的东西多。理想情况下,我能够以某种方式在不透明材质上使用 HDRP 透明优先级系统,但我不确定这是否可行。

我不太确定下一步要尝试什么,任何帮助将不胜感激!

小智 7

所以我设法找到一种方法来实现这一点,它是使用自定义通行证:

HDRP Unity 深度掩模概述

该场景中有三个物体:

  1. 一架飞机将被遮盖,并且其一部分消失(这是黄色的)。它确实使用 HDRP Lit 着色器作为透明,这是他的着色器:

使用 HDRP Lit 着色器遮罩对象

  1. 一架不​​会被掩盖的飞机。它确实使用 HDRP Lit 着色器作为不透明的(它是红色的)。这只是基本的。

  2. 一架飞机将成为面具。它有一个自定义图层,我将此图层命名为“Mask”。该飞机的 HDRP Lit 着色器是透明的,并且使用深度测试:从不。这里是 :

具有 HDRP Lit 着色器的 Mask 对象

最终,您将需要一个具有自定义通道体积组件的对象。此自定义通道体积将以您创建的自定义图层为目标:“蒙版”图层,并在渲染透明通道之前将其材质替换为自定义材质。这里是 :

自定义通行证设置

最后,这是在自定义通道中插入的材质上使用的着色器代码(自定义通道中名为 StencilMask 的材质):

Shader "Custom/Stencil/MaskStencil"
{
    SubShader {
        // Render the mask after regular geometry, but before masked geometry and
        // transparent things.
 
        Tags {"Queue" = "Geometry+10" }
 
        // Don't draw in the RGBA channels; just the depth buffer
 
        ColorMask 0
        ZWrite On
 
        // Do nothing specific in the pass:
 
        Pass {}
    }
}
Run Code Online (Sandbox Code Playgroud)