gpt4 book ai didi

c# - Unity3D : Blur the background of a UI canvas

转载 作者:太空狗 更新时间:2023-10-29 18:24:47 24 4
gpt4 key购买 nike

我正在尝试在 Unity3D 中为我的游戏的 UI 窗口背景创建模糊效果。

我现在能想到的最好的例子之一是 Storm 英雄,请注意升级面板的背景如何模糊其背后的内容:

Heroes Of The Storm Blur Effect

有没有什么办法可以用Unity3D中最近添加的Canvas重现同样的效果?我知道有一种方法可以通过使用相机来做到这一点,但我并不真正熟悉整个事情,尤其是在让它与新的 UI 系统一起工作时。

谢谢。

最佳答案

这是一个非常适合我的着色器脚本。

来源:https://forum.unity3d.com/threads/solved-dynamic-blurred-background-on-ui.345083/#post-2853442

// 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
}
}
}
}

关于c# - Unity3D : Blur the background of a UI canvas,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29030321/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com