博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Cg入门19:Fragment shader - 片段级模型动态变色
阅读量:2201 次
发布时间:2019-05-03

本文共 1721 字,大约阅读时间需要 5 分钟。

y值要表示范围为[-0.5,0.5],所以语义要注意不要用Color(
注意:Color 语义值范围为[0,1]
(特别注意:内建的cube范围才是【-0.5,0.5】,其他模型就不一定是这个值了噢)
发现顶部没有融合掉,为了全部融合掉。我们将_Center范围+R的大小,就全部融合了
效果如下:
优化:去掉if else,因为if else 可能在其他硬件上不能执行。
代码:
Shader "Sbin/vf55" {	Properties	{		_UpColor("UpColor",color) = (1,0,0,1)		_DownColor("DownColor",color) = (0,1,0,1)		_Center("Center",range(-0.7,0.7)) = 0		_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"			struct v2f{				float4 pos : POSITION;				float y:TEXCOORD0;			};			float4 _UpColor;			float4 _DownColor;			float _Center; 			float _R; 			v2f vert(appdata_base v){				v2f o;				o.pos = mul(UNITY_MATRIX_MVP,v.vertex);				o.y = v.vertex.y;				return o;			}						fixed4 frag(v2f v):COLOR			{				//方法1:				//=========start============				/*if(v.y > _Center + _R)				{					return _UpColor;				}				else if(v.y>_Center && v.y <=_Center + _R)				{					float d = v.y - _Center;					d = saturate(1-d/_R - 0.5);					return lerp(_UpColor,_DownColor,d);				}				else if(v.y<=_Center && v.y > _Center - _R)				{					float d = _Center - v.y;					d = saturate(1-d/_R-0.5);					return lerp(_DownColor,_UpColor,d);				}				else				{					return _DownColor;				}*/				//==========end===========				//方法2:				//=========start==========				float d = v.y - _Center;//融合带				float s = abs(d);				d = d/s;//正负值分别描述上半部分和下半部分,取值1和-1				float f = s/_R;	//范围>1:表示上下部分;范围<1:表示融合带				f = saturate(f);				d *= f;//表示全部[-1,1];范围>1:表示上部分;范围<1:表示融合带;范围<-1:表示下部分								d = d/2+0.5;//将范围控制到[0,1],因为颜色值返回就是[0,1]				return lerp(_UpColor,_DownColor,d);				//==========end===========			}			ENDCG		}	} }
最终效果:
你可能感兴趣的文章
Java并发指南1:并发基础与Java多线程
查看>>
Java并发指南2:深入理解Java内存模型JMM
查看>>
Java并发指南3:并发三大问题与volatile关键字,CAS操作
查看>>
Java并发指南4:Java中的锁 Lock和synchronized
查看>>
Java并发指南5:JMM中的final关键字解析
查看>>
Java并发指南6:Java内存模型JMM总结
查看>>
Java并发指南7:JUC的核心类AQS详解
查看>>
Java并发指南8:AQS中的公平锁与非公平锁,Condtion
查看>>
Java网络编程和NIO详解6:Linux epoll实现原理详解
查看>>
Java网络编程和NIO详解7:浅谈 Linux 中NIO Selector 的实现原理
查看>>
Java网络编程与NIO详解8:浅析mmap和Direct Buffer
查看>>
Java网络编程与NIO详解10:深度解读Tomcat中的NIO模型
查看>>
Java网络编程与NIO详解11:Tomcat中的Connector源码分析(NIO)
查看>>
深入理解JVM虚拟机1:JVM内存的结构与消失的永久代
查看>>
深入理解JVM虚拟机3:垃圾回收器详解
查看>>
深入理解JVM虚拟机4:Java class介绍与解析实践
查看>>
深入理解JVM虚拟机5:虚拟机字节码执行引擎
查看>>
深入理解JVM虚拟机6:深入理解JVM类加载机制
查看>>
深入了解JVM虚拟机8:Java的编译期优化与运行期优化
查看>>
深入理解JVM虚拟机9:JVM监控工具与诊断实践
查看>>