Unity PostProcess的使用

Unity PostProcess的使用

本文介绍Unity后期处理效果的使用,主要从Unity和UE引擎的参考文档中整理资料,最后简单介绍了在项目中应用后处理效果的整体规划。


前言

终于完成了在移动平台下使用Unity引擎开发游戏项目效果向的三个总结,光照、线性空间和后期处理(其实还有一个PBR方向,因为可参考的文档太多就没有花时间去整理了)。掌握了这些知识点可以更好地帮助项目实现更好的美术效果、制定技术规范和优化制作流程。

关于光照的文档
Unity移动平台下的光照烘焙及优化

关于线性空间的文档
Unity项目从Gamma转Linear颜色空间的经验分享

关于后期处理的文档(本文)

三篇技术文档的提纲合集:

本文介绍Unity后期处理效果的使用,主要从Unity和UE引擎的参考文档中整理资料,最后简单介绍了在项目中应用后处理效果的整体规划。


一、官方文档

Post Process是基于屏幕的后期处理,原理是将摄像机显示的画面在缓冲区中使用滤镜和效果处理,然后再显示出来。可以用来模拟物理摄像机和电影特效。

https://docs.unity3d.com/Packages/com.unity.postprocessing@2.1/manual/index.html

本文档主要以Package中的Post Processing功能作使用说明,主要参考官方文档中对后期效果和参数的说明,有一部分参考资料来自Unreal Engine和其它技术文档。


二、安装

1、Unity 2018.1以上版本,使用Window -> Package Manager安装和更新PostProcessing。

2、低于Unity 2018,高于Unity 2017.1以上版本,可以从Github上下载:https://github.com/Unity-Technologies/PostProcessing
拷贝到Assts目录下使用。

3、目前版本是Post-processing v2,适用于Build-in Render Pipeline和LWRP,HDRP不需要从package安装,有更高级的解决方案。


三、基本使用

1、Post Process Layer
通常我们在Camera上挂一个Post Process Layer脚本用来控制后期效果。也可以挂在空物体上,通过Trigger设置Camera来对相机起作用。Layer用来管理Post Process Volume。

对Post Process Volume设置Layer,属于Post Process Layer中设置的Layer才会生效。

HDRP内置了Post-process,不需要Layer,直接使用Volume System控制后期效果。

Anti-aliasing移到了Camera上管理。

(1)Anti-aliasing
Anti-aliasing:抗锯齿(反走样)的算法,主要是用图像处理的方式抗锯齿,不依赖硬件设备。
https://docs.unity3d.com/Packages/com.unity.postprocessing@2.1/manual/Anti-aliasing.html

参考资料:https://vr.arvilab.com/blog/anti-aliasing

Unity引擎用到的几种抗锯齿方案:

  • FXAA:开销较低的一种抗锯齿方案,适用于移动平台。
  • SMAA:一种在FXAA的基础上改进的更高质量的抗锯齿方案,不支持motion vectors,不支持AR/VR。在移动平台尽量不使用或者降低Quality。
  • TAA:一种更高级的抗锯齿技术,增加了像素采样数,对运动中的边缘平滑处理的更好,建议在主机和PC平台使用,不支持GLES2。要求支持Motion vectors、Depth textures和Shader model 3。

几种抗锯齿方案的对比:

  • FXAA和SMAA的算法主要处理边缘的模糊;而TAA、MSAA的算法增加了采样率来处理动态画面,性能开销更大,但是对FPS类型的游戏有很强的效果提升。
  • FXAA适用于追求高帧率和性能的游戏,改善画质,开销极小,对画面边缘柔化处理。它的缺点是会让图像整体变得模糊,会丢失细节。
  • SMAA的效果优于FXAA,减少了锯齿,但是图像没有那么模糊,开销大于FXAA。
  • TAA对画质的改善较好,满足静态、动态的画面边缘平滑处理,性能开销可接受的情况下,适用于大部分情况。

(2)Dithering
Dithering:使用8-bit dithering像素点抖动技术,消除色阶。

参考资料:https://bartwronski.com/2016/10/30/dithering-in-games-mini-series/

