【Unity】Shader之旗帜漂浮效果

模型资源出自《Shader入门精要》的项目,github链接如下:

https://github.com/candycat1992/Unity_Shaders_Book

原理:利用顶点动画,sin函数,纹理坐标,网格顶点坐标实现的旗帜漂浮效果

物体是Quad(3D物体)

注意:这个物体的模型是自定义的,不是默认的!(这个模型资源在上方的链接项目内)

可看到有164个顶点(这种才能实现我的效果!)而Quad物体默认的模型,如下:

只有4个verts(4个顶点)!这种是无法实现我下面的效果的。(因为顶点才4个!怎么模拟顶点动画!)

(如果发现方向不对!请自行旋转或调整shader的偏移轴等等轴向问题!)

Shader可以说十分简单,如下:


//必须要有一个多顶点的网格面支持才能很好地形成旗帜动画!
Shader "Unlit/FlagFlowing"
{
	Properties
	{
		_MainTex("Texture", 2D) = "white" {}
		 //颜色
		_FlagColor("flag color", Color) = (1, 0, 0, 1)
		//频率
		_FrequencyY("frequency Y", float) = 1  
		//飘动幅度
		_StrengthY("amplitude strengthY", float) = 1
		//波长
		_WaveLengthY("wave length Y", float) = 1
	}
		SubShader
		{
			Tags { "RenderType" = "Opaque" }
			LOD 100

			Pass
			{
				CGPROGRAM
				#pragma vertex vert
				#pragma fragment frag
				// make fog work
				#pragma multi_compile_fog

				#include "UnityCG.cginc"

				struct appdata
				{
					float4 vertex : POSITION;
					float2 uv : TEXCOORD0;
				};

				struct v2f
				{
					float2 uv : TEXCOORD0;
					UNITY_FOG_COORDS(1)
					float4 vertex : SV_POSITION;
				};

				sampler2D _MainTex;
				float4 _MainTex_ST;
				float4 _FlagColor;
				float _FrequencyY;
				float _StrengthY;

				float _WaveLengthY;

				v2f vert(appdata v)
				{
					v2f o;
					o.uv = v.uv;
					//关键代码:顶点动画部分
					//计算出偏移值y,对模型顶点的y值进行偏移
					//偏移值y的计算是根据sin函数,_FrequencyY系数控制频率,v.vertex.z是模型网格的Z轴(变化较大的轴)利用它的差异性来让sin值呈现平滑的曲线差异性
					//最终sin值要乘以一个纹理坐标y值进行模拟旗帜一边不动,一边浮动的效果
					//PS:差异性是指同一时间,不同顶点位置的偏移有差别的意思, 这样才能有漂浮效果.
					float y = sin(_Time.y * _FrequencyY + (v.vertex.x + v.vertex.z * 0.6) * _WaveLengthY) * o.uv.y;
					float4 offset = float4(0, 0, 0, 0);
					offset.y = y * _StrengthY;
					o.vertex = UnityObjectToClipPos(v.vertex + offset);
					UNITY_TRANSFER_FOG(o,o.vertex);
					return o;
				}

				fixed4 frag(v2f i) : SV_Target
				{
					fixed4 col = fixed4(_FlagColor.rgb, 1);
					// apply fog
					UNITY_APPLY_FOG(i.fogCoord, col);
					return col;
				}
			ENDCG
		}
	}
}

 

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Unity UI 旗帜可以理解为在Unity游戏引擎中使用的用户界面元素,用于展示和传递特定信息或功能。在开发游戏或其他交互应用程序时,UI 旗帜可以作为一个重要的组成部分。 首先,Unity UI 旗帜可以用于显示玩家的状态或信息。例如,在一个角色扮演游戏中,玩家可以在屏幕上看到他们的角色血条、能量条、经验条等信息,这些UI 旗帜可以实时反映角色的变化,并帮助玩家了解角色的状态。 其次,Unity UI 旗帜也可以用于菜单或选项界面,以便玩家可以与游戏进行交互或进行设置。玩家可以点击不同的UI 旗帜来选择游戏模式、音频设置、图形设置等。这些UI 旗帜可以提供直观的界面,使玩家能够轻松地进行操作和管理。 此外,Unity UI 旗帜还可以用于显示游戏中的任务或目标。比如,在一款冒险游戏中,玩家可以通过UI 旗帜来了解当前任务的进度、目标的位置等信息,从而引导他们在游戏中前进。 最后,Unity UI 旗帜还可以用于显示游戏中的提示或帮助信息。当玩家面临困难或不清楚下一步该做什么时,UI 旗帜可以提供相关的提示或帮助,使玩家能够更好地理解游戏规则或解决问题。 综上所述,Unity UI 旗帜在游戏开发中具有重要的作用,它可以用于显示玩家状态和信息、提供交互界面、显示任务和目标、以及提供提示和帮助。通过合理利用和设计,UI 旗帜能够提升游戏的交互性和用户体验,使玩家更好地享受游戏乐趣。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值