• [原]shader实现矩形圆角


    哎!竭力想说清楚这个实现原理,并解释清楚shader里面的算法,结果发现越解释越不好理解,见谅!

    一、实现目标:矩形四角是圆弧效果

    二、实现的原理:通过每个角绘制1/4圆弧,剔除掉圆弧以外的部分。

    原理图:

    实现代码:

    Shader "Custom/Test" {
        Properties {
            _MainTex ("Base (RGB)", 2D) = "white" {}
        }
        SubShader {
            Tags { "RenderType"="Opaque" }
            LOD 200
             Blend SrcAlpha OneMinusSrcAlpha   
            pass{
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #include "UnityCG.cginc"
            sampler2D _MainTex;
    
            struct Input {
                    fixed4 vertex:POSITION;
                    fixed2 texcoord :TEXCOORD0;
            };
            
            struct Output {
                fixed4 pos:POSITION;
                fixed2 uv :TEXCOORD0;
            };
            Output vert(Input i)
            {
                Output o;
                o.pos = mul(UNITY_MATRIX_MVP,i.vertex);
                o.uv = i.texcoord;
                return o;
            }
            
            fixed4 frag(Output o):COLOR
            {
                fixed4 c = tex2D(_MainTex,o.uv);
                float2 uv = o.uv.xy- float2(0.5);//UV 坐标默认是(0 0)左下角,减0.5 是把UV的中心点移到(0 0) 这样纹理坐标的范围就是 (-0.5,-0.5)~(0.5,0.5)
                float rx = fmod(uv.x, 0.4); //fmod 求余函数,从原点开始 矩形的顶点坐标为0.4
                float ry = fmod(uv.y, 0.4);     
                float mx = step(0.4, abs(uv.x)); // if 0.4>abs(uv.x)?0:1
                float my = step(0.4, abs(uv.y)); 
                float filletAlpha = 1 - mx * my * step(0.1, length(half2(rx,ry)));  //如果在圆角矩形内,alpha值为1 否则为0。 和0.1做比较 因为圆角半径为0.1 
                c = fixed4(c.r,c.g,c.b,filletAlpha);
                return c;
            }
            ENDCG
            }
        } 
    }

    注意:直接理解上面的计算圆角部分 有点难以理解,可以套到具体图里面 看效果推理就可以。

    实现效果:

    参考:

    http://imgtec.eetrend.com/blog/3608

    http://blog.sina.com.cn/s/blog_89d90b7c0102vayz.html

  • 相关阅读:
    【转】PHP实现系统编程(四)--- 本地套接字(Unix Domain Socket)
    php monolog 的写日志到unix domain socket 测试终于成功
    dhcp 过程
    【转】nginx 和 php-fpm 通信使用unix socket还是TCP,及其配置
    php 获取TZ时间格式
    React.Fragment 包裹标签
    git 关联远程分支
    select * from (select user())a 为什么是查询user()的意思?
    ant Form 常用 api
    antd-design LocaleProvider国际化
  • 原文地址:https://www.cnblogs.com/U-tansuo/p/yuanjiao.html
Copyright © 2020-2023  润新知