目录
3.4.2 High Quality Filtering(高质量过滤)
8.6 Camera Rotation Velocity Clamp
16. Shadow、Midtones、Highlights(阴影、中间调、高光)
目录
3.4.2 High Quality Filtering(高质量过滤)
8.6 Camera Rotation Velocity Clamp
16. Shadow、Midtones、Highlights(阴影、中间调、高光)
实时渲染中的后处理(Post-processing)发生在每一帧被渲染完成之后。我们可以通过后处理为画面添加各种效果,比如调整画面明暗对比度、整体颜色、白平衡、抗锯齿、景深、运动模糊等。HDRP中有关后处理的技术也被集成在Volume框架中,因此我们不必像导入默认渲染管线一样导入额外的后处理包。
除了通过Volume添加的后处理效果,也可以通过Camera组件控制画面的抗锯齿(Anti-aliasing)效果,这也属于后处理的范畴。
一、后处理效果顺序
HDRP渲染管线会按照下图中所示的顺序来应用后处理效果。HDRP也会将多个后处理效果集中到同一个Compute Shader中以减少渲染绘制批次。
二、16个后处理效果
1. Tonemapping(色调映射)
将画面中的HDR(高动态)值重映射到LDR(低动态)值,重映射以后的画面适合在普通显示器上显示。有5种色调映射模式:
- None:不应用色调映射。
- Neutral:对色彩和饱和度影响最小。如果我们会在当前画面上应用更多的颜色分级(Color Grading),可以应用此模式。
- ACES:比Neutral模式产生的对比度高,会影响色彩和饱和度。应用此模式后画面效果更接近于电影画面。
- Custom(自定义曲线):可以通过曲线的方式来使用更多的色调映射属性和选项。
- External:使用在外部软件(比如Photoshop)中制作的自定义3D查找纹理(LUT,Lookup table)作为色调映射的参考。LUT是一种较为简单的颜色分级方法。它的原理是将屏幕上的像素替换为LUT中的对应数值。如果目标平台不支持高级颜色分级(Color Grading),可以使用LUT方法。
2.White Balance(白平衡)
用于解决画面中偏色问题(偏色问题会导致画面看上去不真实)。另外,也可以用白平衡将画面调整为偏暖或者偏冷,偏绿或者偏洋红。
3. Bloom(泛光)
应用泛光效果可以让画面中明亮部分的边缘发光,泛光用于让画面中的明亮部分变得更亮。在泛光中还可以使用Lens Dirt效果,本质上就是往整个画面上叠加一张纹理(可以从HDRP包下载界面下载Additional Post-processing Data,使用里面的Lens Dirt纹理)。
3.1 Quality
用于设置泛光的显示效果。质量等级设置可以在HDRP配置文件中完成。
3.2 Bloom
3.2.1 Threshold(临界值)
用于过滤亮度小于此数值的像素。也就是说,亮度小于此数值的像素不会参与泛光的计算。在数值等于0时,泛光遵守能量守恒定律;如果大于0,能量守恒定律会被打破。
3.2.2 Intensity(强度)
用于调整泛光的强度。
3.2.3 Scatter(散射)
数值越大,明亮部分的泛光效果范围越大。
3.2.4 Tint(着色)
针对泛光效果进行着色。
3.3 Lens Dirt
3.3.1 Texture(纹理)
为泛光叠加一张纹理,比如包含光晕或者灰尘的纹理。
3.3.2 Intensity(强度)
用于调整纹理叠加的强度。
3.4 Advanced Tweaks
3.4.1 Resolution(分辨率)
(只在Quality被设置为Custom时可用),当选择Quarter(四分之一)或者Half(一半)的屏幕分辨率用于泛光的计算时,可以提升泛光的效果。
3.4.2 High Quality Filtering(高质量过滤)
(只在Quality被设置为Custom时可用),启用后HDRP会使用Bicubic过滤算法,而不是Bilinear过滤算法。虽然启用该选项会增加性能消耗,但是可以让泛光效果更平滑。
3.4.3 Anamorphic(镜头畸变)
选择该选项,在计算泛光效果时,会把镜头的畸变考虑进去。
4.Film Grain(胶片颗粒)
模拟使用物理胶片拍摄时画面中出现的噪点。这些噪点通常由物理胶片上的小粒子所导致。
4.1 Type
可以选择预置的Thin、Medium、Large噪点,也可以自己指定(Custom)一张纹理作为噪点的来源。
4.2 Intensity
用于控制噪点的强度。
4.3 Response
用于控制生成噪点的曲线。数值越大,在高亮区域的噪点越少。
5. Depth of Field(景深)
现实世界的相机镜头只能在固定距离内对某个物体聚焦,更近或者更远的物体会呈现虚化的效果。景深就是用来模拟真实相机镜头的这个特性的。
5.1 Focus Mode(聚焦模式)
可以选择Off(不使用景深),或者Use Physical Camera(使用物理相机)模式,也可以选择Manual模式。如果选择使用物理相机,界面上不会有Near Range和Far Range这两个选项,会有一个额外的Focus Distance(聚焦距离)选项用于设置相机到聚焦点的距离。其他效果可以通过摄像机组件的物理相机参数来控制。
5.2 Quality(质量)
这里的设置对应HDRP配置文件中的设置,除Custom外。
5.3 Near Range(近处模糊)
Start:近处模糊开始的位置(离开相机的距离)。
End:超过此距离就不再模糊。到结束位置的距离越远,模糊渐变的效果越不明显。
5.4 Far Blur(远处模糊)
Start:远处模糊开始的位置(离开相机的距离)。
End:超过此距离就不再模糊。到结束位置的距离越远,模糊渐变的效果越不明显。
6. Panini Projection(帕尼尼投影)
帕尼尼投影会对画面进行变形操作,让画面看起来好像包裹在一个圆柱体上(中间凸起)
6.1 Distance(距离)
用于控制强度。数值越大,中间越凸起。
6.2 Crop to Fit(裁剪以适应屏幕)
裁剪画面以适应屏幕尺寸。
7. Lens Distortion(镜头畸变)
用于模拟真实世界中镜头的畸变效果。
7.1 Intensity(强度)
用于控制镜头畸变的强度。数值越大,镜头效果越扭曲。
7.2 X Multiplier(X轴乘数)
控制X轴向的畸变强度。如果数值为0,则X轴向没有畸变。
7.3 Y Multiplier(Y轴乘数)
控制Y轴向的畸变强度。如果数值为0,则Y轴向没有畸变。
7.4 Center(中心点)
设置画面畸变发生的中心点。
7.5 Scale(缩放)
当畸变过度时(强度变大),画面周围一圈的像素点会变形得太厉害导致无法使用,这时可以增大该数值,把画面放大,以隐藏周围一圈变形过度的像素。
8. Motion Blur(运动模糊)
用于模拟真实世界中,因为相机或物体的移动速度大于曝光速度而导致的模糊效果。要使用运动模糊效果,我们必须先在HDRP配置文件中启用Motion Vectors选项,因为计算运动模糊时HDRP会使用速度缓冲(Velocity Buffer)中的速度信息。
8.1 Intensity(强度)
用于控制运动模糊效果的强度。如果设为0,则意味着没有运动模糊效果。
8.2 Quality(质量)
可在HDRP配置文件中进行质量等级的设置。如果选择Custom(自定义),则可以通过下面的Sample Count(采样数)参数设置采样值的大小。
8.3 Sample Count(采样值)
只有在选择自定义质量等级时该参数才生效。其数值越高,运动模糊效果越平滑,质量越高,但是性能消耗越高。
8.4 Maximum Velocity(最大速率)
画面中任何速度大于此数值的像素不会被计算进运动模糊中。数值越大,模糊效果越强(因为更多像素被包含进了运动模糊计算中)。
8.5 Minimum Velocity(最小速率)
画面中任何速度小于此数值的像素不会被计算进运动模糊中。数值越大,越少像素被包含进运动模糊计算中,性能越好。但是画面中移动速度较慢的物体不会产生运动模糊。
8.6 Camera Rotation Velocity Clamp
在此设置相机旋转速度。当相机的旋转速度大于此数值时,相机的旋转会被用于运动模糊的计算中。此数值越高,相机的旋转运动模糊的效果看上去越宽大。
8.7 Camera Motion Blur
如果启用该选项,则计算运动模糊时会把相机本身的移动考虑在内;如果禁用,则相机本身的移动将不会用于运动模糊的计算。
9. Chromatic Aberration(色差)
用于模拟真实镜头会产生的色差现象。色差现象产生的本质是因为镜头无法把所有颜色放到同一个点上。
9.1 Quality(质量)
可以在HDRP配置文件中设置质量等级对应的采样数。如果选择自定义,那么最下面的Max Samples选项会被启用,可以在这里输入自定义的采样值。
9.2 Spectral LUT(光谱LUT)
可以指定一张纹理来提供自定义的边缘颜色。如果不关联纹理图片,HDRP会使用默认的边缘颜色。
9.3 Intensity(强度)
用于控制色差的强度。
10. Vignette(晕映)
可以将画面周围变暗或者减少饱和度。在真实相机上也会发生类似的现象,这通常是因为叠加的滤镜或者第二套镜头导致的。我们可以通过这样的方式将观众的视觉引导到画面中央区域。
可以选择Procedural(程序化)或者Masked(遮罩)模式。
10.1 Procedural(程序化)模式
- Color(颜色):在这里挑选晕映的颜色。
- Center(中心点):默认的中心点为正中心,可以在这里设置不同的数值进行偏移。
- Intensity(强度):控制变暗的程度。
- Smoothness(平滑度):数值越大,暗部扩散得越大。
- Roundness(正圆度):控制变暗部分到底有多圆。
- Rounded(是否为圆形):如果勾选该选项,则整个变暗区域的形状就会是正圆形。
10.2 Masked(遮罩)模式
- Color(颜色):在这里挑选叠加的颜色。
- Mask(遮罩):可以在这里选择一张黑白纹理图片。白色区域为透明部分,黑色区域为晕映部分。
- Opacity(透明度):用于控制整个晕映的透明度。
11. Lift、Gamma和Gain(颜色分级)
用于对整个画面做颜色分级。
- Lift:用于控制画面中黑色调的颜色和亮度。可以使用该选项设置更夸张的阴影效果。
- Gamma:用于控制画面中中度色调的颜色和亮度。
- Gain:用于控制画面中高亮区域的颜色和亮度。该设置会让高亮的地方更亮。
- 色盘。可以使用色盘下面的滑块控制颜色的亮度。右键单击色盘会重置圆点到中心,也会重置滑块居中。
12. Channel Mixer(通道混合)
通过对红色通道、绿色通道和蓝色通道中的RGB数值进行调整,对整个画面的RGB值进行调整。在默认情况下红色通道的Red值为100,其他为0;绿色通道的Green值为100,其他为0;蓝色通道的Blue值为100,其他为0。
13. Color Curve(颜色曲线)
使用曲线控制画面中指定区域的色彩、饱和度或者亮度。使用颜色曲线可以实现色彩替换或者调整饱和度。
- Sat Vs Sat:针对色彩饱和度。
- Y轴表示目标色彩饱和度。曲线的底部对应黑白色,曲线的顶部对应最大饱和度,中间对应正常饱和度。
- X轴表示画面上像素的原始饱和度,针对的是画面中每个像素的饱和度。X轴左侧对应画面中颜色较浅的区域;右侧对应画面中颜色饱和度较大的区域。
14. Color Adjustment(颜色调整)
用于调整画面整体的色调、亮度和对比度。
- Post Exposure(后曝光):用于调整整体的曝光。HDRP会在色调映射之前应用此设置。单位为EV,不是EV100。
- Contrast(对比度):用于调整对比度。调大其数值时,会扩展色调的范围;反之会缩小色调的范围。
- Color Filter(颜色滤镜):为整个画面叠加所选颜色。
- Hue Shift(色彩偏移):用于调整画面中所有的颜色。
- Saturation(饱和度):调整画面中所有颜色的饱和度。
15. Split Toning(分离调色)
根据画面中不同区域的亮度,调整相关区域的整体颜色。可以为画面中的阴影和高光区域分别指定不同的颜色。
- Shadows(阴影):为阴影区域设置颜色。
- Highlights(高光):为高光区域设置颜色。
- Balance(平衡):大于0的数值会让整体画面的颜色偏向高光区的颜色;小于0的数值会让整体画面的颜色偏向阴影区的颜色。
16. Shadow、Midtones、Highlights(阴影、中间调、高光)
可用于精确控制画面中的阴影、中间调和高光区域的颜色和亮度(比使用Lift、Gamma和Gain参数要准确很多)。
三、举个例子
利用Vignette实现圆形划像转场效果:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Rendering;
public class TestVolume : MonoBehaviour
{
public Volume volume;
private List<VolumeComponent> list;
private float timer;
private float totalTimer = 2.0f;
// Start is called before the first frame update
void Start()
{
list = volume.profile.components;
//for (int i = 0; i < list[9].parameters.Count; i++)
//{
// Debug.Log(i + "," + list[9].parameters[i]);
//}
}
// Update is called once per frame
void Update()
{
timer += Time.deltaTime;
float value = Mathf.Lerp(1, 0.15f, timer/totalTimer);
list[9].parameters[3].SetValue(new FloatParameter(value));
}
}