Files
ichni_Creator_Studio/Assets/Shaders/Grid.shader
SoulliesOfficial 3dbfd6bf62 DTM Trail
2025-04-09 17:54:29 -04:00

114 lines
4.1 KiB
Plaintext

Shader "Custom/Grid"
{
Properties
{
_LineColor("Line Color", Color) = (1,1,1,1)
_BackgroundColor("Background Color", Color) = (0,0,0,0)
_GridScale("Grid Scale", Float) = 1
_LineWidth("Line Width", Float) = 0.05
_Fade("Fade", Float) = 0.1
_Plane("Plane (0: XZ, 1: XY, 2: YZ)", Float) = 0
_DisappearStartDistance("Disappear Start Distance", Float) = 50
_DisappearEndDistance("Disappear End Distance", Float) = 100
}
SubShader
{
Tags { "RenderType"="Transparent" "Queue"="Transparent" }
LOD 100
Pass
{
Name "GridPass"
Cull Off
Blend SrcAlpha OneMinusSrcAlpha
ZWrite Off
HLSLPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
// 内置变量:摄像机在世界空间中的位置
//float3 _WorldSpaceCameraPos;
struct Attributes
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
};
struct Varyings
{
float4 position : SV_POSITION;
float3 worldPos : TEXCOORD0;
};
CBUFFER_START(UnityPerMaterial)
float4 _LineColor;
float4 _BackgroundColor;
float _GridScale;
float _LineWidth;
float _Fade;
float _Plane;
float _DisappearStartDistance;
float _DisappearEndDistance;
CBUFFER_END
Varyings vert(Attributes IN)
{
Varyings OUT;
OUT.position = TransformObjectToHClip(IN.vertex);
OUT.worldPos = TransformObjectToWorld(IN.vertex).xyz;
return OUT;
}
// 根据 _Plane 选择二维坐标
float2 GetGridCoordinates(float3 pos)
{
if (_Plane < 0.5) // XZ 平面
return pos.xz;
else if (_Plane < 1.5) // XY 平面
return pos.xy;
else // YZ 平面
return pos.yz;
}
// 根据 _Plane 获取摄像机在网格平面上的位置
float2 GetCameraPlanePosition()
{
if (_Plane < 0.5) // XZ 平面:摄像机投影到 XZ
return _WorldSpaceCameraPos.xz;
else if (_Plane < 1.5) // XY 平面:摄像机投影到 XY
return _WorldSpaceCameraPos.xy;
else // YZ 平面:摄像机投影到 YZ
return _WorldSpaceCameraPos.yz;
}
half4 frag(Varyings IN) : SV_Target
{
// 计算二维网格坐标并乘以 _GridScale
float2 gridCoord = GetGridCoordinates(IN.worldPos) * _GridScale;
// 用 frac 与 fwidth 实现平滑网格线(抗锯齿)
float2 grid = abs(frac(gridCoord - 0.5) - 0.5) / fwidth(gridCoord);
float lineIntensity = 1.0 - smoothstep(0.0, _LineWidth, min(grid.x, grid.y));
// 计算摄像机在平面上的位置与当前片元的二维距离
float2 camPos2D = GetCameraPlanePosition();
float2 fragPos2D = GetGridCoordinates(IN.worldPos);
float dist = distance(fragPos2D, camPos2D);
// 超过 100 米开始淡出,到 200 米完全透明
float distanceFade = saturate((_DisappearEndDistance - dist) / _DisappearStartDistance);
// 最终 alpha 是网格线强度乘以距离淡出因子
float finalAlpha = lineIntensity * distanceFade;
// 背景颜色始终透明,所以直接输出网格线颜色与 alpha
return float4(_LineColor.rgb, finalAlpha);
}
ENDHLSL
}
}
FallBack "Diffuse"
}