(3)NaNs
NaNs:自动使用黑色像素替换Shader中的NaN(非法操作)或Inf(浮点值溢出或除0),对性能有轻微影响,所以仅在遇到不能解决的NaN问题时才使用。

2、Post Process Volume
通过Component -> Rendering -> Post-process Volume 或 GameObject -> 3D Object -> Post-process Volume添加后处理区域。

HDRP添加Volume脚本。

主要参数:
Is Global:是否全局使用。不勾选的情况下,需要创建一个colider或者trigger的组件来设置范围。
Weight:混合多个Volume的权重值。
Priority:决定Volume生效的顺序。
Profile:后期效果的配置文件。

3、Post Process Profile
在Project窗口使用Create -> Post-processing Profile 创建后期效果的配置文件。

HDRP使用Create ->Volume Profile 创建配置文件。

HDRP中的Volume统一管理了后期、环境设置、光照设置、自定义功能等。对应的Profile的功能也更多,进行了更细的子功能拆分,可以针对项目的情况制定使用规范。

通过Add Effect / Add Override 来添加后期效果。

在下一节各种后期效果的参数截图中,最右侧列出了HDRP的改动。

4、Effects
(1)Ambient Occlusion

Unity引擎用到的两种AO方案:

  • Scalable Ambient Obsurance:一种标准的AO方案,用于传统的平台,不能用于移动或主机平台,使用延迟渲染,开启HDR下才有效果,要求支持Depth & Normals textures和Shader model 3(Radius参数对性能有较大影响,降低Radius值可以减少性能开销;Quality的设置也可以减少性能开销)。
  • Multi-scale Volumetric Occlusion:优化过的一种AO方案,性能开销更小。要求支持Computer Shader和Shader Model 4.5。

以Unreal Engine的效果示例(近似Scalable Ambient Obsurance方案)。

参考资料:Ambient Occlusion

主要参数:

Intensity:调整暗部的程度。


Intensity强弱对比 0 vs 1

Thickness Modifier:调整遮挡的厚度,可以增强暗部区域,但是会在物体周围产生暗部的光晕。
Color:设置AO的偏色。
Ambient Only:仅影响环境光照。该选项仅用于延迟渲染和HDR。

(2)Auto Exposure
自动曝光用于调整图像的亮度范围,通过直方图调整找到一个平均亮度值。要求支持Computer Shader和Shader Model 5。

以Unreal Engine的效果示例:

主要参数:

曝光设置:
Filtering:设置直方图的范围,范围以外的值不参与平均亮度的计算。主要是为了排除过亮和过暗的部分。
Minimum EV:设置平均亮度的最小值,以EV为单位。
Maximum EV:设置平均亮度的最大值,以EV为单位。

Exposure Value 曝光值的理解:
EV是摄影学中的术语,EV的数值通常以1为单位,比如:-4,-3,-2,-1,0,1,2,3,4等,通常说曝光加一档或减一档是以成倍增长的,也就是2x。可以理解为EV越高,环境的亮度越高。

Exposure Compensation:曝光补偿值。0代表不调整,-1代表2倍暗,-2代表4倍暗,1代表2倍亮,2代表4倍亮。

适应设置:
Type:Progressive 动态自动曝光;Fixed静态的自动曝光。
Speed Up:从暗到亮的适应速度。
Speed Down:从亮到暗的适应速度。

(3)Bloom
Bloom是一种从图像的明亮区域扩散出来的柔光效果。要求支持Shader Model 3。

对性能有影响的参数主要是Diffusion、Anamorphic Ratio和Fast Mode。降低Diffusion的值可以减小性能开销,Anamorphic Ratio的绝对值越小,性能开销越小;可以在移动平台或低端设备上开启Fast Mode,可以减少性能开销。

Bloom效果的示例,参考资料:https://docs.unrealengine.com/en-US/Engine/Rendering/LightingAndShadows/AmbientOcclusion/index.html

主要参数:

柔光设置:
Intensity:设置柔光强度。

Threshold:设置一个阈值,高于阈值的亮度可以产生柔光。一般取低于1的值。

