123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102 |
- #ifndef UI_BLUR_CGINC
- #define UI_BLUR_CGINC
- #include "UnityCG.cginc"
- // Pixel size.
- static const float2 ps = _ScreenParams.zw - 1.0;
- // Parameters.
- sampler2D _MainTex;
- float _Opacity, _Size;
- // Functions.
- // Creates a linear blur from a projected texture.
- // The blur is made centered, so the direction is always absolute.
- // sp - Texture sampler.
- // uv - Texture coordinates.
- // dir - Blur direction vector.
- float4 linear_blur(sampler2D sp, float4 uv, float2 dir) {
- static const int samples = 9;
- float4 color = 0.0;
- // Move coordinates in opposite direction to center the sampling.
- uv = UNITY_PROJ_COORD(float4(
- uv.x - dir.x * samples * 0.5,
- uv.y - dir.y * samples * 0.5,
- uv.z,
- uv.w
- ));
- [unroll]
- for (int i = 0; i < samples; ++i) {
- uv = UNITY_PROJ_COORD(float4(
- uv.x + dir.x,
- uv.y + dir.y,
- uv.z,
- uv.w
- ));
- color += tex2Dproj(sp, uv);
- }
- return color / samples;
- }
- // Vertex shaders.
- void VS_Quad(
- float4 v : POSITION,
- out float4 p : SV_POSITION,
- inout float2 uv : TEXCOORD
- ) {
- p = UnityObjectToClipPos(v);
- }
- void VS_QuadProj(
- float4 v : POSITION,
- out float4 p : SV_POSITION,
- inout float2 uv1 : TEXCOORD0,
- out float4 uv2 : TEXCOORD1
- ) {
- VS_Quad(v, p, uv1);
- uv2 = ComputeGrabScreenPos(p);
- }
- void VS_QuadProjColor(
- float4 v : POSITION,
- out float4 p : SV_POSITION,
- inout float2 uv1 : TEXCOORD0,
- out float4 uv2 : texcoord2,
- inout float4 img_color : COLOR
- ) {
- VS_QuadProj(v, p, uv1, uv2);
- }
- // Pixel shader functions (for changing the grab pass texture).
- float4 blur_x(float2 img_uv, float4 grab_uv, sampler2D grab_tex) {
- float2 dir = float2(ps.x * _Size, 0.0);
-
- float4 blur = linear_blur(grab_tex, grab_uv, dir);
- blur.a = 1.0;
- float4 color = tex2D(_MainTex, img_uv);
- return blur * color.a;
- }
- float4 blur_y(float2 img_uv, float4 grab_uv, float4 img_color, sampler2D grab_tex) {
- float2 dir = float2(0.0, ps.y * _Size);
-
- float4 blur = linear_blur(grab_tex, grab_uv, dir);
- blur.a = 1.0;
- float4 color = tex2D(_MainTex, img_uv) * img_color;
- color = lerp(blur * color.a, color, _Opacity);
- return color;
- }
- #endif
|