呈現的效果大概是這樣
同樣設定基本屬性,材質、顏色、切除的量、切除方向。
_MainTex ("Base (RGB)", 2D) = "white" {}
_Color ("Color", Color) = (1,1,1,1)
_Amount ("Amount", Range (0,1)) = 0
_Direction ("Direction", Range(0,1)) = 1
同樣在輸出的時候調整座標範圍為(-1,1),接著取得座標距離原點的長度,因為調整後原點會在畫面中心,所以依據半徑的長度來剪裁,就可以有如此的效果了。
float2 coord = input.screenPos.xy*2-1;
clip ((1-_Direction*2)*(_Amount-length(coord.xy)*0.5));
最後在Unity當中使用的時候,調整 _Amount 調整切除的量,調整 _Direction 來改變切除的方向。
注意,因為使用的是螢幕座標,所以會是以遊戲顯示畫面的高寬去等分,所以在寬螢幕上會變成橢圓形,如果想要維持正方形,最簡單的解決辦法就是改為UV座標,然後讓使用這個材質的面片是正方形就可以了。
例如:在16:9的畫面下改為使用UV座標的效果,這個是把材質對準畫面中心。
完整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
}
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;
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
{
half4 textureColor = tex2D(_MainTex, input.uv);
float2 coord = input.screenPos.xy*2-1;
clip ((1-_Direction*2)*(_Amount-length(coord.xy)*0.5));
return textureColor * _Color;
}
ENDCG
}
}
Fallback "Diffuse"
}
如果有任何想法歡迎提出。
No comments:
Post a Comment