• 圆角计算 Shader


    圆角的计算

      在Shader中,我们使用UV坐标来计算需要显示的部分和不需要显示的部分,使用透明来处理显示与不显示。UV坐标如下图1,我们将坐标平移到图2位置,面片的UV坐标原点在面片中心,UV坐标范围是[0,1]。

          

      我们现在用计算圆的半径的方式来计算,在如图所示的区域(绿色线区分)1,2,3,4内产生圆角:

      b

        1. 在1区域内,加入区域的左下角是原点(0,0),长度是0.1,R = length(x,y),R大于0.1那么透明,小于等于0.1不透明,(4个区域内同理);

        2. 在5,6,7,8区域内,不透明;

    Shader 程序:

      

    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)

        :返回 x/y 的余数。如果 y 为 0,结果不可预料。

      step(a,x)

        :如果 x<a,返回 0;否则,返回 1。

  • 相关阅读:
    字符串与模式匹配算法(一):BF算法
    Spring MVC:HandlerMapping
    Spring MVC:DispatchServlet类
    Spring:面向切面编程的AOP
    Java:检查异常与未检查异常
    AOP源码解析:AspectJExpressionPointcutAdvisor类
    Vue+Webpack打包之后超过url-loader大小限制的图片在css的background-image中使用路径问题
    less
    ES6模块的import和export用法总结
    bootstrap4网格
  • 原文地址:https://www.cnblogs.com/jqm304775992/p/4987793.html
Copyright © 2020-2023  润新知