【UnityShader】波动效果

本文介绍了一个使用Shader实现的波动效果,通过调整振幅(Arange)、频率(Frenquncy)和速度(Speed),可以在三维空间中模拟出波动现象。波动方程为y = Asin(ωx + φ),其中A表示峰值,ω决定周期变化,φ决定波形与X轴的位置关系。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

波动实例:

y=  Asin(ωx+φ)

φ:决定波形与X轴位置关系或横向移动距离

ω:决定周期(

A:决定峰值(纵向拉伸压缩的倍数)

Shader "Hidden/test1"
{
	Properties
	{
		_MainTex ("Texture", 2D) = "white" {}
		_Arange("Amplitute",float) = 1
		_Frenquncy("Frenquncy",float) = 0.5
		_Speed("Speed",float) = 0.5
	}
	SubShader
	{
		// No culling or depth
		Cull Off ZWrite Off ZTest Always

		Pass
		{
			CGPROGRAM
			#pragma vertex vert
			#pragma fragment frag
			
			#include "UnityCG.cginc"

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

			struct v2f
			{
				float2 uv : TEXCOORD0;
				float4 vertex : SV_POSITION;
			};

			float _Frenquncy;
			float _Arange;
			float _Speed;
			v2f vert (appdata v)
			{
				v2f o;
				
				float  timer = _Time.y *_Speed; //表示时间周期

				float waver = _Arange* sin(timer + v.vertex.x * _Frenquncy);
				v.vertex.y = v.vertex.y + waver;
				o.vertex = UnityObjectToClipPos(v.vertex);
				o.uv = v.uv;
				return o;
			}
			
			sampler2D _MainTex;
			

			fixed4 frag (v2f i) : SV_Target
			{
				fixed4 col = tex2D(_MainTex, i.uv);
				// just invert the colors
				col = 1 - col;
				return col;
			}
			ENDCG
		}
	}
}



### Unity Shader 实现波动效果Unity中实现波动效果可以通过编写自定义Shader来完成。下面提供一段基于表面着色器(Surface Shader)的代码示例,该示例展示了如何利用正弦函数`sin()`创造简单的波浪形变形效果。 ```c Shader "Custom/WaveEffect" { Properties { _MainTex ("Texture", 2D) = "white" {} _WaveStrength ("Wave Strength", Range(0,1)) = 0.5 _Speed ("Animation Speed", Float) = 1.0 } SubShader { Tags { "RenderType"="Opaque" } LOD 200 CGPROGRAM #pragma surface surf Lambert vertex:vert addshadow sampler2D _MainTex; float _WaveStrength; float _Speed; struct Input { float2 uv_MainTex; }; void vert(inout appdata_full v) { float time = _Time.y * _Speed; float waveOffset = sin(v.vertex.x + time) * cos(v.vertex.z + time); v.vertex.y += waveOffset * _WaveStrength; } void surf (Input IN, inout SurfaceOutput o) { fixed4 col = tex2D(_MainTex, IN.uv_MainTex); o.Albedo = col.rgb; o.Alpha = col.a; } ENDCG } FallBack "Diffuse" } ``` 这段代码中的关键部分在于顶点着色器(`vert`)里对顶点坐标的修改[^3]。通过引入时间变量 `_Time.y` 和速度参数 `_Speed` 来改变 `waveOffset` 的值,进而影响模型的高度 (`vertex.y`) ,从而形成随时间变化而起伏的效果[^4]。 为了使此Shader更易于理解和应用,建议熟悉以下几个概念: - **Properties**: 定义了可以由用户调整的属性,如纹理、强度和速度等。 - **SubShader**: 描述渲染管线的具体细节,包括标签(Tags),LOD级别(Level of Detail),以及使用的编程语言(Cg/HLSL)。 - **CGPROGRAM/ENDCG**: 包含实际执行图形处理逻辑的地方;这里指定了使用的是表面着色器(surf)并允许添加阴影(addshadow)。 - **Vertex Function (vert)**: 对网格数据进行预处理的位置,在这里是用来计算每个顶点的新位置以模拟水波荡漾的感觉。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值