unity 空气扰动,热空气 shader效果

正常效果:
unity 空气扰动,热空气 shader效果_第1张图片

高速低扰动效果:
unity 空气扰动,热空气 shader效果_第2张图片

低速高扰动效果:
unity 空气扰动,热空气 shader效果_第3张图片
代码:

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)可以调整最终的效果。
unity 空气扰动,热空气 shader效果_第4张图片
下面贴上噪声图以供使用:
在这里插入图片描述

你可能感兴趣的:(Shader,Unity3D)