源码 / Ch16/StencilLit.shader
Ch16/StencilLit.shader
// 带模板测试参数的简单受光 Shader:Ref/Comp/Pass 全部做成材质属性。 // 用它可以搭出“只在模板值等于 1 的地方可见”的物体(传送门里的世界),或者“画的时候顺便写模板”的物体(X 光的角色)。 Shader "Cookbook/Ch16/StencilLit" { Properties { [MainTexture] _BaseMap ("Base Map", 2D) = "white" {} [MainColor] _BaseColor ("Color", Color) = (0.8, 0.8, 0.8, 1) [Toggle] _Unlit ("Unlit (backdrop)", Float) = 0 [Enum(UnityEngine.Rendering.CullMode)] _Cull ("Cull", Float) = 2 [IntRange] _StencilRef ("Stencil Ref", Range(0, 255)) = 1 [Enum(UnityEngine.Rendering.CompareFunction)] _StencilComp ("Stencil Comp", Float) = 8 // Always [Enum(UnityEngine.Rendering.StencilOp)] _StencilPass ("Stencil Pass Op", Float) = 0 // Keep } SubShader { Tags { "RenderType"="Opaque" "RenderPipeline"="UniversalPipeline" "Queue"="Geometry" } HLSLINCLUDE #include "Assets/Cookbook/Ch16/Ch16Common.hlsl" CBUFFER_START(UnityPerMaterial) float4 _BaseMap_ST; half4 _BaseColor; float _Unlit, _Cull, _StencilRef, _StencilComp, _StencilPass; CBUFFER_END TEXTURE2D(_BaseMap); SAMPLER(sampler_BaseMap); ENDHLSL Pass { Name "ForwardLit" Tags { "LightMode"="UniversalForwardOnly" } Cull [_Cull] Stencil { Ref [_StencilRef] Comp [_StencilComp] Pass [_StencilPass] } HLSLPROGRAM #pragma vertex Ch16Vert #pragma fragment frag #pragma multi_compile _ _MAIN_LIGHT_SHADOWS _MAIN_LIGHT_SHADOWS_CASCADE _MAIN_LIGHT_SHADOWS_SCREEN #pragma multi_compile_fragment _ _SHADOWS_SOFT _SHADOWS_SOFT_LOW _SHADOWS_SOFT_MEDIUM _SHADOWS_SOFT_HIGH half4 frag(Varyings i) : SV_Target { half3 albedo = SAMPLE_TEXTURE2D(_BaseMap, sampler_BaseMap, TRANSFORM_TEX(i.uv, _BaseMap)).rgb * _BaseColor.rgb; if (_Unlit > 0.5) return half4(albedo, 1); return half4(SimpleLighting(albedo, normalize(i.normalWS), i.positionWS, 0.3h), 1); } ENDHLSL } Pass { Name "ShadowCaster" Tags { "LightMode"="ShadowCaster" } ZWrite On ZTest LEqual ColorMask 0 Cull [_Cull] HLSLPROGRAM #pragma vertex vert #pragma fragment frag float4 vert(Attributes v) : SV_POSITION { return Ch16ShadowPositionCS(v.positionOS.xyz, v.normalOS); } half4 frag() : SV_Target { return 0; } ENDHLSL } Pass { Name "DepthOnly" Tags { "LightMode"="DepthOnly" } ZWrite On ColorMask R Cull [_Cull] HLSLPROGRAM #pragma vertex vert #pragma fragment frag float4 vert(Attributes v) : SV_POSITION { return TransformObjectToHClip(v.positionOS.xyz); } half4 frag() : SV_Target { return 0; } ENDHLSL } } }