策劃要求施法范圍顯示為球形儿咱,和地面上的物體相交處高亮,我開始想用Projector投影性置,但是只能實現柱形拾并,后來想到shader,找到了Kaima_Chen大神的[ForceField]效果(http://www.reibang.com/p/80a932d1f11e)鹏浅,與我想要的差不多嗅义,可是放進項目中發(fā)現無法正常顯示,原來是正交投影的問題隐砸,后來在Kaima_Chen大的指點下之碗,重寫了LinearEyeDepth,完美解決季希。再然后就是去掉光罩褪那,關掉背面剔除幽纷,大功告成。
使用方法很簡單博敬,創(chuàng)建一個球體(或者其他形狀體)友浸,然后創(chuàng)建Material,設置為這個Shader就行了偏窝。
Shader "Custom/IntersectField"
{
Properties
{
_MainColor("Main Color", Color) = (1,1,1,1)
_IntersectionPower("Intersect Power", Range(0, 1)) = 0
}
SubShader
{
Tags { "Queue"="Transparent" "RenderType"="Transparent" }
Pass
{
ZWrite Off
Cull Off
Blend DstAlpha OneMinusSrcAlpha
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
struct appdata
{
float4 vertex : POSITION;
};
struct v2f
{
float4 vertex : SV_POSITION;
float4 screenPos : TEXCOORD1;
};
sampler2D _CameraDepthTexture;
fixed4 _MainColor;
float _IntersectionPower;
v2f vert (appdata v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
o.screenPos = ComputeScreenPos(o.vertex);
COMPUTE_EYEDEPTH(o.screenPos.z);
return o;
}
float OrthoLinearEyeDepth(float z)
{
float far = _ProjectionParams.z;
float near = _ProjectionParams.y;
return z * (far - near) + near;
}
fixed4 frag (v2f i) : SV_Target
{
//透視投影用LinearEyeDepth收恢,正交投影用OrthoLinearEyeDepth
float screenZ = OrthoLinearEyeDepth(SAMPLE_DEPTH_TEXTURE_PROJ(_CameraDepthTexture, UNITY_PROJ_COORD(i.screenPos)));
float diff = 1 - (screenZ - i.screenPos.z);
float intersect = diff * _IntersectionPower;
fixed4 c = _MainColor * intersect;
return c;
}
ENDCG
}
}
}