[小明学Shader]11.圆角

原文连接:http://blog.csdn.net/mobanchengshuang/article/details/38731035

1.代码

 1 Shader"Custom/圆角"{
 2     properties{
 3         _MainTex("Base(RGB)",2D)="white"{}
 4         _Value("Cut Value",range(0,0.25))=0.1
 5     }
 6     CGINCLUDE
 7     #include "UnityCG.cginc"
 8     
 9             sampler2D _MainTex;
10             float _Value;
11     
12             struct v2f {
13                 float4 pos:SV_POSITION;
14                 float2 uv:TEXCOORD;
15             };
16     
17             v2f vert(appdata_full v){
18                 v2f o;
19                 o.pos=mul(UNITY_MATRIX_MVP,v.vertex);
20                 o.uv=v.texcoord;
21                 return o;
22             }
23     
24             float4 frag(v2f i):COLOR{
25                 float4 c=tex2D(_MainTex,i.uv);
26                 
27                 //计算圆角
28                 float2 uv=i.uv-0.5;
29                 float remain=0.5-_Value;
30                 //计算当前uv是不是在四个边角
31                 float mx=step(remain,abs(uv[0]));
32                 float my=step(remain,abs(uv[1]));
33                 //计算当前uv在四个边角的相对uv
34                 float rx = fmod(uv.x, remain); 
35                 float ry = fmod(uv.y, remain);     
36                 //若在边角,且距离顶点的距离大于value值,则不显示
37                 float fillAlpha=1-mx*my*step(_Value*_Value,rx*rx+ry*ry);
38                 
39                 c.a=fillAlpha;
40                 
41                 return c;
42             }
43     ENDCG
44     
45     subshader{
46         Tags{"Queue"="Transparent"}
47         Blend SrcAlpha OneMinusSrcAlpha
48         pass{
49             CGPROGRAM
50             #pragma vertex vert
51             #pragma fragment frag
52             
53             ENDCG
54         }
55     }
56     
57     FallBack "Diffuse"
58 }

2.效果

3.原理

计算出下图所示中紫色区域内点距离两个绿色点的距离,大于目标值的不显示即可.在计算相对于交点的坐标时,通过求莫的方式即可获得(fmod不会改变符号).所以本方法所能画的最大半径是0.25.

posted @ 2015-12-17 14:44  WongSiuming  阅读(236)  评论(0编辑  收藏  举报