前向渲染路径
Forward Rendering Path
每进行一次完整的前向渲染,我们都需要渲染该对象的渲染图元,并计算颜色缓冲区和深度缓冲区的信息,其中深度缓冲区的信息决定了一个片元是否可见,若可见则颜色缓冲区中的值会被更新
对于每个逐像素光源,都需要进行一次上述渲染流程。若一个物体在多个逐像素光源的影响区域内,则该物体会执行多个Pass,每个Pass计算一个逐像素光源的光照结果,然后在帧缓冲中把这些光照结果混合起来得到最终的颜色值。假设,场景中有N个物体,每个物体受M个光源的影响,那么要渲染整个场景一共需要N*M个Pass。也就是逐像素光照越多执行的Pass数也有可能越变越大,因此渲染引擎通常限制每个物体逐像素光照的数目。
渲染方式
当我们渲染一个物体时,Unity会计算哪些光源照亮了它,以及这些光源照亮该物体的方式。
在Unity中,前向渲染路径有3种处理光照(即,照亮物体)的方式:逐像素处理,逐顶点处理,球谐函数(Spherical Harmonics, SH)处理
- 分类方式
- 如果一个灯被标记为Not Important,则这个灯会采用逐顶点或SH
- 最亮的一盏平行灯采用逐像素
- 被标记为Important的灯采用逐像素
- 如果上面产生逐像素的灯数量小于工程中的像素等数量的话,则会有更多的等采用逐像素
Light Mode
ForwardBase
ForwardBase仅用最亮的逐像素的平行灯,以及所有的逐顶点与SH
可实现的光照效果有光照纹理(lightmap),环境光,自发光,阴影(主要指平行光的阴影)。
请注意,(1)lightmap对象不会从SH光源获得光照。(2)在着色器中使用OnlyDirectional作为该pass的Tag值时 ,前向渲染的Base Pass仅渲染主方向光、环境光、光照探针(lightprobe)和光照纹理,SH和顶点光不包括在该pass数据中。
ForwardAdd
ForwardAdd用于其他所有的逐像素灯,可实现的光照效果不支持阴影。
除非使用multi_compile_fwdadd_fullshadows变体快捷方式,否则默认情况下,这些Pass中的光照没有阴影,所以总的来看,正向渲染只支持一个带阴影的平行光。
多说一句关于性能的考量
球形谐波光照(SH)的渲染速度非常快。它们在CPU上的成本很小,甚至实际上可以免费供GPU应用(也就是说,base pass总是计算SH光照;但是由于SH光照的工作方式,其计算成本光照数目的增加而增加)。
不过SH光照也有非常明显的缺点:
- 它们是在对象的顶点而不是像素处计算的,因此不支持light Cookies或法线贴图(normal maps)
- SH光照频率很低,不能表现尖锐的灯光过渡,也仅影响漫反射光照(对于高光而言,频率太低)。
- SH光照不在本地;靠近某个表面的点光源的光照计算效果看起来是错误的。
总而言之,SH光照通常可以应付小型动态物体。
延迟渲染路径
Deferred Rendering Path,将着色计算进行延后处理的一种渲染方式
pass
几何处理G-Buffer Pass
- RT0,ARGB32:Diffuse Color(RGB),Occlusion(A)
- RT1,ARGB32:Specual Color(RGB),Roughness(A)
- RT2,ARGB2101010:World Space Normal(RGB),Unused(A)
- RT3,ARGB2101010(non-HDR) or ARGBHalf(HDR):Emission+Lighting+Lightmap+Reflection Probe
- RT4,ARGB32:Light Occlusion
- Depth + Stencil Buffer
光照处理Lighting Pass
- 只需渲染出一个屏幕大小的二维矩形,使用第一步在G-Buffer中存储的数据对此矩阵的每一个片段进行计算光照
优点
- 影响一个物体的光源数量是没有限制的
- 每一个光源都是逐像素级别的效果,并且可以正确的计算法线贴图及阴影
缺点
- 不支持半透明效果
- 不支持抗锯齿
- 内存开销大
- 不支持正交相机
支持
- 显卡必须支持Multiple Render Targets(MRT),即多渲染目标
- SahderModel在3.0及以上
- 手机平台在OpenGL3.0及以上
顶点照明渲染路径(Legacy)
Vertex Lit Rendering Path
优点
- 性能最优
- 支持的硬件最广
- 一个物品仅渲染一次,并且所有的光照计算都在顶点进行
缺点
- 不支持像素级别的效果,比如阴影、法线贴图、高质量高光等
旧的延迟渲染路径(Legacy)
Deferred Rendering Path