其实有个很简单的办法,不过仅对尽量凸的物体很有效,不管是2d,3d,
因为unity里使用的object其自身坐标系的原点在其形式中心,所以可以直接
沿着vertex的方向进行扩放,下面这个shader是我试验的一个2d物体Quad,
Shader "Custom/guangquan" {
Properties {
_Color ("Surround Color", Color) = (0.3,0.3,0.3,1)
_MainTex ("Base (RGB)", 2D) = "white" {}
_Range("Range",Range(0.1,0.3))=0.15
}
SubShader {
Tags{"RenderType"="Opaque"}
//Tags {"Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent" }
LOD 100
Pass{
//Tags{"Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent"}
//Blend One Zero
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
uniform float _Range;
uniform float4 _Color;
struct appdata_t
{
float4 vertex : POSITION;
//half4 color : COLOR;
//float2 texcoord : TEXCOORD0;
};
struct v2f
{
float4 vertex : POSITION;
half4 color : COLOR;
//float2 texcoord : TEXCOORD0;
//float2 worldPos : TEXCOORD1;
};
v2f vert (appdata_t v)
{
v2f o;
v.vertex.xyz+=_Range*v.vertex.xyz;
o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);
o.color = _Color;//v.color;
//o.texcoord = v.texcoord;
//o.worldPos = TRANSFORM_TEX(v.vertex.xy, _MainTex);
return o;
}
half4 frag (v2f IN) : COLOR
{
return IN.color;
// Sample the texture
// half4 col = IN.color;
// col.a *= tex2D(_MainTex, IN.texcoord).a;
// float2 factor = abs(IN.worldPos);
// float val = 1.0 - max(factor.x, factor.y);
// Option 1: 'if' statement
// if (val < 0.0) col.a = 0.0;
// Option 2: no 'if' statement -- may be faster on some devices
//col.a *= ceil(clamp(val, 0.0, 1.0));
// return col;
}
ENDCG
}
Pass{
Tags{"Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent"}
Blend One Zero
Offset -1,-1
ColorMaterial AmbientAndDiffuse
SetTexture [_MainTex]
{
Combine Texture
}
}
// third part
}
//FallBack "Diffuse"
}