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

时间:2019-07-15 17:35:59

标签: unity3d rendering shader pipeline depth-buffer



我已经为此花了很长时间,但我无法弄清楚是否可以为 HDRP (as descibed here)创建 DepthMask 着色器。

对于我的确切用途,我试图创建一个“小孔”,其形状与所应用的材质相同,以显示在所有内容后呈现的另一台摄像机的内容。

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

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

我不太确定下一步该怎么做,我们将不胜感激!

1 个答案:

答案 0 :(得分:0)

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

HDRP Unity Depth Mask Overview

此场景中有三个对象:

  1. 将被掩盖的平面,其中一部分消失(黄色)。它确实使用HDRP Lit着色器作为透明着色器,这是他的着色器:

Masked object with HDRP Lit shader

  1. 不会被掩盖的平面。它确实使用HDRP Lit着色器作为不透明的(这是红色的)。这只是基础。

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

The Mask object with HDRP Lit shader

最终,您将需要一个具有自定义通过量组件的对象。此自定义通过量将针对您创建的自定义层:“蒙版”层,并在呈现透明通过之前用自定义材质替换其材质。这是:

Custom Pass settings

最后,这是在自定义遍历(在自定义遍历中名为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 {}
    }
}