下面我将详细讲解“Unity3D UGUI特效之Image高斯模糊效果”的完整攻略。
1. 什么是高斯模糊?
高斯模糊是一种图像处理算法,是对图像进行模糊处理的一种方法,模糊程度随着处理程度的加深而不断加深,可以在一定程度上使图像变得更加柔和,视觉效果更加温和自然。
2. Unity3D中实现高斯模糊的方法:Shader实现
在Unity3D中,我们可以通过编写Shader来实现高斯模糊效果。Shader是一种编程语言,它可以在渲染图像时控制渲染的过程。接下来,我们就来讲解一下如何使用Shader来实现高斯模糊效果。
2.1 引入UGUI插件
首先,我们需要在Unity中引入Unity的UGUI插件,因为UGUI插件提供了Image组件,用于渲染图像。
2.2 编写高斯模糊Shader
我们可以打开一个空的Shader文件,然后编写如下内容:
Shader "Custom/GaussianBlur" {
Properties {
_MainTex ("Texture",2D) = "white" {}
_SampleCount("SampleCount",Range(0,30)) = 5
}
SubShader {
Pass {
ZTest Always Cull Off ZWrite Off
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
struct appdata {
float4 vertex : POSITION;
float4 color : COLOR;
float2 uv : TEXCOORD0;
};
struct v2f {
float4 color : COLOR;
float2 uv : TEXCOORD0;
float4 vertex : SV_POSITION;
};
sampler2D _MainTex;
float _SampleCount;
v2f vert (appdata v) {
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
o.uv = v.uv;
o.color = v.color;
return o;
}
fixed4 frag (v2f i) : SV_Target {
float2 texelSize = 1.0 / _ScreenParams.xy;
// Calculate the size of one "half" blur
float blurSize = _SampleCount * 0.5;
// Calculate the step for each blur pass
float step = blurSize / (_SampleCount - 1.0);
// Calculate the initial offset from the center of the pixel
float2 offset = float2(-blurSize, -blurSize);
// Calculate the color of this pixel using the weighted
// average of _SampleCount number of samples
float4 color = 0.0;
for (float i = 0.0; i < _SampleCount; i += 1.0) {
for (float j = 0.0; j < _SampleCount; j += 1.0) {
float2 uv = iTexel + offset * texelSize;
color += tex2D(_MainTex, uv) * 1.0;
offset.y += step;
}
offset.x += step;
offset.y = -blurSize;
}
return color / (_SampleCount * _SampleCount) * i.color;
}
ENDCG
}
}
FallBack "Diffuse"
}
上述Shader中的思路是:对于每个像素点,采集周围一定范围内的像素颜色,并将其进行加权求和并均值化来生成模糊效果。通过循环来获取像素颜色,通过加权求和根据到中心点的距离决定每个颜色的权重,最后再将加权求和的结果进行除法以完成均值化。
2.3 在Image组件中使用Shader
我们打开Unity中的画布,选择一个Image组件,将Shader添加到Image组件的Material中。就可以在画布上实现高斯模糊效果。
下面是一些示例说明:
示例一:在Image组件上实现高斯模糊
我们首先创建一个Image组件,然后将上述Shader添加到Image组件的Material中,就可以在画布上实现高斯模糊效果。
using UnityEngine;
using UnityEngine.UI;
public class CreateGaussianBlur : MonoBehaviour
{
public Sprite sprite; // 需要高斯模糊的图片
void Start()
{
Image image = gameObject.AddComponent<Image>();
image.sprite = sprite;
image.material = new Material(Shader.Find("Custom/GaussianBlur"));
}
}
示例二:在Camera上实现全屏高斯模糊
我们可以选择一个目标Camera,然后将上述Shader添加到Camera的Material中,在OnRenderImage事件中调用Graphics.Blit来对当前屏幕进行高斯模糊处理。
using UnityEngine;
using UnityEngine.UI;
[RequireComponent(typeof(Camera))]
public class GaussianBlurImageEffect : MonoBehaviour
{
public Shader shader; // 高斯模糊Shader
public int downSample = 2; // 降采样率
public int interations = 4; // 迭代次数
public float blurSize = 1.0f; // 模糊半径
private Material m_material;
// Use this for initialization
void Start()
{
m_material = new Material(shader ? shader : Shader.Find("Custom/GaussianBlur"));
}
void OnRenderImage(RenderTexture src, RenderTexture dest)
{
RenderTexture buffer = RenderTexture.GetTemporary(src.width / downSample, src.height / downSample, 0);
buffer.filterMode = FilterMode.Bilinear;
// downsample source texture
Graphics.Blit(src, buffer);
for (int i = 0; i < interations; i++)
{
Material mat = i == 0 ? m_material : m_material;
float iterationSize = blurSize * i + 1.0f;
mat.SetFloat("_SampleCount", iterationSize);
RenderTexture buffer2 = RenderTexture.GetTemporary(buffer.width, buffer.height, 0);
// vertical blur
Graphics.Blit(buffer, buffer2, mat, 0);
// horizontal blur
Graphics.Blit(buffer2, buffer, mat, 1);
RenderTexture.ReleaseTemporary(buffer2);
}
Graphics.Blit(buffer, dest);
RenderTexture.ReleaseTemporary(buffer);
}
}
以上示例说明就是使用Shader编写高斯模糊效果,并在Image组件和Camera上使用Shader来实现高斯模糊效果。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Unity3D UGUI特效之Image高斯模糊效果 - Python技术站