GameTech/URP 渲染实战
源码 / Ch25/SimpleTransparent.shader
Ch25/SimpleTransparent.shader
// 对照用:最普通的逐物体半透明(简单漫反射 + Alpha 混合,不写深度)。
// 案例 25.2 用它当“玻璃”,案例 25.7 用它展示“逐物体半透明会露出内部结构”的问题。
Shader "Cookbook/Ch25/SimpleTransparent"
{
    Properties
    {
        _BaseColor ("Color", Color) = (0.3, 0.8, 1, 0.45)
    }
    SubShader
    {
        Tags { "RenderType"="Transparent" "RenderPipeline"="UniversalPipeline" "Queue"="Transparent" }
        Pass
        {
            Name "Forward"
            Tags { "LightMode"="UniversalForward" }
            Blend SrcAlpha OneMinusSrcAlpha
            ZWrite Off

            HLSLPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl"

            CBUFFER_START(UnityPerMaterial)
                float4 _BaseColor;
            CBUFFER_END

            struct Attributes { float4 positionOS : POSITION; float3 normalOS : NORMAL; };
            struct Varyings { float4 positionCS : SV_POSITION; float3 normalWS : TEXCOORD0; };

            Varyings vert(Attributes v)
            {
                Varyings o;
                o.positionCS = TransformObjectToHClip(v.positionOS.xyz);
                o.normalWS = TransformObjectToWorldNormal(v.normalOS);
                return o;
            }

            half4 frag(Varyings i) : SV_Target
            {
                Light light = GetMainLight();
                half ndl = saturate(dot(normalize(i.normalWS), light.direction)) * 0.7 + 0.3;
                return half4(_BaseColor.rgb * light.color * ndl, _BaseColor.a);
            }
            ENDHLSL
        }
    }
}