卜若的代码笔记-unityshader系列-第九章:波动(最简单的顶点动画)

我们在第八章创建了复杂的一个mesh,在这一章中,我们希望实现一个波动效果

9.1 正弦波动

我们先通过gif看一下这个效果

实现的原理很简单,就是让它的顶点的y分量根据时间呈现正弦波动

核心操作都是在顶点着色器完成。

以下是源码:

// Upgrade NOTE: replaced '_Object2World' with 'unity_ObjectToWorld'

Shader "Unlit/t2"
{
	Properties
	{
		_Color("Color",Color) = (1,1,1,1)
		_MainTex("Texture", 2D) = "white" {}
	}
		SubShader
	{
		Tags {"Queue" = "Transparent" }
		LOD 100

		Pass
		{
			ZWrite Off
			CGPROGRAM
			#pragma vertex vertex
			#pragma fragment fragment
			// make fog work
			// #pragma multi_compile_fog
			
			#include "UnityCG.cginc"

			struct fromCpu
			{
				float4 vertex : POSITION;
				float2 uv : TEXCOORD0;
			};
			
			struct v2f
			{
				float2 uv : TEXCOORD0;
				float4 vertex : POSITION;
				float4 color: COLOR0;
			};

			sampler2D _MainTex;
			float4 _MainTex_ST;

			fixed4 _Color;
			
			v2f vertex(fromCpu v)
			{
				v2f o;
				v.vertex.y = sin(v.vertex.x + _Time.y*20);

				o.vertex = UnityObjectToClipPos(v.vertex);
				o.uv = v.uv;
				o.color = fixed4(0.3,0.3,0.3, v.vertex.y);
				return o;
			}

			fixed4 fragment(v2f i) : SV_Target
			{
					
				
				
				return _Color;
			}
			ENDCG
		}
	}
}

 9.2 波峰

 

顶点效果是通过x,和z分量的正弦叠加

 

颜色效果是通过在顶点着色器计算顶点颜色,然后将其丢给着色器,逐片元着色,完成即可。

 源码:

// Upgrade NOTE: replaced '_Object2World' with 'unity_ObjectToWorld'

Shader "Unlit/t2"
{
	Properties
	{
		_Color("Color",Color) = (1,1,1,1)
		_MainTex("Texture", 2D) = "white" {}
	}
		SubShader
	{
		Tags {"Queue" = "Transparent" }
		LOD 100

		Pass
		{
			ZWrite Off
			CGPROGRAM
			#pragma vertex vertex
			#pragma fragment fragment
			// make fog work
			// #pragma multi_compile_fog
			
			#include "UnityCG.cginc"

			struct fromCpu
			{
				float4 vertex : POSITION;
				float2 uv : TEXCOORD0;
			};
			
			struct v2f
			{
				float2 uv : TEXCOORD0;
				float4 vertex : POSITION;
				float4 color: COLOR0;
			};

			sampler2D _MainTex;
			float4 _MainTex_ST;

			fixed4 _Color;
			
			v2f vertex(fromCpu v)
			{
				v2f o;
				v.vertex.y = sin(v.vertex.x + _Time.y*20)+sin(v.vertex.z);

				o.vertex = UnityObjectToClipPos(v.vertex);
				o.uv = v.uv;
				o.color = fixed4(0,0,v.vertex.y,1);
				return o;
			}

			fixed4 fragment(v2f i) : SV_Target
			{
					
				
				
				return i.color;
			}
			ENDCG
		}
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值