正常效果:
高速低扰动效果:
低速高扰动效果:
代码:
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)可以调整最终的效果。
下面贴上噪声图以供使用: