【游戏开发小技】Unity通过UI全屏图来模糊场景画面(Shader

您所在的位置:网站首页 gta5游戏界面突然模糊发黄 【游戏开发小技】Unity通过UI全屏图来模糊场景画面(Shader

【游戏开发小技】Unity通过UI全屏图来模糊场景画面(Shader

2024-04-03 22:18| 来源: 网络整理| 查看: 265

文章目录 一、前言二、效果演示三、具体操作四、GitHub项目源码

一、前言

嗨,大家好,我是新发。 以前我写文章都是很长很长,接下来我会尝试用新的方式来写博客,尽量简短,以实用为主。同时也是作为自己零碎的一些记录,方便查阅。

本文我要说的是在Unity中通过UI全屏图来模糊场景画面的效果。

二、效果演示

这是没用模糊效果的样子: 在这里插入图片描述 这是用了模糊效果的样子: 在这里插入图片描述

三、具体操作

在Canvas下创建一张Image作为全屏纯色图, 在这里插入图片描述如下 在这里插入图片描述 创建一个材质球重命名为Blur,使用的shader代码如下:

// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)' Shader "Unlit/UI_BGBlur" { Properties { _Size("Size", float) = 1 _Color("Color", Color) = (1,1,1,1) } SubShader { Tags { "RenderType" = "Opaque" } LOD 100 GrabPass {Tags{"LightMode" = "Always"}} Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" struct appdata { float4 vertex : POSITION; float2 uv : TEXCOORD0; }; struct v2f { float4 uvgrab : TEXCOORD0; float4 vertex : SV_POSITION; }; sampler2D _GrabTexture; float4 _GrabTexture_TexelSize; float _Size; half4 _Color; v2f vert(appdata_base 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; } fixed4 frag(v2f i) : SV_Target { // sample the texture // half4 col = tex2Dproj( _GrabTexture, UNITY_PROJ_COORD(i.uvgrab)); // return col; half4 sum = half4(0,0,0,0); #define GRABPIXEL(weight,kernelx) tex2Dproj( _GrabTexture, UNITY_PROJ_COORD(float4(i.uvgrab.x + _GrabTexture_TexelSize.x * kernelx*_Size, i.uvgrab.y, i.uvgrab.z, i.uvgrab.w))) * weight sum += GRABPIXEL(0.05, -4.0); sum += GRABPIXEL(0.09, -3.0); sum += GRABPIXEL(0.12, -2.0); sum += GRABPIXEL(0.15, -1.0); sum += GRABPIXEL(0.18, 0.0); sum += GRABPIXEL(0.15, +1.0); sum += GRABPIXEL(0.12, +2.0); sum += GRABPIXEL(0.09, +3.0); sum += GRABPIXEL(0.05, +4.0); sum *= _Color; return sum; } ENDCG } GrabPass{ Tags{ "LightMode" = "Always" } } Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" struct appdata { float4 vertex : POSITION; float2 uv : TEXCOORD0; }; struct v2f { float4 uvgrab : TEXCOORD0; float4 vertex : SV_POSITION; }; sampler2D _GrabTexture; float4 _GrabTexture_TexelSize; float _Size; half4 _Color; v2f vert(appdata_base 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; } fixed4 frag(v2f i) : SV_Target { // sample the texture // half4 col = tex2Dproj( _GrabTexture, UNITY_PROJ_COORD(i.uvgrab)); // return col; half4 sum = half4(0,0,0,0); #define GRABPIXEL(weight,kernely) tex2Dproj( _GrabTexture, UNITY_PROJ_COORD(float4(i.uvgrab.x, i.uvgrab.y + _GrabTexture_TexelSize.y * kernely*_Size, i.uvgrab.z, i.uvgrab.w))) * weight sum += GRABPIXEL(0.05, -4.0); sum += GRABPIXEL(0.09, -3.0); sum += GRABPIXEL(0.12, -2.0); sum += GRABPIXEL(0.15, -1.0); sum += GRABPIXEL(0.18, 0.0); sum += GRABPIXEL(0.15, +1.0); sum += GRABPIXEL(0.12, +2.0); sum += GRABPIXEL(0.09, +3.0); sum += GRABPIXEL(0.05, +4.0); sum *= _Color; return sum; } ENDCG } } Fallback "UI/Unlit/Transparent" }

将Blur材质球设置给Image,然后调节材质的Size来控制模糊度,设置Color来控制混合的颜色即可, 在这里插入图片描述 在这里插入图片描述

四、GitHub项目源码

本文演示的项目源码可在GitHub中下载,项目地址:https://github.com/BayatGames/RedRunner 请添加图片描述



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3