使用 URP 自定义着色器

问题描述 投票:0回答:1

我正在为网格使用自定义着色器,这基本上是其他网格的“视线阻挡器”。 您看不到网格本身,并且它后面的所有其他网格都被它遮挡。 Proper occlusion example

现在我根据Unity的文档将项目升级到Universal Render Pipeline: https://docs.unity3d.com/Packages/[电子邮件受保护]/manual/InstallURPIntoAProject.html

不幸的是,着色器似乎与 URP 不兼容,导致“视线阻挡器”显示其后面的网格像素,但在旋转/移动视口时也会移动: Strange Occlusion example

由于我没有任何着色器经验,您能否支持我将着色器转换为与 URP 一起使用(或者可能是 URP 本身的配置问题?)。

Shader "Custom/InvisibleStencilShader"
{
    SubShader
    {
        // Make sure this shader is rendered before others
        Tags { "Queue" = "Geometry-1" }

        // This pass will write to the stencil buffer
        Pass
        {
            // Disable color buffer writes
            ColorMask 0
            // Write a value of 1 to the stencil buffer
            Stencil
            {
                Ref 1
                Comp Always
                Pass Replace
            }
        }
    }
}

提前致谢

unity-game-engine rendering shader mesh urp
1个回答
0
投票

我想通了,想让你知道我最后是如何解决的。

基本上我在这里找到了关于 urp 模板缓冲区的参考教程: https://bdts.com.au/tips-and-resources/unity-create-windows-portals-using-stencils-with-the-universal-render-pipeline-urp.html

以下步骤即可达到预期效果:

  1. 将每个应被遮挡的网格放在名为“HiddenObjects”的新层上。

  2. 将遮罩网格(遮挡其他网格)放在名为“遮罩”的新层上。

  3. 从 URP 资源的渲染中排除新创建的图层: Exclude new masks from URP Asset

  4. 使用以下设置将名为“HiddenObjects”和“Mask”的新渲染器功能添加到 URP 资源中: New Renderer Features with their settings

  5. 最后但并非最不重要的一点是,使用新材质将以下着色器添加到遮罩游戏对象(以隐藏遮罩网格):

.

Shader "Custom/StencilMask"
{
    SubShader
    {
        Pass
        {
            ZWrite Off
        }
    }
}

这个解决方案有一个小小的权衡,但它对我来说和以前一样好:只有平面网格物体正确遮挡,实体网格物体不知何故不起作用。 最终结果现在看起来像这样: final result

© www.soinside.com 2019 - 2024. All rights reserved.