UnityShdaer笔记第二课笔记-贴花

大致原理:
在这里插入图片描述
如图所示:A为设置的显示眉毛纹理区域,当渲染A区域的时候片元着色器的输出是把主UV(B)纹理和A纹理的混合。
大约分为两步骤:
1.根据主UV坐标拿到眉毛的纹理
2.如果主UV在胡子区域内根据拿到的眉毛纹理和主纹理混合,不在区域不用处理

代码如下

Shader "MyTest/Test_2"
{
    Properties
    {
        _MainTex("Texture", 2D) = "white" {} //主纹理

        _HuziTex("Huzi Tex", 2D) = "white" {} //眉毛纹理
         
         //眉毛区域,x对应UV x轴, y 对应UV y轴, z -A区域的宽,w A区域的高
        _HuziRange("Huzi Range", Vector) = (0,0,0,0)
       
       //眉毛的颜色
        _HuziColor("Huzi Color", Color) = (0,0,0,0)
    }

    SubShader
    {
        Tags{ "RenderType" = "Opaque" }

        Pass
        {
            CGPROGRAM

            #pragma vertex  dingdian 
            #pragma fragment  pianmian 

            #include "UnityCG.cginc"
          
            sampler2D _MainTex;
            float4 _MainTex_ST;

            sampler2D _HuziTex;
            float4 _HuziRange;
            float4 _HuziColor;
            
            struct appdata
            {
                float4 vertex :POSITION;
                float2 uv :TEXCOORD0;
            };

            struct v2f 
            {
                float2 uv:TEXCOORD0;
                float4 vertex:SV_POSITION;
            };
            
            //该方法得到主UV对应的胡子UV纹理
            fixed4 getHuziUV(float2 uv,sampler2D map,float4 range)
            {
                float2 targetuv;
                targetuv.x = 1/range.z * (uv.x -range.x);
                targetuv.y = 1/range.w * (uv.y -range.y);

                return tex2D(map,targetuv);        
            }

            //该方法判断主UV坐标是否在胡子渲染区域内,不在返回0,在返回1
            int getisinHuzi(float2 uv, float4 range)
            {
                if(uv.x<range.x||uv.x>range.x+range.z)
                    return 0;
                if(uv.y<range.y||uv.y>range.y+range.w)
                    return 0;
                return 1;
            }

            v2f dingdian(appdata v)
            {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
                o.uv = TRANSFORM_TEX(v.uv,_MainTex);
                return o;
            }

             fixed4 pianmian(v2f i):SV_Target
            {
                fixed4 col = tex2D(_MainTex, i.uv);
                
                fixed4 col2 = getHuziUV(i.uv,_HuziTex, _HuziRange);
                col2 *=getisinHuzi(i.uv, _HuziRange);
                float4 ss = float4(1,0,0,1);
                float4 ee = float4(1,1,0,1);
                col.rgb = lerp(col.rgb,_HuziColor.rgb,col2.r);
                return col;
            }

            
            ENDCG
        }
    }
}

版权声明:本文为qq_30058057原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。