【Unity Image Effect】Vignetting 光晕效果

22 篇文章 1 订阅
8 篇文章 0 订阅

【Unity Image Effect】Vignetting 光晕效果

Vignetting 光晕效果 :可以实现场景中的聚焦,以及对中心之外的物体做模糊处理

是什么

在这里插入图片描述

上图是王者荣耀的游戏截图,王者荣耀在战斗结束的时候都会做背景模糊处理,场景模糊的效果很赞。

怎么做

Unity的 Image Effect插件

有很多自带的各种效果处理。因此我们先来看看有没有合适的。导入Unity的 Image Effect插件包,在Camera组件下面添加脚本 Vignette and Chromatic Aberration ,先看一下具体效果。
在这里插入图片描述
在这里插入图片描述

该脚本有三个参数
在这里插入图片描述

Vignetting:数值越大,可视范围越小,外围通过黑色填充

在这里插入图片描述

Blurred Corners:数值越大,中心之外的物体向中间模糊。最小值:不模糊;最大值:整体模糊

在这里插入图片描述

BlurDistance:模糊的程度,数值越大越模糊。

在这里插入图片描述

Chromatic Aberration:画面拉伸的偏移。数值越大,偏移的越厉害。

在这里插入图片描述

修改一下Aberration的枚举为Advanced
在这里插入图片描述

可以调节画面更加细微的东西。具体不再演示。

实现

using System;
using UnityEngine;

namespace UnityStandardAssets.ImageEffects
{
    [ExecuteInEditMode]
    [RequireComponent (typeof(Camera))]
    [AddComponentMenu ("Image Effects/Camera/Vignette and Chromatic Aberration")]
    public class VignetteAndChromaticAberration : PostEffectsBase
    {
        public enum AberrationMode
        {
            Simple = 0,
            Advanced = 1,
        }


        public AberrationMode mode = AberrationMode.Simple;
        public float intensity = 0.036f;                    // intensity == 0 disables pre pass (optimization)
        public float chromaticAberration = 0.2f;
        public float axialAberration = 0.5f;
        public float blur = 0.0f;                           // blur == 0 disables blur pass (optimization)
        public float blurSpread = 0.75f;
        public float luminanceDependency = 0.25f;
        public float blurDistance = 2.5f;
        public Shader vignetteShader;
        public Shader separableBlurShader;
        public Shader chromAberrationShader;
        
        
        private Material m_VignetteMaterial;
        private Material m_SeparableBlurMaterial;
        private Material m_ChromAberrationMaterial;


        public override bool CheckResources ()
        {
            CheckSupport (false);

            m_VignetteMaterial = CheckShaderAndCreateMaterial (vignetteShader, m_VignetteMaterial);
            m_SeparableBlurMaterial = CheckShaderAndCreateMaterial (separableBlurShader, m_SeparableBlurMaterial);
            m_ChromAberrationMaterial = CheckShaderAndCreateMaterial (chromAberrationShader, m_ChromAberrationMaterial);

            if (!isSupported)
                ReportAutoDisable ();
            return isSupported;
        }