Soft Knee:在阈值上下做渐变调整。
Clamp:控制柔光的量。
Diffusion:设置面纱效果的扩散(Scatter),独立于屏幕分辨率。
Anamorphic Ratio:模拟一种镜头变形(anamorphic lens)效果,设置柔光的扩散方向,[-1,0]代表在垂直方向扩展,[0,1]代表在水平方向扩散。
Color:设置柔光的偏色。
Fast Mode:降低柔光的表现效果,减少性能开销。

Dirtiness设置(增加一个层来模拟灰层衍射效果):
Texture:设置模拟灰尘、污迹效果的纹理。

Intensity:设置镜头污迹量。

(4)Chromatic Aberration
色差效果,模拟相机镜头的颜色偏移,在图像边缘效果最明显。要求支持Shader Model 3。

对性能有影响的参数主要是Intensity和Fast Mode。Intensity值越大,为了得到平滑的色差效果,需要采样的次数越多,对性能影响越大。开启Fast Mode可以减小性能开销,效果就没有那么平滑了。

主要参数:

Spectral Lut:通过一张纹理来定义边缘色,控制效果。可以有四种常用的光谱纹理:Red/Blue(默认)、Blue/Red、Green/Purple、Purple/Green。不受分辨率影响,纹理大小可以尽可能小,比如:3x1,贴图压缩的Filter Mode选Point(no filter)时,效果会更粗糙。

Intensity:设置色差效果的强度。

Fast Mode:降低色差效果的表现,减少性能开销。

(5)Color Grading
后期校色可以调整画面的色调。

https://docs.unity3d.com/Packages/com.unity.postprocessing@2.1/manual/Color-Grading.html

https://docs.unrealengine.com/en-US/Engine/Rendering/PostProcessEffects/ColorGrading/index.html

Unity引擎用到的三种方案:

  • Low Definition Range (LDR):为低端设备提供的方案,将偏色存储在标准LUT中。LDR的Lookup Texture一般使用的是256x16大小,也可以使用1024x32,但是在一个项目中需要使用统一的分辨率,避免多个Volume之间混合时计算错误。
  • High Definition Range (HDR):为支持HDR的平台提供的方案。
  • External:为第三方软件自定义的3D log-encoded Texture提供的方案(类似LUT)。

主要参数:

  • Tonemapping调色设置:

Neutral:对画面颜色进行重新映射,对色相和饱和度的影响极小。
ACES:接近影视上使用的ACES(Academy Color Encoding System)调色效果,比Neutral算法对色相和饱和度的影响更大,使用ACES颜色空间来优化计算精度。

参考资料:https://www.oscars.org/science-technology/sci-tech-projects/aces

结合Bloom和Exposure两个效果可以看出Tonemapping的作用。


Bloom很强的情况下Tonemapping的效果


Exposure为3的情况下Tonemapping的效果

Custom:自定义设置。Tonemapping的不同效果主要在于映射曲线的不同。

  • Custom Tonemapping的设置:

调整的结果显示在Custom Tone Curve上。传统的调色效果可以通过这些参数调出,比如Tone Strength 0.3,Shoulder Strength:0.22。

Toe Strength:设置前段到中段的曲线的过渡,0代表无坡度,1代表较强的过渡。


Unreal Engine中Toe默认值0.55到0.8的对比效果

Toe Length:设置坡度的动态范围,值越小,坡度越短,过渡越快。
Shoulder Strength:设置中段到末端曲线的过渡,0代表无过渡,1代表较强的过渡。


Unreal Engine中Shoulder默认值0.26到1的对比效果

Shoulder Length:设置F-stops(EV)的动态范围。
Shoulder Angle:设置末端曲线下压的值。
Gamma:叠加一个Gamma函数。

  • White Balance白平衡设置:

Temperature:设置自定义色温,当色温匹配时,会呈现白色,当画面色温高于设定值会呈现暖色(黄色),当画面色温低于设定值会呈现冷色(蓝色)。
Tint:设置白平衡的偏色为绿色或品红色,在某些色温下颜色可能看起来为黄色或蓝色,偏色可以让白平衡产生的颜色更自然。

  • Tone色调设置:

Post-exposure:在调色前根据设置的EV值进行预曝光。
Color Filter:设置一个偏色。
Hue Shift:调整色相。
Saturation:调整饱和度。
Brightness:调整亮度,仅在LDR下可用。
Contrast:调整整体对比度。

  • Channel Mixer颜色通道混合设置:

