大致原理:
如图所示: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版权协议,转载请附上原文出处链接和本声明。