正常效果:
高速低擾動效果:
低速高擾動效果:
代碼:
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
}
}
}
實現原理:
- 通過
GrabPass
抓取屏幕中一個區域的圖像 - 以時間作爲變量,取噪聲圖中的像素點的顏色值作爲偏移的隨機值
- 通過隨機值對步驟1中的圖像進行採樣
因爲通過隨機值採樣會採樣到與當前uv不同的點,連續起來就有了擾動的效果,採樣的跨度(_Speed)和偏移的強度(_Strength)以及噪聲圖的偏移(Tilling)可以調整最終的效果。
下面貼上噪聲圖以供使用: