Created
April 11, 2018 03:40
-
-
Save tblack-studio/7f45d9bf396e46108f04f34ca6c57ce3 to your computer and use it in GitHub Desktop.
Create blur background shader in Unity
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)' | |
Shader "Unlit/FrostedGlass" | |
{ | |
Properties | |
{ | |
_Radius("Radius", Range(1, 255)) = 1 | |
} | |
Category | |
{ | |
Tags{ "Queue" = "Transparent" "IgnoreProjector" = "True" "RenderType" = "Opaque" } | |
SubShader | |
{ | |
GrabPass | |
{ | |
Tags{ "LightMode" = "Always" } | |
} | |
Pass | |
{ | |
Tags{ "LightMode" = "Always" } | |
CGPROGRAM | |
#pragma vertex vert | |
#pragma fragment frag | |
#pragma fragmentoption ARB_precision_hint_fastest | |
#include "UnityCG.cginc" | |
struct appdata_t | |
{ | |
float4 vertex : POSITION; | |
float2 texcoord: TEXCOORD0; | |
}; | |
struct v2f | |
{ | |
float4 vertex : POSITION; | |
float4 uvgrab : TEXCOORD0; | |
}; | |
v2f vert(appdata_t v) | |
{ | |
v2f o; | |
o.vertex = UnityObjectToClipPos(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; | |
return o; | |
} | |
sampler2D _GrabTexture; | |
float4 _GrabTexture_TexelSize; | |
float _Radius; | |
half4 frag(v2f i) : COLOR | |
{ | |
half4 sum = half4(0,0,0,0); | |
#define GRABXYPIXEL(kernelx, kernely) tex2Dproj( _GrabTexture, UNITY_PROJ_COORD(float4(i.uvgrab.x + _GrabTexture_TexelSize.x * kernelx, i.uvgrab.y + _GrabTexture_TexelSize.y * kernely, i.uvgrab.z, i.uvgrab.w))) | |
sum += GRABXYPIXEL(0.0, 0.0); | |
int measurments = 1; | |
for (float range = 0.1f; range <= _Radius; range += 0.1f) | |
{ | |
sum += GRABXYPIXEL(range, range); | |
sum += GRABXYPIXEL(range, -range); | |
sum += GRABXYPIXEL(-range, range); | |
sum += GRABXYPIXEL(-range, -range); | |
measurments += 4; | |
} | |
return sum / measurments; | |
} | |
ENDCG | |
} | |
GrabPass | |
{ | |
Tags{ "LightMode" = "Always" } | |
} | |
Pass | |
{ | |
Tags{ "LightMode" = "Always" } | |
CGPROGRAM | |
#pragma vertex vert | |
#pragma fragment frag | |
#pragma fragmentoption ARB_precision_hint_fastest | |
#include "UnityCG.cginc" | |
struct appdata_t | |
{ | |
float4 vertex : POSITION; | |
float2 texcoord: TEXCOORD0; | |
}; | |
struct v2f | |
{ | |
float4 vertex : POSITION; | |
float4 uvgrab : TEXCOORD0; | |
}; | |
v2f vert(appdata_t v) | |
{ | |
v2f o; | |
o.vertex = UnityObjectToClipPos(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; | |
return o; | |
} | |
sampler2D _GrabTexture; | |
float4 _GrabTexture_TexelSize; | |
float _Radius; | |
half4 frag(v2f i) : COLOR | |
{ | |
half4 sum = half4(0,0,0,0); | |
float radius = 1.41421356237 * _Radius; | |
#define GRABXYPIXEL(kernelx, kernely) tex2Dproj( _GrabTexture, UNITY_PROJ_COORD(float4(i.uvgrab.x + _GrabTexture_TexelSize.x * kernelx, i.uvgrab.y + _GrabTexture_TexelSize.y * kernely, i.uvgrab.z, i.uvgrab.w))) | |
sum += GRABXYPIXEL(0.0, 0.0); | |
int measurments = 1; | |
for (float range = 1.41421356237f; range <= radius * 1.41; range += 1.41421356237f) | |
{ | |
sum += GRABXYPIXEL(range, 0); | |
sum += GRABXYPIXEL(-range, 0); | |
sum += GRABXYPIXEL(0, range); | |
sum += GRABXYPIXEL(0, -range); | |
measurments += 4; | |
} | |
return sum / measurments; | |
} | |
ENDCG | |
} | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment