接著來個比較簡單清爽的效果,對角線的切除以及米型的旋轉,雖然簡單但是效果也還算不錯。
*型旋轉的效果
*型旋轉的效果
單純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