        void OnRenderImage (RenderTexture source, RenderTexture destination)
        {
            if ( CheckResources () == false)
            {
                Graphics.Blit (source, destination);
                return;
            }

            int rtW = source.width;
            int rtH = source.height;

            bool  doPrepass = (Mathf.Abs(blur)>0.0f || Mathf.Abs(intensity)>0.0f);

            float widthOverHeight = (1.0f * rtW) / (1.0f * rtH);
            const float oneOverBaseSize = 1.0f / 512.0f;

            RenderTexture color = null;
            RenderTexture color2A = null;

            if (doPrepass)
            {
                color = RenderTexture.GetTemporary (rtW, rtH, 0, source.format);

                // Blur corners
                if (Mathf.Abs (blur)>0.0f)
                {
                    color2A = RenderTexture.GetTemporary (rtW / 2, rtH / 2, 0, source.format);

                    Graphics.Blit (source, color2A, m_ChromAberrationMaterial, 0);

                    for(int i = 0; i < 2; i++)
                    {	// maybe make iteration count tweakable
                        m_SeparableBlurMaterial.SetVector ("offsets",new Vector4 (0.0f, blurSpread * oneOverBaseSize, 0.0f, 0.0f));
                        RenderTexture color2B = RenderTexture.GetTemporary (rtW / 2, rtH / 2, 0, source.format);
                        Graphics.Blit (color2A, color2B, m_SeparableBlurMaterial);
                        RenderTexture.ReleaseTemporary (color2A);

                        m_SeparableBlurMaterial.SetVector ("offsets",new Vector4 (blurSpread * oneOverBaseSize / widthOverHeight, 0.0f, 0.0f, 0.0f));
                        color2A = RenderTexture.GetTemporary (rtW / 2, rtH / 2, 0, source.format);
                        Graphics.Blit (color2B, color2A, m_SeparableBlurMaterial);
                        RenderTexture.ReleaseTemporary (color2B);
                    }
                }

                m_VignetteMaterial.SetFloat("_Intensity", (1.0f / (1.0f - intensity) - 1.0f));		// intensity for vignette
                m_VignetteMaterial.SetFloat("_Blur", (1.0f / (1.0f - blur)) - 1.0f);					// blur intensity
                m_VignetteMaterial.SetTexture ("_VignetteTex", color2A);	// blurred texture

                Graphics.Blit (source, color, m_VignetteMaterial, 0);			// prepass blit: darken & blur corners
            }

            m_ChromAberrationMaterial.SetFloat ("_ChromaticAberration", chromaticAberration);
            m_ChromAberrationMaterial.SetFloat ("_AxialAberration", axialAberration);
            m_ChromAberrationMaterial.SetVector ("_BlurDistance", new Vector2 (-blurDistance, blurDistance));
            m_ChromAberrationMaterial.SetFloat ("_Luminance", 1.0f/Mathf.Max(Mathf.Epsilon, luminanceDependency));

            if (doPrepass) color.wrapMode = TextureWrapMode.Clamp;
            else source.wrapMode = TextureWrapMode.Clamp;
            Graphics.Blit (doPrepass ? color : source, destination, m_ChromAberrationMaterial, mode == AberrationMode.Advanced ? 2 : 1);

            RenderTexture.ReleaseTemporary (color);
            RenderTexture.ReleaseTemporary (color2A);
        }
    }
}
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Unity中的图像模糊效果可以通过使用后处理效果来实现。后处理效果是在渲染完成后对最终图像进行处理的方法,可以通过调整图像的颜色、对比度、亮度、锐化、模糊等来达到不同的视觉效果。 要实现图像模糊效果,可以使用Unity的Post-Processing Stack插件,该插件提供了一系列的后处理效果。首先,我们需要将Post Process Volume组件添加到场景中的摄像机上,并将其Profile属性设置为包含模糊效果的Profile。 然后,我们需要在Profile中添加一个模糊效果,并调整其参数以达到期望的效果。在Post Process Volume组件中,可以点击“Add Effect”按钮并选择“Blur”效果。然后,可以调整模糊效果的强度、半径、采样等参数,以实现不同的模糊效果。 在游戏运行时,模糊效果将会在最终渲染的图像上应用。可以在游戏运行时动态地调整模糊效果的参数,以实现实时模糊效果的变化。 除了使用Post-Processing Stack插件,还可以使用自定义的着色器来实现图像模糊效果。通过在着色器中使用模糊算法,可以对图像进行高效的模糊处理。然后,可以将着色器应用到游戏对象的材质上,使其具有模糊效果。 总之,Unity提供了多种实现图像模糊效果的方法,可以根据具体需求选择合适的方法来实现所需的效果。无论是使用Post-Processing Stack插件还是自定义着色器,都可以实现美观的图像模糊效果,提升游戏的视觉质量。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值