在Unity的HDRP中是否可以创建深度遮罩效果?

3
我已经苦思冥想了一段时间,但我无法确定是否可以创建一个适用于 HDRP 的 DepthMask 着色器(如此描述)

对于我的确切用途,我正在尝试创建一个“孔”,该孔的形状显示在应用材质的任何物体中,以显示在所有内容后面呈现的不同相机的内容。

我尝试通过着色器内的渲染队列、不同的 ZTest 和 ZWrite 组合以及我发现的着色器的一些变化来进行调整。除此之外,我还尝试了我能想到可能会做些什么的所有基本 HDRP 着色器的配置。
我所能做的最接近的效果是让物体后面的透明材料消失。这意味着,如果我将所有不透明材料设为透明,则可以获得所需的效果,但这并不理想,因为它解决了更多的问题。理想情况下,我希望能在不透明材料上使用HDRP透明优先级系统,但我不确定是否可能。

我不太确定接下来该尝试什么,任何帮助将不胜感激!
1个回答

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 {}
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接