Shader "Custom/FresnelOverlay_Add2" { Properties { [HDR]_RimColor ("Fresnel Color (HDR)", Color) = (3,3,3,1) _RimPower ("Fresnel Power", Range(0.1, 8)) = 3.0 _RimStrength ("Fresnel Strength", Range(0, 10)) = 1.0 [HDR]_OverlayColor ("Overlay Color (HDR, fill)", Color) = (0,0,0,0) _DoubleSided ("Double-Sided (0=Back,1=Both,2=Front)", Range(0,2)) = 2 _DepthBias ("Depth Bias (to avoid misses)", Float) = 0.0 } SubShader { Tags { "Queue"="Transparent+10" "RenderType"="Transparent" } // Additive overlay on top of what's already rendered Blend One One ZWrite Off ZTest Equal // only on the mesh where depth matches Cull Back ColorMask RGB Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag #pragma target 3.0 #pragma multi_compile_instancing #include "UnityCG.cginc" float4 _RimColor; float _RimPower; float _RimStrength; float4 _OverlayColor; float _DoubleSided; // 0=Back, 1=Both, 2=Front float _DepthBias; struct appdata { float4 vertex : POSITION; float3 normal : NORMAL; UNITY_VERTEX_INPUT_INSTANCE_ID }; struct v2f { float4 pos : SV_POSITION; float3 worldPos : TEXCOORD0; float3 worldNrm : TEXCOORD1; UNITY_VERTEX_INPUT_INSTANCE_ID UNITY_VERTEX_OUTPUT_STEREO }; v2f vert (appdata v) { v2f o; UNITY_SETUP_INSTANCE_ID(v); UNITY_INITIALIZE_OUTPUT(v2f, o); UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); float4 clip = UnityObjectToClipPos(v.vertex); clip.z += _DepthBias * clip.w; // tiny bias if needed o.pos = clip; o.worldPos = mul(unity_ObjectToWorld, v.vertex).xyz; o.worldNrm = UnityObjectToWorldNormal(v.normal); return o; } fixed4 frag (v2f i) : SV_Target { float3 N = normalize(i.worldNrm); float3 V = normalize(_WorldSpaceCameraPos - i.worldPos); float ndotv = dot(N, V); // Sidedness gating if (_DoubleSided < 0.5) // back faces only { if (ndotv > 0) discard; } else if (_DoubleSided > 1.5) // front faces only { if (ndotv < 0) discard; } // Fresnel rim ndotv = saturate(abs(ndotv)); // abs for double-sided consistency float rim = pow(1.0 - ndotv, _RimPower); float3 rimCol = _RimColor.rgb * (rim * _RimStrength); // Full-surface overlay (set to black to disable) float3 fillCol = _OverlayColor.rgb; return float4(rimCol + fillCol, 1); } ENDCG } } Fallback Off }