您的位置:

探究Unity Post Processing

一、基础介绍

Unity Post Processing是Unity引擎内置的后处理特效插件,可以通过它轻松实现诸如景深、运动模糊、颜色校正、环境光遮蔽、反射和屏幕空间反射等一系列强大的特效。

Unity Post Processing支持在多个平台上使用,并且可以在代码上轻松修改和控制各种特效。它还允许开发者自定义属于自己的后处理特效。

二、使用方法

Unity Post Processing可以轻松地在Unity编辑器中启用和配置。只需在菜单栏中选择Window -> Package Manager,然后在搜索框中输入Post Processing即可找到该插件。点击安装后,您将在项目中看到Post Processing Package文件夹。

要向您的相机添加Post Processing效果,您需要创建一个Post-ProcessingProfile资产。然后,您可以将它拖到相机组件的Post Processing Profile属性中,或者通过脚本动态加载它。现在,您可以选择添加不同的效果。以下是一个简单的代码示例,为相机添加名为 "MyProfile"的自定义后处理配置文件:

using UnityEngine.Rendering.PostProcessing;

public class MyPostProcess : MonoBehaviour{
	private PostProcessLayer postProcessLayer;

    void Start(){
        if(Camera.main){
            postProcessLayer = Camera.main.GetComponent();
            if(postProcessLayer!=null){
                PostProcessVolume volume = Camera.main.gameObject.AddComponent(typeof(PostProcessVolume)) as PostProcessVolume;
                volume.isGlobal = true;
                volume.sharedProfile = Resources.Load
   ("MyProfile");
            }
        }
    }
}

   
  

三、具体特效实现

1、景深特效

景深又称为“焦外模糊”,是一种传达摄影视觉语言非常强大的技巧。Unity Post Processing中内置了High Quality Depth of Field效果。您可以在Post ProcessingVolume组件中启用它,并调整各个参数。以下是示例代码:

using UnityEngine.Rendering.PostProcessing;

public class MyPostProcess : MonoBehaviour{
    private PostProcessVolume postProcessVolume;

    void Start(){
        postProcessVolume = GetComponent();
        DepthOfField depthOfField;
        if (postProcessVolume.profile.TryGetSettings(out depthOfField)){
            depthOfField.active = true;
        }   
    }
}

  

2、颜色校正特效

Unity Post Processing也可以很方便地实现颜色校正特效。Color Grading效果使您可以通过LUT纹理改变整个场景的色调和色彩平衡。以下是示例代码,演示如何将LUT纹理加载到Color Grading效果中:

using UnityEngine.Rendering.PostProcessing;

public class MyPostProcess : MonoBehaviour{
    PostProcessVolume postProcessVolume;
    ColorGrading cg;

    void Start()
    {
        postProcessVolume = gameObject.AddComponent(); 
        postProcessVolume.isGlobal = true;       
        cg = ScriptableObject.CreateInstance
   ();
        Texture2D lut = Resources.Load
    ("MyLUT");
        cg.enabled.Override(true);
        cg.gradingMode.Override(GradingMode.HighDefinitionRange);
        cg.logLut.Override(lut);
        postProcessVolume.sharedProfile = new PostProcessProfile()
        {
            settings =
            {
                cg
            }
        };
    }
}

    
   
  

3、环境光遮蔽特效

环境光遮蔽(AO)可以模拟光线在物体之间传播时产生的自然现象,比如阴影和遮蔽。Unity Post Processing中的Ambient Occlusion效果可以轻松添加AO特效。以下是示例代码:

using UnityEngine.Rendering.PostProcessing;

public class MyPostProcess : MonoBehaviour{
    private PostProcessVolume postProcessVolume;

    void Start(){
        postProcessVolume = GetComponent();
        AmbientOcclusion ambientOcclusion;
        if (postProcessVolume.profile.TryGetSettings(out ambientOcclusion)){
            ambientOcclusion.active = true;
            ambientOcclusion.intensity.Override(1f);
        }   
    }
}

  

四、自定义特效

Unity Post Processing不仅支持内置的特效,还可以让开发者自定义他们自己的效果。

要创建自己的Post Processing特效,您需要继承PostProcessEffectRenderer类,并重写两个方法:

第一个是Render方法。在这个方法中,您可以执行您自己的特效代码。这个方法接受一个参数源Texture和一个目标RenderTexture,您可以在这个RenderTexture中渲染出任何您想呈现的特效效果。

第二个是Create方法。在这个方法中,您需要创建一个Shader,它将渲染出您的特效。您需要使用该Shader创建一个Material,以便在Render方法的渲染过程中使用它。

以下是代码示例,展示如何使用自定义特效:

using UnityEngine;
using UnityEngine.Rendering;
using UnityEngine.Rendering.PostProcessing;

public class MyCustomFx : PostProcessEffectRenderer
{
    public override void Render(PostProcessRenderContext context)
    {
        var sheet = context.propertySheets.Get(Shader.Find("Hidden/Custom/MyCustomFx"));
        sheet.properties.SetFloat("_Intensity", settings.intensity);
        context.command.BlitFullscreenTriangle(context.source, context.destination, sheet, 0);
    }
}

[UnityEngine.Scripting.Preserve]
[System.Serializable]
[UnityEngine.Rendering.PostProcessing.PostProcess(typeof(MyCustomFx), PostProcessEvent.AfterStack, "Custom/MyCustom")]
public class MyCustom : PostProcessEffectSettings
{
    [Range(0f, 1f)]
    public FloatParameter intensity = new FloatParameter { value = 0.5f };
}

  

五、总结

Unity Post Processing为开发者提供了极为便捷的制作后处理特效的方式,提高了场景视觉效果和开发效率。无论是内置特效还是自定义特效,都可以通过Post ProcessingVolume轻松地应用到相机上,再结合代码控制,使得场景的表现力更为丰富和灵活。