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,在返回1int 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}}
}


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部