Shader "Soullies/DTM_RegularGridFloor" { Properties { [HDR]_Color0("Color0", Color) = (1, 1, 1, 0) [Header(Grid Settings)] _GridSize("Grid Size (X, Y)", Vector) = (1.0, 1.0, 0, 0) _GridDensity("Grid Density (Quantity Multiplier)", Float) = 1.0 _LineThickness("Line Thickness", Range(0.001, 0.5)) = 0.05 _EdgeSoftness("Edge Softness", Range(0.0, 0.5)) = 0.01 [Header(Animation Settings)] _MoveVector("Movement Vector (X, Y)", Vector) = (0.0, 1.0, 0, 0) [Header(Outer Enclosing Border)] [Toggle(_OUTER_BORDER_ON)] _EnableOuterBorder("Enable Outer Border", Float) = 0 [HDR] _OuterBorderColor("Outer Border Color", Color) = (1, 1, 1, 1) _OuterBorderWidth("Outer Border Width", Range(0.0, 0.5)) = 0.02 [Header(Render State)] [Enum(UnityEngine.Rendering.BlendMode)] _SrcBlend("Src Blend", Float) = 5 // SrcAlpha [Enum(UnityEngine.Rendering.BlendMode)] _DstBlend("Dst Blend", Float) = 10 // OneMinusSrcAlpha [Enum(Off, 0, On, 1)] _ZWrite("Z Write", Float) = 0 } SubShader { Tags { "RenderPipeline" = "UniversalPipeline" "RenderType" = "Transparent" "Queue" = "Transparent-300" "UniversalMaterialType" = "Unlit" "IgnoreProjector" = "True" } Blend [_SrcBlend] [_DstBlend] ZWrite [_ZWrite] Cull Back Pass { Name "ForwardOnly" Tags { "LightMode" = "UniversalForwardOnly" } HLSLPROGRAM #pragma target 4.5 #pragma prefer_hlslcc gles #pragma multi_compile_instancing #pragma multi_compile_fog #pragma shader_feature_local _OUTER_BORDER_ON #pragma vertex vert #pragma fragment frag #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" struct Attributes { float4 positionOS : POSITION; float2 uv : TEXCOORD0; UNITY_VERTEX_INPUT_INSTANCE_ID }; struct Varyings { float4 positionCS : SV_POSITION; float3 positionWS : TEXCOORD0; float2 uv : TEXCOORD1; half fogFactor : TEXCOORD2; UNITY_VERTEX_INPUT_INSTANCE_ID UNITY_VERTEX_OUTPUT_STEREO }; CBUFFER_START(UnityPerMaterial) half4 _Color0; float4 _GridSize; float _GridDensity; float _LineThickness; float _EdgeSoftness; float4 _MoveVector; half4 _OuterBorderColor; float _OuterBorderWidth; CBUFFER_END Varyings vert(Attributes input) { Varyings output = (Varyings)0; UNITY_SETUP_INSTANCE_ID(input); UNITY_TRANSFER_INSTANCE_ID(input, output); UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output); VertexPositionInputs vertexInput = GetVertexPositionInputs(input.positionOS.xyz); output.positionCS = vertexInput.positionCS; output.positionWS = vertexInput.positionWS; output.uv = input.uv; output.fogFactor = ComputeFogFactor(vertexInput.positionCS.z); return output; } half4 frag(Varyings input) : SV_Target { UNITY_SETUP_INSTANCE_ID(input); UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(input); // ========================================== // 1. Regular Grid Pattern (World Space UV) // ========================================== float2 worldUV = input.positionWS.xz; // Direct Linear Movement Animation float t = _Time.y; // Standard time in seconds worldUV -= _MoveVector.xy * t; // Density Multiplier float density = max(_GridDensity, 0.0001); float2 sizeDivisor = max(_GridSize.xy, float2(0.0001, 0.0001)) / density; // Scale UV float2 scaledUV = worldUV / sizeDivisor; // Generate pure regular grid lines mathematically // frac() maps to [0,1], we subtract 0.5 and take absolute to get a pyramid [0, 0.5] float2 cellUV = abs(frac(scaledUV) - 0.5); // Distance to the closest grid edge float2 distToLine = 0.5 - cellUV; float closestLine = min(distToLine.x, distToLine.y); // Hardware screen-space derivative + Software Softness for AA float fw = fwidth(closestLine); float halfThickness = _LineThickness * 0.5; float edgeSoft = max(_EdgeSoftness, fw); // ensures it never hard aliases // Solid line with anti-aliased trailing edge float gridAlphaMask = smoothstep(halfThickness + edgeSoft, halfThickness - edgeSoft, closestLine); half3 gridColor = _Color0.rgb; half gridAlpha = gridAlphaMask * _Color0.a; // ========================================== // 2. Outer Enclosing Border // ========================================== half3 finalColor = gridColor; half finalAlpha = gridAlpha; #if defined(_OUTER_BORDER_ON) // Calculate distance to nearest Mesh UV edge [0, 1] float2 edgeDist = min(input.uv, 1.0 - input.uv); float closestEdge = min(edgeDist.x, edgeDist.y); float borderfw = fwidth(closestEdge); // Creates a solid border with a smooth antialiased inner falloff float borderMask = 1.0 - smoothstep(_OuterBorderWidth - borderfw, _OuterBorderWidth + borderfw, closestEdge); // Lerp grid to border finalColor = lerp(gridColor, _OuterBorderColor.rgb, borderMask); finalAlpha = lerp(gridAlpha, _OuterBorderColor.a, borderMask); #endif // Apply URP Fog finalColor = MixFog(finalColor, input.fogFactor); return half4(finalColor, finalAlpha); } ENDHLSL } } FallBack "Hidden/Universal Render Pipeline/FallbackError" }