Shader "Custom/DottedLineShader"
{
Properties
{
_MainTex ("Texture", 2D) = "white" {}
_Color("Color",COLOR) = (1,1,1,1)
_LineLength("虚线长度",float) =0.08
}
SubShader
{
Tags //设置支持UGUI
{
"Queue"="Transparent"
"IgnoreProjector"="True"
"RenderType"="Transparent"
"PreviewType"="Plane"
}
Cull Off
Lighting Off
ZWrite Off
Blend SrcAlpha OneMinusSrcAlpha
LOD 100
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
};
struct v2f
{
float2 uv : TEXCOORD0;
float4 vertex : SV_POSITION;
float3 worldPos : TEXCOORD1;
};
sampler2D _MainTex;
float4 _Color;
float _LineLength;
v2f vert (appdata v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
o.uv = v.uv;
// 计算世界坐标系下的顶点位置
o.worldPos = mul(unity_ObjectToWorld, v.vertex).xyz;
return o;
}
//绝对值对称法
float box3(float2 uv, float left, float top)
{
float2 b1 = 1 - step(float2(left,top),abs(uv));
float value = b1.x * b1.y;
return value;
}
//矩形框
float box4(float2 uv,float left,float top, float width)
{
float value = box3(uv,left,top);
value -= box3(uv,left-width,top-width);
return value;
}
fixed4 frag (v2f i) : SV_Target
{
float2 uv = i.uv;
float2 center = float2(0.5,0.5);
float2 halfSize =center;
float2 fw = _LineLength;
float2 dist = abs(uv - center);
float col = 0.0;
float2 pixel = uv / fw;
float aspect = halfSize.y / halfSize.x;
float dir = (dist.x * aspect > dist.y) ?-sign(uv.x - center.x) : sign(uv.y - center.y);
float dash = step(0.5, frac((pixel.x + pixel.y) * dir / 10.0 + _Time.z));
float f = box4(i.uv-center,0.5,0.5,0.03);
float4 texCol = tex2D(_MainTex, i.uv);
float4 fragColor =lerp(texCol,_Color, dash*f);
return fragColor;
}
ENDCG
}
}
}
unity UGUI虚线框shader
于 2025-05-19 18:15:22 首次发布