在unity默认bulit-in管线中,后处理效果一般可以在在相机上挂一个脚本加上OnRenderImage函数,并使用Graphics.Blit用某个材质对最后相机展现的画面进行处理。
在URP中OnRenderImage不生效了,并且有了一个专门做后处理的Volume。但由于相关代码都写在了一个叫PostProcessPass的脚本中,除非修改源码,否则无法仅通过扩展一个VolumeComponent来实现一个自定义后处理。好在URP提供了一个RendererFeature的功能,我们可以通过这个自行添加一个pass管理我们的自定义Volume。事实上URP也是这么做的。
1.创建自定义VolumeComponent
要注意的是这里要写在面板上显示参数,不能定义int,float这些基础类型,unity做了一层封装FloatParameter,IntParameter之类。要定义限制范围的参数要使用ClampedFloatParameter等而不是FloatRangeParameter,一开始被坑了一下。
using UnityEngine;
using UnityEngine.Rendering;
using UnityEngine.Rendering.Universal;
[System.Serializable, VolumeComponentMenu("XPostProcess/ColorAdjustMenstsBasedPosAndDepth")]
public class ColorAdjustMenstsBasedPosAndDepth : VolumeComponent, IPostProcessComponent
{
public BoolParameter enableEffect = new BoolParameter(true);
public FloatParameter radius = new FloatParameter(1000000);
public Vector3Parameter center = new Vector3Parameter(Vector3.zero);
public ClampedFloatParameter intensity = new ClampedFloatParameter(0.5f, 0, 1);
public ClampedFloatParameter backgraoundIntensity = new ClampedFloatParameter(0.5f, 0, 1);
public ColorParameter backgroundColor = new ColorParameter(Color.black);
public Vector3Parameter colorScale = new Vector3Parameter(Vector3.one);
public bool IsActive() => enableEffect == true;
public bool IsTileCompatible() => false;
}
VolumetiComponent定义完后就可以在Volume的面板上看到并添加了。
2.创建自定义RenderFeature
using UnityEngine.Rendering.Universal;
public class XPostProcessRenderFeature : ScriptableRendererFeature
{
XPostProcessRenderPass m_ScriptablePass;
public override void AddRenderPasses(ScriptableRenderer renderer, ref RenderingData renderingData)
{
var src = renderer.cameraColorTarget;
var dest = RenderTargetHandle.CameraTarget;
m_ScriptablePass.Setup(src,</

本文介绍如何在Unity的Universal Render Pipeline (URP)中实现自定义后处理效果,包括创建自定义VolumeComponent、RenderFeature及RenderPass的具体步骤。
最低0.47元/天 解锁文章
5218





