模型颜色动态渐变,lerp的灵活使用

1.简单的颜色动态变化,通过坐标的值来判断fragment 返回不同的颜色值。需要注意的是模型的坐标通常是[-0.5,0.5]的范围内的,然后通过lerp函数来进行颜色的融合相加。虽然可以通过if else 等判断语句来完成,但是这样对于gpu来说是一种伤害,并补高效.

Shader "changecolor/ChangeColorTest" {
	Properties {
		_Color1 ("Main Color 1", Color) = (1,1,1,1)
		_Color2 ("Main Color 2", Color) = (1,0,1,1)
		_Center ("Main Center",Range(0.5,-0.5)) = 0
		_R ("Main R",Range(0.5,-0.5)) = 0.1 
	}
	SubShader {
		pass{
			CGPROGRAM
			#pragma vertex vertx
			#pragma fragment fagt
			#include "unitycg.cginc"


			float4 _Color1;
			float4 _Color2;
			float  _Center;
			float _R;

			struct v2f{
				float4 pos : POSITION;
				float4 vertex : TEXCOORD0;
			};

			v2f vertx(appdata_base IN)
			{
				v2f o;
				o.pos = mul(UNITY_MATRIX_MVP,IN.vertex);
				o.vertex = IN.vertex;
				return o;
			}
			fixed4 fagt(v2f IN):COLOR
			{
				float y = IN.vertex.y;
				float d = y - _Center; // 如果为正值则第一种颜色,否则负值就是第二种颜色


				//=======================================
				//要么是 -1  要么是 1
				//d = d/(abs(d));

				//值要么是1  或者 是 0
				//d = d/2 + 0.5;

				//lerp(m,n,k) = m * (1 - k) + n * k
				//return lerp(_Color1,_Color2,d);

				//=======================================
				//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(_Color1,_Color2,d);

			}

			ENDCG


		}
				
	} 
}


你可能感兴趣的:(shader)