接著來個比較簡單清爽的效果,對角線的切除以及米型的旋轉,雖然簡單但是效果也還算不錯。
*型旋轉的效果
*型旋轉的效果
單純X形切除呈現的效果大概是這樣
這邊以*型旋轉來看,同樣設定基本屬性,材質、顏色、切除的量、切除的方向,這邊多一個設定角度的參數,來設定每一等份的角度是多少,以上圖來說設定45度,可以看到就是切成8份(360/45=8)。
_MainTex ("Base (RGB)", 2D) = "white" {}
_Color ("Color", Color) = (1,1,1,1)
_Amount ("Amount", Range (0,1)) = 0
_Direction ("Direction", Range(0,1)) = 1
_Angle ("Angle", Float) = 45
輸出的時候先取得該座標點的角度,調整位置後減掉一定值若小於0就刪去,最後再乘上切除方向調整參數。
if (position.x != 0.0 && position.y != 0.0){
angle = degrees(atan(position.y/position.x)) ;
}
clip ((1-_Direction*2)*(frac(angle/_Angle)-_Amount));
最後在Unity當中使用的時候,調整 _Amount 調整切除的量,調整 _Direction 切除的方向,最後調整每個等分的角度,如果是單純X型切除的部分,就只有調整切除的量而已。
注意,因為使用的是螢幕座標,所以會是以遊戲顯示畫面的中心去等分。
這邊是單純X型切除,我這邊就只是做簡單的運算,X座標減去Y座標再減去某一個值小於0就切除,這只會形成單一條斜線,因此再做另一個對角線的刪去就得到X型的切除。
float4 textureColor = tex2D(_MainTex, input.uv); if(abs(input.screenPos.x - input.screenPos.y) - _Amount*0.5 < 0 || abs(input.screenPos.x - (1-input.screenPos.y)) - _Amount*0.5 < 0) discard; return textureColor * _Color;
完整Shader Code(*型)
Shader "Custom/Fading"
{
Properties
{
_MainTex ("Base (RGB)", 2D) = "white" {}
_Color ("Color", Color) = (1,1,1,1)
_Amount ("Amount", Range (0,1)) = 0
_Direction ("Direction", Range(0,1)) = 1
_Angle ("Angle", Float) = 45
}
SubShader {
Pass {
Cull Off
Lighting Off
ZWrite Off
Blend SrcAlpha OneMinusSrcAlpha
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
uniform sampler2D _MainTex;
uniform float4 _Color;
uniform float _Amount;
uniform float _Direction;
uniform float _Angle;
struct vertexInput {
float4 vertex : POSITION;
float4 texcoord : TEXCOORD0;
};
struct vertexOutput {
float4 pos : SV_POSITION;
float2 uv : TEXCOORD0;
float4 screenPos : TEXCOORD5;
};
vertexOutput vert(vertexInput input)
{
vertexOutput output;
output.uv = input.texcoord;
output.pos = mul(UNITY_MATRIX_MVP, input.vertex);
output.screenPos = output.pos * 0.5 + 0.5;
return output;
}
half4 frag(vertexOutput input) : COLOR
{
float4 textureColor = tex2D(_MainTex, input.uv);
float2 position = input.screenPos*2-1;
float angle = 0.0;
if (position.x != 0.0 && position.y != 0.0){
angle = degrees(atan(position.y/position.x)) ;
}
clip ((1-_Direction*2)*(frac(angle/_Angle)-_Amount));
return textureColor * _Color;
}
ENDCG
}
}
Fallback "Diffuse"
}
如果有任何想法歡迎提出。


No comments:
Post a Comment