GameTech/URP 渲染实战
源码 / shaders/Ch16/XRaySilhouette.glsl
shaders/Ch16/XRaySilhouette.glsl
// 被遮挡部分的“X 光”剪影:ZTest Greater 只画在“已有东西比我更近”的像素上,(GLSL 版)
// 再用模板排除角色自身可见的部分。颜色带菲涅尔边缘,看起来像发光的轮廓。
// 既可以作为角色的第二个材质使用,也可以作为 RenderObjects Feature 的 Override Material。
Shader "Cookbook/Ch16/XRaySilhouette"
{
    SubShader
    {
        Tags { "RenderType"="Transparent" "RenderPipeline"="UniversalPipeline" "Queue"="Transparent" }

        Pass
        {
            Name "XRay"
            Tags { "LightMode"="UniversalForward" }
            ZTest [_ZTest]
            ZWrite Off
            Blend SrcAlpha OneMinusSrcAlpha
            Stencil
            {
                Ref  [_StencilRef]
                Comp [_StencilComp]
            }
            GLSLPROGRAM
            #include "Ch16/Ch16Common.glsl"
            uniform vec4 _RimColor;
            uniform float _FillAlpha, _RimPower;

            #ifdef VERTEX
            void main() { Ch16Vert(); }
            #endif
            #ifdef FRAGMENT
            void main()
            {
                vec3 N = normalize(normalWS);
                vec3 V = GetWorldSpaceNormalizeViewDir(positionWS);
                float rim = pow(1.0 - saturate(dot(N, V)), _RimPower);
                float a = saturate(_FillAlpha + rim);
                fragColor = vec4(_RimColor.rgb, a);
            }
            #endif
            ENDGLSL
        }
    }
}