176 lines
6.6 KiB
Plaintext
176 lines
6.6 KiB
Plaintext
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"
|
|
}
|