圓角計算 Shader

圓角的計算

  在Shader中,咱們使用UV座標來計算須要顯示的部分和不須要顯示的部分,使用透明來處理顯示與不顯示。UV座標以下圖1,咱們將座標平移到圖2位置,面片的UV座標原點在面片中心,UV座標範圍是[0,1]。app

      

 

  咱們如今用計算圓的半徑的方式來計算,在如圖所示的區域(綠色線區分)1,2,3,4內產生圓角:函數

  bspa

    1. 在1區域內,加入區域的左下角是原點(0,0),長度是0.1,R = length(x,y),R大於0.1那麼透明,小於等於0.1不透明,(4個區域內同理);code

    2. 在5,6,7,8區域內,不透明;blog

 

Shader 程序:it

  

Shader "JQM/Test02"
{
    Properties
    {
        _MainTex ("Texture", 2D) = "white" {}
    }
    SubShader
    {

        Pass
        {
            Tags {"Queue" = "Transparent"}       
            ZWrite Off       
            Blend SrcAlpha OneMinusSrcAlpha    

            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            
            #include "UnityCG.cginc"

            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);//移動UV座標中心    
                float rx = fmod(uv.x, 0.4);//圓角所在區域,也就是圓角半徑爲0.1
                float ry = fmod(uv.y, 0.4);//
                float mx = step(0.4, abs(uv.x));//大於0.4的部分, step(a,x):x<a取0,不然返回1
         
float my = step(0.4, abs(uv.y));//
         float alpha = 1 - mx*my*step(0.1, length(half2(rx,ry)));//在[0,0.4]範圍,mx*my始終爲0,最終值始終爲1;在(0.4,0.5]範圍,所在的圓角區域,mx*my使用爲1,大小由圓角半徑決定;在剩下的其餘區域,mx*my也是爲0,最終值爲;

         return float4(1,1,1,alpha);//
        }
      ENDCG } } }

 

CG函數

  fmod(x,y)class

    :返回 x/y 的餘數。若是 y 爲 0,結果不可預料。cgi

  step(a,x)fragment

    :若是 x<a,返回 0;不然,返回 1。float

相關文章
相關標籤/搜索