Unity Shader 方框选中效果
最近用Unity Shader 写了个方框选择效果记录下。
代码效果:

Shader "Sprites/GridBox"
{
Properties
{
_MainTex ("Texture", 2D) = "white" {}
_GradientTex("Gradient Texture", 2D) = "white" {}
_BoxFrameU("Box Frame U", Range(0,0.5)) = 0.46
_BoxFrameV("Box Frame V", Range(0,0.5)) = 0.46
_Color("Box Color", color) = (1,1,1,1)
}
SubShader
{
Tags
{
"Queue" = "Transparent"
"IgnoreProjector" = "True"
"RenderType" = "Transparent+3"
"PreviewType" = "Plane"
"CanUseSpriteAtlas" = "True"
}
Blend SrcAlpha OneMinusSrcAlpha //半透混合模式
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
// make fog work
#pragma multi_compile_fog
#include "UnityCG.cginc"
struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
};
struct v2f
{
float2 uv : TEXCOORD0;
float4 vertex : SV_POSITION;
};
sampler2D _MainTex;
float4 _MainTex_ST;
sampler2D _GradientTex;
fixed _BoxFrameU;
fixed _BoxFrameV;
fixed4 _Color;
v2f vert (appdata v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
o.uv = TRANSFORM_TEX(v.uv, _MainTex);
return o;
}
fixed4 frag (v2f i) : SV_Target
{
fixed4 col = tex2D(_MainTex, i.uv);
col = col * _Color;
fixed posX = abs(i.uv.x - 0.5f);
fixed posY = abs(i.uv.y - 0.5f);
fixed showX = (posX - _BoxFrameU) / (0.5f - _BoxFrameU);
fixed showY = (posY - _BoxFrameV) / (0.5f - _BoxFrameV);
fixed stepx = step(_BoxFrameU, posX);
fixed stepy = step(_BoxFrameV, posY);
// 剔除掉内框空数据
clip(stepx + stepy - 0.1f);
fixed4 colorU = tex2D(_GradientTex, fixed2(showX, showX));
fixed4 colorV = tex2D(_GradientTex, fixed2(showY, showY));
col.a = col.a * (step(posX, posY) * colorV.a + step(posY, posX) * colorU.a);
clip(col.a - 0.001f);
return col;
}
ENDCG
}
}
}
1808

被折叠的 条评论
为什么被折叠?



