Hi all,
I want to know how to make a “Air wave” effect (Ignore the blue color) in Unity3D.
It looks like just make part of the screen to be twist. Not a whole shader effect on the camera.
Is it made by shaders or something else?
Thank you!!
Ken
Hi all,
I want to know how to make a “Air wave” effect (Ignore the blue color) in Unity3D.
It looks like just make part of the screen to be twist. Not a whole shader effect on the camera.
Is it made by shaders or something else?
Thank you!!
Ken
This is probably the HeatDistort shader. It’s available in the Detonator package, but only works with Pro - it grabs the screen image (Pro feature) and uses a bump map to distort it.
If you have Pro, get the shader below or from the Detonator package and play around with it - this tutorial may help you.
// Per pixel bumped refraction.
// Uses a normal map to distort the image behind, and
// an additional texture to tint the color.
Shader "HeatDistort" {
Properties {
_BumpAmt ("Distortion", range (0,128)) = 10
_MainTex ("Tint Color (RGB)", 2D) = "white" {}
_BumpMap ("Normalmap", 2D) = "bump" {}
}
CGINCLUDE
#pragma fragmentoption ARB_precision_hint_fastest
#pragma fragmentoption ARB_fog_exp2
#include "UnityCG.cginc"
sampler2D _GrabTexture : register(s0);
float4 _GrabTexture_TexelSize;
sampler2D _BumpMap : register(s1);
sampler2D _MainTex : register(s2);
struct v2f {
float4 vertex : POSITION;
float4 uvgrab : TEXCOORD0;
float2 uvbump : TEXCOORD1;
float2 uvmain : TEXCOORD2;
};
uniform float _BumpAmt;
half4 frag( v2f i ) : COLOR{
// calculate perturbed coordinates
half2 bump = UnpackNormal(tex2D( _BumpMap, i.uvbump )).rg; // we could optimize this by just reading the x & y without reconstructing the Z
float2 offset = bump * _BumpAmt * _GrabTexture_TexelSize.xy;
i.uvgrab.xy = offset * i.uvgrab.z + i.uvgrab.xy;
half4 col = tex2Dproj( _GrabTexture, i.uvgrab.xyw );
half4 tint = tex2D( _MainTex, i.uvmain );
return col * tint;
}
ENDCG
Category {
// We must be transparent, so other objects are drawn before this one.
Tags { "Queue"="Transparent+100" "RenderType"="Opaque" }
SubShader {
// This pass grabs the screen behind the object into a texture.
// We can access the result in the next pass as _GrabTexture
GrabPass {
Name "BASE"
Tags { "LightMode" = "Always" }
}
// Main pass: Take the texture grabbed above and use the bumpmap to perturb it
// on to the screen
Pass {
Name "BASE"
Tags { "LightMode" = "Always" }
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
struct appdata_t {
float4 vertex : POSITION;
float2 texcoord: TEXCOORD0;
};
v2f vert (appdata_t v){
v2f o;
o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);
#if UNITY_UV_STARTS_AT_TOP
float scale = -1.0;
#else
float scale = 1.0;
#endif
o.uvgrab.xy = (float2(o.vertex.x, o.vertex.y*scale) + o.vertex.w) * 0.5;
o.uvgrab.zw = o.vertex.zw;
o.uvbump = MultiplyUV( UNITY_MATRIX_TEXTURE1, v.texcoord );
o.uvmain = MultiplyUV( UNITY_MATRIX_TEXTURE2, v.texcoord );
return o;
}
ENDCG
}
}
// Fallback for older cards and Unity non-Pro
SubShader {
Blend DstColor Zero
Pass {
Name "BASE"
SetTexture [_MainTex] { combine texture }
}
}
}
}