Unity3D 的shader要实现模型的颜色变化,只需要让颜色和坐标关联起来。
这里先举一个vertex shader的例子,看看效果。从例子中,我们可以看到,程序自动对颜色的结果进行了混合,如果想颜色界限分明,那就需要在fragment shader里进行颜色赋值。
Shader "Custom/FragmentShader" {
properties{
_MainColor("MainColor",color)=(1,1,1,1)
_SecondColor("SecondColor",color)=(1,1,1,1)
}
SubShader {
PASS{
tags{"LightMode"="ForwardBase"}
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
#include "Lighting.cginc"
float4 _MainColor;
float4 _SecondColor;
struct v2f{
float4 pos:POSITION;
float4 col:TEXCOORD0;
};
v2f vert(appdata_base v){
v2f o;
o.pos=UnityObjectToClipPos(v.vertex);
if(v.vertex.y>0)
o.col=_MainColor;
else
o.col=_SecondColor;
return o;
}
float4 frag(v2f IN):COLOR{
return IN.col;
}
ENDCG
}
}
FallBack "Diffuse"
}
将上面的代码换成在fragment shader里进行。从效果可以看出结果非常分明。
Shader "Custom/FragmentShader" {
properties{
_MainColor("MainColor",color)=(1,1,1,1)
_SecondColor("SecondColor",color)=(1,1,1,1)
}
SubShader {
PASS{
tags{"LightMode"="ForwardBase"}
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
#include "Lighting.cginc"
float4 _MainColor;
float4 _SecondColor;
struct v2f{
float4 pos:POSITION;
float y:TEXCOORD0;
float4 col:TEXCOORD1;
};
v2f vert(appdata_base v){
v2f o;
o.pos=UnityObjectToClipPos(v.vertex);
o.y=v.vertex.y;
return o;
}
float4 frag(v2f IN):COLOR{
if(IN.y>0)
IN.col=_MainColor;
else
IN.col=_SecondColor;
return IN.col;
}
ENDCG
}
}
FallBack "Diffuse"
}
如果需要颜色渐变,那么需要再将颜色进行再次运算。
Shader "Custom/FragmentShader" {
properties{
_MainColor("MainColor",color)=(1,1,1,1)
_SecondColor("SecondColor",color)=(1,1,1,1)
_Center("Center",range(-0.5,0.5))=0.5
_R("R",range(0,0.5))=0.2
}
SubShader {
PASS{
tags{"LightMode"="ForwardBase"}
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
#include "Lighting.cginc"
float4 _MainColor;
float4 _SecondColor;
float _Center;
float _R;
struct v2f{
float4 pos:POSITION;
float y:TEXCOORD0;
float4 col:TEXCOORD1;
};
v2f vert(appdata_base v){
v2f o;
o.pos=UnityObjectToClipPos(v.vertex);
o.y=v.vertex.y;
return o;
}
float4 frag(v2f IN):COLOR{
float d=IN.y-_Center;
float s=abs(d);
d=d/s;
float f=s/_R;
f=saturate(f);
d+=f;
d=d/2+0.5;
return lerp(_MainColor,_SecondColor,d);
}
ENDCG
}
}
FallBack "Diffuse"
}