Post Processing Stack (PPS) 是Unity引擎中的一个模块,用于管理和应用各种后处理效果到渲染的图像上。它允许开发者和艺术家在最终图像输出之前,对场景的渲染结果进行一系列的图像处理操作,从而增强视觉效果或实现特定的艺术风格。对这个专门的后处理模块,我们成为Unity Post Processing Stack(后处理堆栈),因为在这个组件中多个后处理可以按照顺序依次实现,像一个栈的存入弹出,故得名。目前根据实现方法分为V1、V2和V3.
https://github.com/Unity-Technologies/PostProcessing?tab=readme-ov-file
(来自Unity Graphic项目的branch。主项目在这里https://github.com/Unity-Technologies/Graphics )
PPS V1 #
类似于启动时的bat/Tags文件,没有明确的「配置文件」概念,所有效果都集中在脚本中控制;基本上通过直接访问 Camera 的组件来应用效果。优点是可以快速实现简单的效果,不用考虑override/sealed等覆写和HLSL交互实现。缺点是难以实现高级的后处理效果。
var postProcessing = Camera.main.GetComponent<PostProcessingBehaviour>();
postProcessing.profile.bloom.enabled = true; // 启用 Bloom 效果
PPS V2 #
是目前使用较多的后处理标准。因为Unity在PPS V2采用模块化设计,效果分离为独立模块,易于扩展和控制;对应的代码/模块被储存在存储在 PostProcessingProfile 中,便于共享和编辑 。 (如 PostProcessEffectSettings和PostProcessEffectRenderer 和Shader之间互相隔离)
核心功能是利用PostProcessEffectSettings 和 PostProcessEffectRenderer实现自定义的扩展效果。
在 V2 中,自定义效果需要继承以下两个核心类:
**PostProcessEffectSettings**
用于定义自定义效果的参数和设置。**PostProcessEffectRenderer**
用于实现效果的渲染逻辑。
using UnityEngine;
using UnityEngine.Rendering.PostProcessing;
// 定义自定义效果的参数
[System.Serializable]
[PostProcess(typeof(CustomEffectRenderer), PostProcessEvent.AfterStack, "Custom/CustomEffect")]
public class CustomEffect : PostProcessEffectSettings
{
public FloatParameter intensity = new FloatParameter { value = 1.0f }; // 参数1
public ColorParameter tint = new ColorParameter { value = Color.white }; // 参数2
}
using UnityEngine;
using UnityEngine.Rendering.PostProcessing;
public class CustomEffectRenderer : PostProcessEffectRenderer<CustomEffect>
{
public override void Render(PostProcessRenderContext context)
{
var sheet = context.propertySheets.Get(Shader.Find("Hidden/CustomEffectShader"));
sheet.properties.SetFloat("_Intensity", settings.intensity);
sheet.properties.SetColor("_Tint", settings.tint);
// 应用 Shader 效果
context.command.BlitFullscreenTriangle(context.source, context.destination, sheet, 0);
}
}
工作原理 #
PostProcessEffectSettings类描述了效果的配置,包括所有参数(如强度、颜色等)。PostProcessEffectRenderer类负责渲染这些效果,通常需要使用 Shader 实现具体的视觉效果。
https://www.youtube.com/watch?v=ehyMwVnnnTg 讲述了如何使用V2标准实现角色描边。
PPS V3 #
PPS V3将特性完全集成到 Unity 的 URP(Universal Render Pipeline) 和 HDRP(High Definition Render Pipeline),不再作为独立插件,而是作为渲染管线的一部分。后处理效果将完全通过 Volume Profile 管理
效果参数不再通过 PostProcessVolume 调整,而是直接访问 Volume 组件。
using UnityEngine;
using UnityEngine.Rendering;
using UnityEngine.Rendering.Universal;
public class URPPostProcessingExample : MonoBehaviour
{
public Volume volume;
void Start()
{
// 获取 Volume Profile 中的 Bloom 设置
if (volume.profile.TryGet<Bloom>(out var bloom))
{
bloom.intensity.value = 3f; // 修改强度
}
}
}