可以分别对RGB三个通道的颜色进行影响,比如:Mixer设置为Red,正向调整Red、Green、Blue的值,代表分别将对应的颜色变为红色。

  • Trackballs设置(右键点击可以恢复默认值):

Lift:调整阴影和暗部。
Gamma:调整中间调。
Gain:调整高光。

  • Grading Curves校色曲线:

曲线校色是一种更高级的方式,用来调整色相、饱和度、明度的特定范围。Unity提供了八种方式:

YRGB Curves:仅用于LDR。X轴代表输入强度,Y轴代表输出强度,主要用来调整对比度和亮度。

Hue vs Hue:调整色相。X轴代表输入色相,Y轴代表输出色相,主要用来调整色相或替换颜色。

Hue vs Sat:调整特定色相的饱和度。X轴代表输入色相,Y轴代表输出饱和度,主要用来调整特别明亮的区域,让过亮的区域变得柔和。

Sat vs Sat:调整饱和度。X轴代表输入饱和度,Y轴代表输出饱和度。

Lum vs Sat:调整特定明度的饱和度。X轴代表输入明度,Y轴代表输出饱和度,主要用来降低黑暗区域的饱和度。

  • Unreal Engine对Color Correction的使用流程的总结:

Tonemapping是一个整体的效果,理想情况下不要动态调整或者分场景调整,整个项目应该使用同一套参数或效果。

使用全局的校色参数,从所有的属性中挑出一部分主要用来校色的参数,大部分的修改都使用这些参数,其它参数尽量不动。

尽量不要使用Gain属性(Unity的Trackballs-Gain)调整场景的曝光,它是用于不同颜色之间的微调。曝光使用Auto Exposure。

使用Offset属性(Unity的Trackballs-Lift)来提亮阴影和暗部区域,正值可以让暗部变亮,负值可以让暗部更暗。

尽量不使用LUT来校色,因为它是在调色后生效的,尽量使用Color Grading的参数来得到你要的效果,可以保证偏色效果的一致性。当然,LUT可以快速得到一个效果,通过调整校色参数来得到类似的效果。

(6)Depth of Field
景深是一种模拟相机变焦镜头的效果。

Unity引擎DOF的开销由Max Blur Size决定,非PC平台不推荐使用Medium以上的值,在移动平台建议使用最小值。要求支持Depth texture和Shader Model 3.5。

参考资料对DOF原理的介绍:https://photography.tutsplus.com/articles/understanding-the-factors-that-affect-depth-of-field--photo-6844

主要参数:

Focus Distance:设置焦距。
Aperture:设置光圈的比率(f-stop),值越大,景深效果越明显。

Focal Length:设置镜头与画面的距离,值越大,景深效果越浅。

Max Blur Size:设置背景虚化(bokeh)的最大半径,kernel Size值越大,GPU开销越大。bokeh是一种失焦时的形状。

参考资料:https://epicgames.ent.box.com/s/s86j70iamxvsuu6j35pilypficznec04

(7)Grain
颗粒效果是一种模拟相机胶片中的颗粒感带来的粗糙的噪点效果。

Unity引擎的Grain效果是基于合理变化的噪波,对性能有影响的参数主要是Colored。要求支持Shader Model 3。

主要参数:

Colored:使用带颜色的噪点。
Intensity:设置噪点的强度,值越大,效果越明显。
Size:设置噪点颗粒的大小。
Luminance Contribution:设置噪波曲线受场景的亮度的影响值,值越小代表在暗区的噪点越少。

(8)Lens Distortion
镜头扭曲效果:

要求支持Shader Model 3,不支持AR/VR。

主要参数:

Intensity:设置扭曲强度。
X Multiplier:设置X轴向的强度影响,0代表在X轴向不叠加。
Y Multiplier:设置Y轴向的强度影响,0代表在Y轴向不叠加。
Center X:设置扭曲的中心位置,X坐标值。
Center Y:设置扭曲的中心位置,Y坐标值。
Scale:设置屏幕的缩放。

(9)Motion Blur
运动模糊效果。

