我已经为此花了很长时间,但我无法弄清楚是否可以为 HDRP (as descibed here)创建 DepthMask 着色器。
对于我的确切用途,我试图创建一个“小孔”,其形状与所应用的材质相同,以显示在所有内容后呈现的另一台摄像机的内容。
我尝试弄乱着色器中的渲染队列,不同的ZTest和ZWrite组合以及发现的着色器的一些变体。最重要的是,我尝试弄乱了我能想到的基本HDRP着色器的每种配置,可能会有所作为。
我能得到的最接近的是使物体后面的透明材料消失。这确实意味着,如果我将所有不透明材料设置为“透明”,则会得到我想要的效果,但是这不是理想的,因为它破坏的程度大于解决的程度。理想情况下,我将能够以某种方式在不透明材料上使用HDRP透明优先级系统,但不确定是否可行。
我不太确定下一步该怎么做,我们将不胜感激!
答案 0 :(得分:0)
所以我设法找到一种方法来实现它,它使用的是“自定义通行证”:
HDRP Unity Depth Mask Overview
此场景中有三个对象:
Masked object with HDRP Lit shader
不会被掩盖的平面。它确实使用HDRP Lit着色器作为不透明的(这是红色的)。这只是基础。
将作为遮罩的平面。它有一个自定义层,我将此层命名为“ Mask”。该平面具有透明的HDRP Lit着色器,并使用深度测试:从不。这是:
The Mask object with HDRP Lit shader
最终,您将需要一个具有自定义通过量组件的对象。此自定义通过量将针对您创建的自定义层:“蒙版”层,并在呈现透明通过之前用自定义材质替换其材质。这是:
最后,这是在自定义遍历(在自定义遍历中名为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 {}
}
}