Unity3D shader(12)——Fragment Shader(模型颜色变化)

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"

}







  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值