unity 空氣擾動,熱空氣 shader效果

正常效果:
在這裏插入圖片描述

高速低擾動效果:
在這裏插入圖片描述

低速高擾動效果:
在這裏插入圖片描述
代碼:

Shader "Learning/rekongqi"
{
	Properties
	{
		_NoiseTex ("NoiseTextrue", 2D) = "white" {}
		_Strength ("Strength", range(0, 1)) = 0.5
		_Speed ("Speed", range(-2, 2)) = 0.5
	}
	SubShader
	{
		Tags { "Queue"="AlphaTest"}
		Blend SrcAlpha oneMinusSrcAlpha
		ZWrite Off
		GrabPass
		{
			"_GrabTex"
		}
		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 grabPos : TEXCOORD1;
				float4 vertex : SV_POSITION;
			};

			sampler2D _NoiseTex;
			float4 _NoiseTex_ST;
			sampler2D _GrabTex;
			
			v2f vert (appdata v)
			{
				v2f o;
				o.vertex = UnityObjectToClipPos(v.vertex);
				o.uv = TRANSFORM_TEX(v.uv, _NoiseTex);
				o.grabPos = ComputeGrabScreenPos(o.vertex);
				return o;
			}
			
			float _Strength;
			float _Speed;
			fixed4 frag (v2f i) : SV_Target
			{
				float4 noise = tex2D(_NoiseTex, i.uv.xy - _Time.xy * _Speed * 0.1);
				i.grabPos.xy += (noise.xz * 2 - 1) * 0.1 * _Strength;

				half4 grabCol = tex2Dproj(_GrabTex, i.grabPos);
				return grabCol;
			}
			ENDCG
		}
	}
}

實現原理:

  1. 通過GrabPass抓取屏幕中一個區域的圖像
  2. 以時間作爲變量,取噪聲圖中的像素點的顏色值作爲偏移的隨機值
  3. 通過隨機值對步驟1中的圖像進行採樣

因爲通過隨機值採樣會採樣到與當前uv不同的點,連續起來就有了擾動的效果,採樣的跨度(_Speed)和偏移的強度(_Strength)以及噪聲圖的偏移(Tilling)可以調整最終的效果。
在這裏插入圖片描述
下面貼上噪聲圖以供使用:
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章