文章目录
安装
创建配置文件
创建空物体并添加Post-process Volume
将配置文件拖到组件中,勾选is Global,这样效果才会全局响应,点击add effect添加各种效果,添加的效果信息在配置文件中也能看到,是同步的
创建postprocessing渲染专用的层,并将空物体选为该层
选中相机,添加post process layer组件,并在组件中选为该层
如果是URP版本:
1.在Hierarchy创建Global Volume;
2.在Global Volume组件中点击New,创建配置文件;
3.勾选主相机的use post process;
4.点击 add override添加效果;
5.URP要在URP资源中勾选HDR;
Ambient Occlusion 环境光遮蔽
适用:物体之间的交界处,模拟边边角角的暗部的效果;
调整前:
调整后:
Bloom 辉光效果
适用:从明亮的区域扩散出来的柔光效果;
调整前:
调整后;
常用的:
Threadshold:低于这个值的会变得更加柔光;
Dirtiness:污迹效果,设置贴图会有各种效果;
Chromatic Aberration 色差效果
适用:越往相机边缘越会有色彩偏移的效果,类似醉酒的感觉;
调整前:
调整后:
Vignette 边角压暗
适用:边角变暗,突出画面中心,类似狙击或者恐怖游戏的感觉;
调整前:
调整后:
Depth of Field 景深
适用:虚化背景;
调整前:
调整后;
Aperture:光圈比率,值越小,越模糊;
Motion Blur 运动模糊
Lens Distortion 镜头扭曲
调整前:
调整后;
Panini Projection 帕尼尼投影
适用:相当于拿放大镜看中间,两边还是正常状态;
其他的概念
Dithering 抖色
线性插值消除色阶,在颜色之间平滑过渡;2020版在相机中勾选
Anti-Aliasing 反锯齿
颜色效果
Tonemapper 色调映射
ACES:类似电影画风
White Balance 白平衡
Temperature控制冷暖色调,最小就是冷-蓝,最大是暖-黄橙
Tint:绿色和紫色的调整
Tone
post-exposure:曝光度
color filter:颜色过滤
Hue Shift:调整颜色通道
Saturation:饱和度,0时不会有颜色溢出
contrast:对比度
Hue vs Hue
用什么颜色替换原来的颜色
点击override开始编辑:
选择橙色的部分(两个点),在中间点一个点选择用什么颜色替换橙色
原来:
调整后:
Hue vs Sat
将特定的颜色饱和度降低
Sat vs Sat
整体饱和度调整
微调部分:
调整通道的量值
Lift:调整画面的暗部和明亮程度,值越小,暗部会加深;
Gamma:控制整体画面的中间色调;
Gain:柔和调节高光部分;
代码控制
有组件的情况
private PostProcessVolume volume;
private Vignette vignette;
private bool isFading;
[SerializeField] private float fadeSpeed = 0.35f;
#region 如何获取
void Start()
{
volume = GetComponent<PostProcessVolume>();
volume.profile.TryGetSettings(out vignette);
}
void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{
//不使用value就要讲floatPara强转float
//vignette.intensity.value = 1.0f;
//override可以退出以后保存设置
//vignette.intensity.Override(1.0f);
//vignette.enabled.Override(false);
isFading = true;
}
if (isFading)
{
vignette.intensity.value += fadeSpeed * Time.deltaTime;
if (vignette.intensity.value >= 0.75f)
isFading = false;
}
}
#endregion
没有组件的情况
#region 如何创建
private void Start()
{
vignette = ScriptableObject.CreateInstance<Vignette>();
vignette.enabled.Override(true);
vignette.intensity.Override(1.0f);
//创建volume对象(渲染层,优先度,要配置的设置)
volume = PostProcessManager.instance.QuickVolume(gameObject.layer, 1, vignette);
}
private void Update()
{
vignette.intensity.value = Mathf.Sin(Time.realtimeSinceStartup);
Debug.Log(vignette.intensity.value);
}
private void OnDestroy()
{
RuntimeUtilities.DestroyVolume(volume, true, true);
}
#endregion
简易受伤效果
#region 受伤效果
private void Start()
{
volume = GetComponent<PostProcessVolume>();
volume.profile.TryGetSettings(out vignette);
}
private void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
isDamaging = true;
if (isDamaging&&isBack == false) {
vignette.intensity.value += hurtSpeed * Time.deltaTime;
vignette.color.value = hurtColor;
if (vignette.intensity.value > 0.75f)
{
isDamaging = false;
isBack = true;
}
}
if (isBack)
{
vignette.intensity.value -= 5f * hurtSpeed * Time.deltaTime;
if (vignette.intensity.value <= 0.05)
isBack = false;
}
}