這個效果主要是利用反正切函數完成。atan2(x,y)的返回值是[-PI,PI],這個支持4個象限的反正切函數。關於圓角計算,在上篇文章中有介紹。html
如今,咱們來看看反正切函數的效果:app
在第一象限:返回[0,PI/2],有漸變; 函數
在第二象限:返回[PI/2,PI],爲白色;ui
在第三象限:返回[-PI,-PI/2],爲黑色;spa
在第四象限:返回[-PI/2,0],爲黑色;3d
uv = i.uv - fixed2(0.5,0.5); float hui = atan2(uv.y, uv.x); return float4(hui,hui,hui,alpha);
反正切的返回值在[-PI,PI],那麼咱們如今增長變量_angle,讓他控制反正切的值;咱們設置_angle值爲[-PI,PI],用_angle的值,加上反正切的值,他們最後的值就會隨着_angle的值變化。code
當_angle = -PI時,最終值爲[-2PI,0],顯示黑色;htm
當_angle = PI時,最終值爲[0,2PI],顯示漸變;blog
如今我使用用sign函數,將大於0的部分所有設置爲1,小於等於0的部分設置成爲0;get
源代碼:
Shader "JQM/Test02" { Properties { _MainTex ("Texture", 2D) = "white" {} _angle("angle", Range(0, 1)) = 0 } SubShader { Pass { Tags {"Queue" = "Transparent"} ZWrite Off Blend SrcAlpha OneMinusSrcAlpha CGPROGRAM #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" float _percent; float _angle; sampler2D _MainTex; float4 _MainTex_ST; struct VertexOutPut { float4 pos : SV_POSITION; float2 uv : TEXCOORD0; }; VertexOutPut vert (appdata_full v) { VertexOutPut o; o.pos = mul (UNITY_MATRIX_MVP, v.vertex); o.uv = v.texcoord.xy; return o; } fixed4 frag (VertexOutPut i) : COLOR { //圓角計算 float2 uv = i.uv.xy - float2(0.5,0.5); float rx = fmod(uv.x, 0.4); float ry = fmod(uv.y, 0.4); float mx = step(0.4, abs(uv.x)); float my = step(0.4, abs(uv.y)); float alpha = 1 - mx*my*step(0.1, length(half2(rx,ry))); fixed4 col = tex2D(_MainTex, i.uv); uv = i.uv - fixed2(0.5,0.5); _angle = 6.283*(_angle-0.5); float hui =sign(_angle+atan2(uv.y, uv.x)); return float4(hui,hui,hui,alpha); } ENDCG } } }
sign(x)
:若是 x 大於 0,返回 1;若是 x 小於 0,返回 01;不然返回 0。