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

来源:互联网 发布:海洋 知乎 编辑:程序博客网 时间:2024/05/23 22:18

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}} }


原创粉丝点击