内容来源于B站教学视频:
Unity社区直播 Post Processing 后处理的介绍和使用
一、下载与获取
- 以2019版本的Unity为例,首先在Windows -> Package Manager中搜索Post Pocessing之后将包安装;
- 安装后可通过右键Create下创建Post-pocessing profile并命名My Profile,该按钮位于Create -> Scene下方;
- 在场景中创建一个空物体,命名为PP Volume,将已经创建出的My Profile挂载到该物体上,记得勾选isGlobal使其效果能够影响全局;
- 可通过Add Effect为其添加不同的后处理效果。
二、不同后处理效果中英对照
(一)Camera & Cinematic Effects 相机和电影视觉效果
- Bloom【辉光、柔光效果】
- Chromatic 【色差效果】
- Film Grain 【胶片颗粒】
- Vignette【暗角效果、边角压暗】
- Depth of Field【景深】-焦距外的地方模糊
- Motion Blur【运动模糊】
- Lens Distortion【镜头畸变、扭曲效果】
- Panini Projection【帕尼尼投影】-中间鼓起来,其他地方依然垂直于将镜头
- (2019)Ambient Occlusion【环境光遮蔽】-物体间遮挡的阴影
- (2019)Screen-space Reflections
(二)颜色效果
- Tonemapper【色调映射】
- White Balance【白平衡】
- Color Adjustment【色彩调整】
- Split Tone【色调分离】
- Channel Mixer【通道混合器】
- Color Curves【颜色曲线】
- Shadows,Midtones,Highlights【阴影、中间色调、高光】
- Life.Gamma,Gain【提升、伽马、增益】
- Color Lookup Talbe【颜色查找LUT】-在PS中导出相应文件,可使画面按照那个文件着色
(三)其它
- Dithering【抖色】-消除色阶,使画面更自然
- Anti-Aliasing【反锯齿、抗锯齿】
三、控制代码
以边角压暗效果和辉光效果为例。
(一)直接获取
using UnityEngine;
using UnityEngine.Rendering.PostProcessing;
pulbic class PPController:MonoBehaviour
{
private PostProcessVolume volume;//体积,这里指的是容量,容量里有各个设置
private Vignette vignette;
private Bloom bloom;
private bool isFading;
[SerializeField] private float fadeSpeed = 0.35f;
[SerializeField] private Color modifiedColor;
private void Start()
{
volume = GetComponent<PostProcessVolume>();
volume.profile.TryGetSettings(out vignette);
voluem.profile.TryGetSettings(out bloom);
}
private void Update()
{
//按键瞬间变化
if(Input.GetKeyDown(KeyCode.Space))
{
//vignette,intensity.value=1.0f;//FloatPara -> Float
vignette.intensity.Override(1.0f);//效果同上
//vignette.enabled.Override(false);//效果禁用
}
//按键逐渐变化
if(Input.GetKeyDown(KeyCode.Space))
{
isFading = true;
}
if(isFading)
{
vignatte.intensity.value += fadeSpeed * Time.deltaTime;
Debug.log("Increase intensity");
if(vignette.intensity.value >= 0.75f)
{
isFading = false;
}
}
if(Input.GetKeyDown(KeyCode.D))
{
bloom.color.value = modifiedColor;
}
}
}
(二)创建组建再获取
using UnityEngine;
using UnityEngine.Rendering.PostProcessing;
public class PPController:MonoBehaviour
{
private PostPocessVolume volume;
private Vignette vignette;
private void Start()
{
vignette = ScriptableObject.CreateInstance<Vignette>();
vignette.enabled.Override(true);
vignette.intensity.Override(1.0f);
volume = PostPocessManager.instance.QuickVolume(gameobject.layer,1,vignette);
}
private void Update()
{
vignette.intensity.value = Mathf.Sin(Time.realtimeSinceStartup);
}
private void onDestory()
{
RuntimeUtilities.DestoryVolume(volume,true,true);
}
}
(三)扣血效果案例
using UnityEngine;
using UnityEngine.Rendering.PostProcessing;
public class PPController:MonoBehaviour
{
private PostProcessVolume volume;//体积,这里指的是容量,容量里有各个设置
private Vignette vignette;
[SerializeField] private Color hurtColor;
[SerializeField] private float hurtSpeed;
[HideInInspector] public bool isDamaging;
private bool isBack;
private void Start()
{
volume = GetComponent<PostProcessVolume>();
volume.profile.TryGetSettings(out vignette);
}
private void Update()
{
if(isDamaging && isBack == false)
{
vignette.intensity.value += hurtSpeed * Time.deltatime;
vignette.color.value = hurtColor;
}
if(vignette.color.value >= 0.75f)
{
isDamaging = false;
isBack = true;
}
if(isBack)
{
vignette.intensity.value -= 5f * hurtSpeed *Time.deltaTime;
if(vignette.intensity.value <= 0.05f)
{
isBack = false;
}
}
}