对性能有影响的参数主要是Sample Count。要求支持Motion vectors、Depth texture、Shader Model 3。不支持AR/VR。

主要参数:

Shutter Angle:设置旋转快门的角度,值越大,曝光时间越长,模糊的效果越强。
Sample Count:设置采样点的数量,影响效果和性能。

(10)Screen Space Reflections
屏幕空间反射是一种伪反射效果,模拟潮湿的地板或水坑的表面反射,限制高光的溢出。

Unity引擎只在Build-in渲染管线支持,SRP暂时不支持SSR后期效果,它是一种以牺牲性能让画面效果更理想的技术,可以在现代主机平台和PC上使用,不适合移动平台。推荐在主机平台使用Medium一下的质量,使用Custom可以用来截图。要求支持Compute shader、Motion vectors、Deferred rendering path、Shader Model 5.0。不支持AR/VR。

主要参数:

Preset:设置SSR的质量(Quality Preset),使用Custom可以对效果和性能进行微调。
Maximum Iteration Count (Custom preset only):设置Raymarching的最大采样数,值越大,反射越强。
Thickness (Custom preset only):设置射线的粗细,值越小,密度越高,可以检测到更多的细节。
Resolution (Custom preset only):设置Buffer大小。Downsampled的性能开销最小,Supersample的计算更慢但是质量更高。
Maximum March Distance:设置射线追踪的最大距离。
Distance Fade:设置反射到近平面的衰减距离,减弱锯齿感。
Vignette:设置暗角,减弱屏幕边缘的反射效果。

(11)Vignette
暗角效果将画面的边缘压暗,让画面中心更突出。在真实世界里是由增加的副透镜或透镜罩引起的效果。

Unity引擎用到的两种Vignette模式:

  • Classic:通过参数控制暗角的位置、形状、强度。
  • Masked:设置一个自定义的遮罩图叠加在屏幕上,可以用来产生非常规的不规则效果。

一般使用Classic模式。要求支持Shader Model 3。

主要参数:

Color:设置暗角的颜色。
Center:设置暗角的中心点,屏幕中心为[0.5,0.5]。
Intensity:设置暗角的强度。
Smoothness:设置暗角边缘的平滑度。
Roundness:设置暗角的圆度,值越小,暗角越方。
Rounded:勾选时,暗角呈正圆形;禁用时,暗角效果依赖于当前的屏幕纵横比。

5、Camera Physical Settings
Camera增加了物理属性来模拟真实的相机(物理相机)。

Using Physical Cameras:
https://docs.unity3d.com/2019.2/Documentation/Manual/PhysicalCameras.html

https://docs.unity3d.com/Manual/class-Camera.html

Unity引擎模拟物理相机的两个主要属性:

  • Focal Length:焦距,代表传感器到镜头的距离,决定了垂直视野(Field of View)。
  • Sensor Size:传感器尺寸,传感器捕捉画面的宽度和高度,决定了物理相机的宽高比。

在使用物理相机之前,需要先了解摄影学的相关知识点,调节参数时尽量符合物理相机的配置和设置。摄影学上曝光的三要素:光圈、快门、感光度,三者共同决定了一张照片的曝光。光圈影响景深和镜头锐度,快门影响曝光时长,ISO影响感光。

参考资料:摄影中的快门、光圈、ISO到底是什么关系?

参考资料:摄影基础篇——让你更好地了解光圈、快门、ISO

参考资料:https://developer.dji.com/cn/mobile-sdk/documentation/introduction/camera_concepts.html

主要参数:

  • 机身设置:

Sensor Type:设置传感器类型。
Sensor Size:设置传感器尺寸,预设的传感器类型(Sensor Type)遵循物理相机的传感器类型给出了传感器的宽高比,也可以选择Custom自定义尺寸。当设置的比例与Game视窗设置的渲染比例不同时,Unity通过Gate Fit进行适配。全画幅的传感器大小为36x24。
ISO:感光度。感光度的等级是倍数关系,如:ISO100、200、400、800、1600等,光圈和快门不变的情况下,感光度越高,曝光越强,噪点越多。

