目录
一、后处理效果顺序
二、16个后处理效果
1. Tonemapping(色调映射)
2.White Balance(白平衡)
3. Bloom(泛光)
3.1 Quality
3.2 Bloom
3.2.1 Threshold(临界值)
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(分辨率)
3.4.2 High Quality Filtering(高质量过滤)
3.4.3 Anamorphic(镜头畸变)
4.Film Grain(胶片颗粒)
4.1 Type
4.2 Intensity
4.3 Response
5. Depth of Field(景深)
5.1 Focus Mode(聚焦模式)
5.2 Quality(质量)
5.3 Near Range(近处模糊)
5.4 Far Blur(远处模糊)
6. Panini Projection(帕尼尼投影)
6.1 Distance(距离)
6.2 Crop to Fit(裁剪以适应屏幕)
7. Lens Distortion(镜头畸变)
7.1 Intensity(强度)
7.2 X Multiplier(X轴乘数)
7.3 Y Multiplier(Y轴乘数)
7.4 Scale(缩放)
8. Motion Blur(运动模糊)
8.1 Intensity(强度)
8.2 Quality(质量)
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(质量)
9.2 Spectral LUT(光谱LUT)
9.3 Intensity(强度)
10. Vignette(晕映)
10.1 Procedural(程序化)模式
10.2 Masked(遮罩)模式
11. Lift、Gamma和Gain(颜色分级)
12. Channel Mixer(通道混合)
13. Color Curve(颜色曲线)
14. Color Adjustment(颜色调整)
15. Split Toning(分离调色)
16. Shadow、Midtones、Highlights(阴影、中间调、高光)
三、举个例子
目录
一、后处理效果顺序
二、16个后处理效果
1. Tonemapping(色调映射)
2.White Balance(白平衡)
3. Bloom(泛光)
3.1 Quality
3.2 Bloom
3.2.1 Threshold(临界值)
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(分辨率)
3.4.2 High Quality Filtering(高质量过滤)
3.4.3 Anamorphic(镜头畸变)
4.Film Grain(胶片颗粒)
4.1 Type
4.2 Intensity
4.3 Response
5. Depth of Field(景深)
5.1 Focus Mode(聚焦模式)
5.2 Quality(质量)
5.3 Near Range(近处模糊)
5.4 Far Blur(远处模糊)
6. Panini Projection(帕尼尼投影)
6.1 Distance(距离)
6.2 Crop to Fit(裁剪以适应屏幕)
7. Lens Distortion(镜头畸变)
7.1 Intensity(强度)
7.2 X Multiplier(X轴乘数)
7.3 Y Multiplier(Y轴乘数)
7.4 Center(中心点)
7.5 Scale(缩放)
8. Motion Blur(运动模糊)
8.1 Intensity(强度)
8.2 Quality(质量)
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(质量)
9.2 Spectral LUT(光谱LUT)
9.3 Intensity(强度)
10. Vignette(晕映)
10.1 Procedural(程序化)模式
10.2 Masked(遮罩)模式
11. Lift、Gamma和Gain(颜色分级)
12. Channel Mixer(通道混合)
13. Color Curve(颜色曲线)
14. Color Adjustment(颜色调整)
15. Split Toning(分离调色)
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));
}
}