Files
ichni_Official/Assets/ThemeBundles/DepartureToMultiverse/Shaders/DTM_RandomGridFloor.shader

249 lines
9.8 KiB
Plaintext
Raw Normal View History

2026-03-21 12:12:12 -04:00
Shader "Soullies/DTM_RandomGridFloor"
2026-03-18 13:42:23 -04:00
{
Properties
{
[HDR]_Color0("Color0", Color) = (1, 1, 1, 0)
[Header(Pattern Settings)]
_PatternSize("Pattern Size (X, Y)", Vector) = (2.0, 2.0, 0, 0)
_GridDensity("Grid Density (Quantity Multiplier)", Float) = 1.0
2026-04-06 09:32:56 -04:00
_BaseSpeed("Base Speed (Static)", Float) = 1.0
_TimeAngle("Time Angle / Offset (Dynamic)", Float) = 0.0
2026-03-18 13:42:23 -04:00
[Header(Edge Settings)]
_StepA("Step A", Range(0, 1)) = 0.293
_StepB("Step B", Range(0, 1)) = 0.345
2026-03-31 07:51:40 -04:00
[Header(Distance Fade)]
_FadeFar("Fade Far (Fully Transparent)", Float) = 100.0
_FadeNear("Fade Near (Fully Opaque)", Float) = 20.0
2026-03-18 13:42:23 -04:00
[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
2026-03-21 12:12:12 -04:00
[Enum(Front, Back, Off)] _CullMode("Cull Mode", Float) = 2 // Off
2026-03-18 13:42:23 -04:00
}
SubShader
{
Tags
{
"RenderPipeline" = "UniversalPipeline"
"RenderType" = "Transparent"
"Queue" = "Transparent-300"
"UniversalMaterialType" = "Unlit"
"IgnoreProjector" = "True"
}
Blend [_SrcBlend] [_DstBlend]
ZWrite [_ZWrite]
2026-03-21 12:12:12 -04:00
Cull [_CullMode]
2026-03-18 13:42:23 -04:00
Pass
{
Name "ForwardOnly"
Tags { "LightMode" = "UniversalForwardOnly" }
HLSLPROGRAM
// -------------------------------------
// Target Config
#pragma target 4.5
#pragma prefer_hlslcc gles
// DOTS and Instancing
#pragma multi_compile_instancing
#pragma multi_compile_fog
// Feature Flags
#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 _PatternSize;
float _GridDensity;
2026-04-06 09:32:56 -04:00
float _BaseSpeed;
2026-03-18 13:42:23 -04:00
float _TimeAngle;
float _StepA;
float _StepB;
2026-03-31 07:51:40 -04:00
float _FadeFar;
float _FadeNear;
2026-03-18 13:42:23 -04:00
half4 _OuterBorderColor;
float _OuterBorderWidth;
CBUFFER_END
// -------------------------------------
2026-04-06 09:32:56 -04:00
// 极限优化工具库组 (无三角函数全MAD指令)
// Fast 2D Hash (纯乘加与小数截断,干掉 sin)
float2 FastHash22(float2 p)
2026-03-18 13:42:23 -04:00
{
2026-04-06 09:32:56 -04:00
float3 p3 = frac(float3(p.xyx) * float3(0.1031, 0.1030, 0.0973));
p3 += dot(p3, p3.yzx + 33.33);
return frac((p3.xx + p3.yz) * p3.zy);
2026-03-18 13:42:23 -04:00
}
2026-04-06 09:32:56 -04:00
// Extreme Optimized 4-Tap Voronoi for Mobile (从9次循环砍至4次)
float VoronoiDistanceFast(float2 v, float t)
2026-03-18 13:42:23 -04:00
{
float2 n = floor(v);
float2 f = frac(v);
2026-04-06 09:32:56 -04:00
// 象限锚定算出像素所处方格的偏向完美剔除背面5个不可能相邻的远格
float2 mg = step(0.5, f);
2026-03-18 13:42:23 -04:00
float minDist = 8.0;
UNITY_UNROLL
2026-04-06 09:32:56 -04:00
for (int j = 0; j <= 1; j++)
2026-03-18 13:42:23 -04:00
{
UNITY_UNROLL
2026-04-06 09:32:56 -04:00
for (int i = 0; i <= 1; i++)
2026-03-18 13:42:23 -04:00
{
2026-04-06 09:32:56 -04:00
// 检索偏向象限的核心 4 个格子
float2 g = mg + float2(i - 1.0, j - 1.0);
float2 hash = FastHash22(n + g);
// 剔除昂贵的 sin 并换用平滑三角波:
// t * 0.1591549 即相当于 t / (2*PI) 把时间归一化到周期
float2 phase = frac(t * 0.1591549 + hash);
float2 tri = abs(phase * 2.0 - 1.0); // 线性三角波 1 -> 0 -> 1
float2 o = tri * tri * (3.0 - 2.0 * tri); // 光滑三次曲线,模拟 sin 的柔顺运动
2026-03-18 13:42:23 -04:00
float2 r = f - g - o;
2026-04-06 09:32:56 -04:00
// Manhattan 曼哈顿距离
2026-03-18 13:42:23 -04:00
float d = 0.5 * (abs(r.x) + abs(r.y));
minDist = min(minDist, d);
}
}
return minDist;
}
// -------------------------------------
// Vertex Shader
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;
}
// -------------------------------------
// Fragment Shader
half4 frag(Varyings input) : SV_Target
{
UNITY_SETUP_INSTANCE_ID(input);
UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(input);
// ==========================================
// 1. inner Grid Pattern Calculation
// ==========================================
float2 worldUV = input.positionWS.xz;
// Density Multiplier: Higher density = smaller frames = more quantity
float density = max(_GridDensity, 0.0001);
float2 sizeDivisor = max(_PatternSize.xy, float2(0.0001, 0.0001)) / density;
float2 scaledUV = worldUV / sizeDivisor;
// Rotate 45 degrees
float c = 0.707106;
float s = 0.707106;
float2 rotatedUV = mul(scaledUV, float2x2(c, -s, s, c));
2026-04-06 09:32:56 -04:00
// Time driven animation (Base Time + Phase Offset)
float t = _TimeParameters.x * _BaseSpeed + _TimeAngle;
2026-03-18 13:42:23 -04:00
2026-04-06 09:32:56 -04:00
// [TA 极限计算压缩] 使用 4-Tap、零三角函数的极简数学方法保持无限分辨率。
float v = VoronoiDistanceFast(rotatedUV, t);
2026-03-18 13:42:23 -04:00
// Anti-aliased border mask computation
float fw = fwidth(v);
float edge1 = smoothstep(_StepA - fw, _StepA + fw, v);
float edge2 = smoothstep(_StepB - fw, _StepB + fw, v);
float gridAlphaMask = edge2 - edge1;
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 UV edge
float2 edgeDist = min(input.uv, 1.0 - input.uv);
float closestEdge = min(edgeDist.x, edgeDist.y);
// Uses fwidth for clean smoothstep transition at the edge
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
2026-03-31 07:51:40 -04:00
// ==========================================
// 3. Distance Fade (Far = Transparent, Near = Opaque)
// ==========================================
float distToCam = distance(GetCameraPositionWS(), input.positionWS);
// When dist >= _FadeFar => fadeMask = 0 (Fully Transparent)
// When dist <= _FadeNear => fadeMask = 1 (Fully Opaque)
float rawFade = (distToCam - _FadeFar) / (_FadeNear - _FadeFar + 0.0001);
float fadeMask = saturate(rawFade);
finalAlpha *= fadeMask;
2026-03-18 13:42:23 -04:00
// Apply URP Fog
finalColor = MixFog(finalColor, input.fogFactor);
return half4(finalColor, finalAlpha);
}
ENDHLSL
}
}
FallBack "Hidden/Universal Render Pipeline/FallbackError"
}