【Unity Image Effect】Vignetting 光晕效果
【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 cornersif (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 tweakablem_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 vignettem_VignetteMaterial.SetFloat("_Blur", (1.0f / (1.0f - blur)) - 1.0f); // blur intensitym_VignetteMaterial.SetTexture ("_VignetteTex", color2A); // blurred textureGraphics.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);}}
}
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