Shutter Speed:快门速度。快门速度的等级也是倍数关系,如1,1/2,1/4,1/8,1/15,1/30,1/60,1/125,1/250,1/500,1/1000,1/2000等。快门速度约等于1/焦距。

Gate Fit:当Game视图和物理相机的传感器尺寸不同时,通过Gate Fit来协调,将Resolution Gate(视图的比例)适配到Film Gate(相机的比例)。几种适配方式:Vertical、Horizontal、Fill、Overscan、None。

  • 镜头设置:

Focal Length:设置焦距,影响相机的Field of View,焦距越短,视野越宽广,取景范围越大,反之亦然。常见的焦距:8mm,15mm,20mm,28mm,35mm,50mm,85mm,105mm,200mm,300mm,400mm等。

Aperture:设置光圈,光圈的数值是√2的倍数关系,一般使用f值表示,f后面的数值越小,光圈越大,孔径越大,背景越虚化。光圈值:f/1.0,f/1.4,f/2.0,f/2.8,f/4.0,f/5.6,f/8.0,f/11,f/16,f/22,f/32,f/44,f/64。比f/2.8大的光圈称为大光圈,比f/8.0小的光圈称为小光圈,大部分镜头的最佳光圈在f/8.0左右,全景拍摄时一般可以选择f/5.6-f/11这个光圈范围。

Shift:镜头偏移,从中心点水平或者垂直移动镜头。偏移值是传感器大小(Sensor Size)的倍数。比如:水平偏移0.5会让传感器偏移水平值的一半。使用偏移可以用来校正相机与画面成一定角度时发生的失真,偏移时相机会油截锥倾斜。

  • Aperture Shape:设置光晕的形状。

四、后期效果在项目中的使用

在项目中使用后期效果,最重要的是有一套规范:Volume的规范、Profile的存放规范、后期效果的使用规范和优化方案。以在Unity Build-in渲染管线中使用Post Process Package作为案例,简单介绍一下在项目中的使用。

1、确定需要使用的后期效果
从众多的Effects中挑选出项目中一定需要用到的后期效果:

Ambient Occlusion
Bloom
Chromatic Aberration
Color Grading
Depth of Field
Motion Blur
Vignette
FXAA

2、对需要使用的效果进行规划
为了统一项目中每个场景的后期效果,需要确定哪些效果是必要的,哪些效果对整体的影响不大,哪些效果是在某些条件下触发的。

3、对整体效果进行规划
在MainCamera上加上对场景整体控制的后处理效果。这一步的主要目的是将整体控制的效果和单个场景控制的效果分开来,至于调用的方式可以根据项目灵活调整。

全局控制后处理的开关时,只需要关闭MainCamera上的Post Process Layer即可。控制DOF(景深)的开启,在监控相机到主角色一定距离内时,找到MainCamera上的Post Process Volume,开启Profile上的Depth of Filed效果即可。单独控制AO(环境光遮蔽)开关时,只需要找到MainCamera上的Post Process Volume,关闭Profile上的Ambient Occlusion效果即可。从MainCamera上的Camera属性控制FXAA(抗锯齿)的开关。

4、单个场景的后期效果规范
场景里的后期效果存储为Prefab,对应的Profile文件放在场景目录下。当单个场景有多个后期效果时,确定主效果为Global,避免其它Local的区域重合。

注意后期效果的使用规范,整理出需要调节的参数和不需要调节的参数,不需要调节的参数设定一个规范值。以ColorGrading为例,红色区域代表不需要调整的参数,黄色区域代表需要调整的参数。

5、UI界面的接入和全局参数的控制

上图只是一个界面控制的按钮和参数规划,项目根据实际情况进行设计。程序在制作功能时,一定要注意理顺后期效果总开关和各个小开关、参数调节之间的逻辑关系。

封面图来源:Post Processing Stack


这是侑虎科技第635篇文章,感谢作者文雅供稿。欢迎转发分享,未经作者授权请勿转载。如果您有任何独到的见解或者发现也欢迎联系我们,一起探讨。(QQ群:793972859)

作者主页:https://www.zhihu.com/people/ssiya-330,作者也是U Sparkle活动参与者,UWA欢迎更多开发朋友加入U Sparkle开发者计划,这个舞台有你更精彩!