Vertex Shader几何变换---波

本文介绍如何使用Unity Shader实现不同类型的波浪效果,包括基本的上下波动、振幅变化、颜色灰度值、Z方向波形、快速移动波、圆形波及水波等,并逐步演示如何调整参数以获得所需效果。

1、上下波动,但是是所有的点都跟着一起波动

// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'

Shader "Custom/wave" {


	SubShader{
		pass {
		CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "unitycg.cginc"

			struct v2f {
			float4 pos:POSITION;
			fixed4 color : COLOR;
		};

		v2f vert(appdata_base v) {
			v.vertex.y += sin(_Time.y+_Time.y);

			v2f o;
			o.pos = mul(UNITY_MATRIX_MVP,v.vertex);
			o.color = fixed4(0, 1, 1, 1);
			return o;
		}


		fixed4 frag(v2f IN) :COLOR{
			return IN.color;
		}
			ENDCG
	}
	}

}








2、修改时间因子,引起振幅的变化


// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'

Shader "Custom/wave" {


	SubShader{
		pass {
		CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "unitycg.cginc"

			struct v2f {
			float4 pos:POSITION;
			fixed4 color : COLOR;
		};
		a
		v2f vert(appdata_base v) {
			v.vertex.y += 0.3*sin(v.vertex.x+_Time.y);

			v2f o;
			o.pos = mul(UNITY_MATRIX_MVP,v.vertex);
			o.color = fixed4(0, 1, 1, 1);
			return o;
		}


		fixed4 frag(v2f IN) :COLOR{
			return IN.color;
		}
			ENDCG
	}
	}

}



3、颜色产生灰度值


// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'

Shader "Custom/wave" {


	SubShader{
		pass {
		CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "unitycg.cginc"

			struct v2f {
			float4 pos:POSITION;
			fixed4 color : COLOR;
		};
		
			v2f vert(appdata_base v) {
			v.vertex.y += 0.3*sin(v.vertex.x + _Time.y);
a
			v2f o;
			o.pos = mul(UNITY_MATRIX_MVP,v.vertex);
			o.color = fixed4(v.vertex.y, v.vertex.y, v.vertex.y, 1);
			return o;
		}


		fixed4 frag(v2f IN) :COLOR{
			return IN.color;
		}
			ENDCG
	}
	}

}



4、改为在z方向上的波形

// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'

Shader "Custom/wave" {


	SubShader{
		pass {
		CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "unitycg.cginc"

			struct v2f {
			float4 pos:POSITION;
			fixed4 color : COLOR;
		};
		
		v2f vert(appdata_base v) {
			v.vertex.y += 0.2*sin(v.vertex.z*2 + _Time.y);

			v2f o;
			o.pos = mul(UNITY_MATRIX_MVP,v.vertex);
			o.color = fixed4(v.vertex.y, v.vertex.y, v.vertex.y, 1);
			return o;
		}


		fixed4 frag(v2f IN) :COLOR{
			return IN.color;
		}
			ENDCG
	}
	}

}




5、修改Time的z值,让波移动地更快一点


6、圆形波

// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'

Shader "Custom/wave" {


	SubShader{
		pass {
		CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "unitycg.cginc"

			struct v2f {
			float4 pos:POSITION;
			fixed4 color : COLOR;
		};
		
		v2f vert(appdata_base v) {
			v.vertex.y += 0.2*sin(length(v.vertex.xz)*2 + _Time.y);

			v2f o;
			o.pos = mul(UNITY_MATRIX_MVP,v.vertex);
			o.color = fixed4(v.vertex.y, v.vertex.y, v.vertex.y, 1);
			return o;
		}


		fixed4 frag(v2f IN) :COLOR{
			return IN.color;
		}
			ENDCG
	}
	}

}




但是刚才的波是从外向内的,要形成从内向外的波,需要对length取反


取消相乘,波会从圆心开始扩散

// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'

Shader "Custom/wave" {


	SubShader{
		pass {
		CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "unitycg.cginc"

			struct v2f {
			float4 pos:POSITION;
			fixed4 color : COLOR;
		};
		
		v2f vert(appdata_base v) {
			v.vertex.y += 0.2*sin(-length(v.vertex.xz) + _Time.y);

			v2f o;
			o.pos = mul(UNITY_MATRIX_MVP,v.vertex);
			o.color = fixed4(v.vertex.y, v.vertex.y, v.vertex.y, 1);
			return o;
		}


		fixed4 frag(v2f IN) :COLOR{
			return IN.color;
		}
			ENDCG
	}
	}

}




7、水波

①横向波

// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'

Shader "Custom/wave" {


	SubShader{
		pass {
		CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "unitycg.cginc"

			struct v2f {
			float4 pos:POSITION;
			fixed4 color : COLOR;
		};
		
		v2f vert(appdata_base v) {
			//v.vertex.y += 0.2*sin(-length(v.vertex.xz) + _Time.y);
			v.vertex.y += 0.2*sin(v.vertex.x*2 + _Time.y);

			v2f o;
			o.pos = mul(UNITY_MATRIX_MVP,v.vertex);
			o.color = fixed4(v.vertex.y, v.vertex.y, v.vertex.y, 1);
			return o;
		}


		fixed4 frag(v2f IN) :COLOR{
			return IN.color;
		}
			ENDCG
	}
	}

}


②将x和z方向的和作为角速率,得到斜方向上同频率的波

// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'

Shader "Custom/wave" {


	SubShader{
		pass {
		CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "unitycg.cginc"

			struct v2f {
			float4 pos:POSITION;
			fixed4 color : COLOR;
		};
		
		v2f vert(appdata_base v) {
			//v.vertex.y += 0.2*sin(-length(v.vertex.xz) + _Time.y);
			v.vertex.y += 0.2*sin((v.vertex.x+v.vertex.z)*2 + _Time.y);

			v2f o;
			o.pos = mul(UNITY_MATRIX_MVP,v.vertex);
			o.color = fixed4(v.vertex.y, v.vertex.y, v.vertex.y, 1);
			return o;
		}


		fixed4 frag(v2f IN) :COLOR{
			return IN.color;
		}
			ENDCG
	}
	}

}




③取消乘2,波与波之间的棱角变得平滑


④多个正弦实现此起彼伏的波形效果

// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'

Shader "Custom/wave" {


	SubShader{
		pass {
		CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "unitycg.cginc"

			struct v2f {
			float4 pos:POSITION;
			fixed4 color : COLOR;
		};
		
		v2f vert(appdata_base v) {
			//v.vertex.y += 0.2*sin(-length(v.vertex.xz) + _Time.y);
			v.vertex.y += 0.2*sin((v.vertex.x+v.vertex.z) + _Time.y);
			v.vertex.y += 0.3*sin((v.vertex.x + v.vertex.z) + _Time.w);

			v2f o;
			o.pos = mul(UNITY_MATRIX_MVP,v.vertex);
			o.color = fixed4(v.vertex.y, v.vertex.y, v.vertex.y, 1);
			return o;
		}


		fixed4 frag(v2f IN) :COLOR{
			return IN.color;
		}
			ENDCG
	}
	}

}






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值