You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

URP适配求助:自定义隐形模板着色器失效问题

适配URP的隐形模板遮挡着色器解决方案

适配后的URP兼容着色器代码

原着色器基于Unity内置管线编写,URP需要显式的HLSL结构和管线标签支持,以下是修改后的完整代码:

Shader "Custom/URP_InvisibleStencilShader"
{
    Properties
    {
        // 空属性块,符合URP着色器结构规范
    }

    SubShader
    {
        Tags 
        { 
            "Queue" = "Geometry-1" 
            "RenderType" = "Opaque"
            "RenderPipeline" = "UniversalPipeline" // 标记为URP兼容管线
        }

        Pass
        {
            Name "StencilWritePass"
            Tags { "LightMode" = "SRPDefaultUnlit" } // 指定URP的无光照通道

            ColorMask 0 // 禁止写入颜色缓冲,保持隐形
            ZWrite On // 开启深度写入,解决视口变换时的错位问题
            ZTest LEqual

            Stencil
            {
                Ref 1
                Comp Always
                Pass Replace
            }

            HLSLPROGRAM
            #pragma vertex vert
            #pragma fragment frag

            // 引入URP核心函数库
            #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"

            struct Attributes
            {
                float4 positionOS : POSITION;
            };

            struct Varyings
            {
                float4 positionHCS : SV_POSITION;
            };

            Varyings vert(Attributes input)
            {
                Varyings output;
                // URP标准的模型空间到裁剪空间转换
                output.positionHCS = TransformObjectToHClip(input.positionOS.xyz);
                return output;
            }

            half4 frag(Varyings input) : SV_Target
            {
                return half4(0,0,0,0); // 空输出,配合ColorMask 0实现完全隐形
            }
            ENDHLSL
        }
    }
    // 指定URP默认 fallback
    FallBack "Hidden/Universal Render Pipeline/FallbackError"
}

关键改动说明

  • 添加RenderPipeline标签:明确告知Unity该着色器适配URP,避免管线兼容问题
  • 补充HLSL着色器结构:URP不再支持内置管线的固定函数模式,必须实现显式的顶点/片段着色器
  • 开启深度写入:原着色器未设置ZWrite,URP下深度缓冲更新不及时会导致视口旋转/移动时的错位
  • 指定LightMode:URP要求每个Pass必须指定有效渲染通道,这里使用无光照通道SRPDefaultUnlit

URP配置排查步骤

  1. 检查渲染器模板缓冲格式
    打开URP渲染器资产(Universal Renderer Asset),确保Stencil Format设置为8 Bit(不能是None),否则模板缓冲无法正常工作。

  2. 被遮挡物体的着色器设置
    被遮挡的网格必须在其着色器中添加模板测试逻辑,示例如下(添加到对应Pass内):

    Stencil
    {
        Ref 1
        Comp NotEqual // 仅渲染模板值不等于1的像素(即未被遮挡的区域)
    }
    

    如果使用URP内置着色器,可以通过创建自定义材质变体或修改内置着色器代码来添加该逻辑。

  3. 确认渲染队列顺序
    确保遮挡器的Queue = "Geometry-1"优先级高于普通几何体(默认Geometry),URP会严格按照队列顺序渲染,保证模板缓冲先被写入再被测试。

内容的提问来源于stack exchange,提问作者FlyingPolska

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 09:42:45