原文链接:https://docs.unity3d.com/Manual/RenderTech-ForwardRendering.html
本文阐述了正向渲染路径的细节。
正向渲染路径在一个或多个pass中渲染每个物体,取决于光照与物体的交互。光照自身也被正向渲染区别对待,取决于其设置和强度。
实现细节
在正向渲染中,与每个物体交互的几个最亮的光会完全按照逐像素光照模式来渲染。然后,下四个光照使用逐顶点计算。其他的光照使用球状谐波(SH),这是非常快但是只取近似值。一个光照是否是逐像素光照取决于这些:
·渲染模式设置为Not Important的光照总是逐顶点渲染或者SH
·最亮的平行光总是逐像素渲染
·渲染模式设置为Important的光照总是逐像素渲染
·如果上述结果中逐像素光照的数量比当前的质量设置中像素光照数量少的话,则按照亮度递减的顺序,更多光照会被逐像素渲染。
渲染每个物体会发生如下事项:
·基础pass应用一个逐像素平行光和逐顶点/SH光。
·其他逐像素光照在附加的pass中渲染,每个灯光一个pass。
例如,如果有一些物体和一些光照发生反应(下图中的圆圈,与光照A到H互相作用):
(图片见原网页)
让我们假定光照A到H有相同的颜色相同的强度并且都是自动渲染模式,那么这些光照会为这个物体所精确排序。最亮的光照将会使用逐像素光照模式渲染(A到D),紧接着的四个采用逐顶点光照模式(D到G),最后剩下的使用球面谐波(G到H)。
(图片见原网页)
请注意光照组的重叠:例如最后的逐像素光照与逐顶点光照相融合,这样可以减少当物体和光照来回移动时的“光照跳跃”。
基础pass
基础pass渲染物体的一个逐像素平行光和所有SH/顶点光照。这个pass也会将shader中的光照贴图、环境光、自发光添加进去。在这个pass中渲染的平行光可以有阴影。请注意光照贴图的对象不会从SH光照中得到照射。
请注意,当这个shader中有OnlyDirectional的pass标记时,正向基础pass只会渲染主平行光,环境光、光照探针和光照贴图(SH和顶点光照不会包含在这个pass中)。
附加pass
附加pass渲染所有与物体交互的附加的逐像素光照。在这些pass中的光照默认没有阴影(所以,正向渲染支持一个平行光有阴影),除非multi_compile_fwdadd_fullshadows变体路径被使用。
性能的考虑
球状谐波的光照渲染的特别快。它们花费一点点CPU,并且事实上在GPU上应用是没有任何消耗的(也就是说,基础pass总是计算SH光照,但是由于SH光照的工作方式,不论有多少SH光照,它们的性能消耗基本上都差不多)。
SH光照的缺点是:
·它们计算像素的顶点,而不是像素。这也就意味着它们不支持光照缓存和法线贴图。
·SH光照的频率非常低,你不能用SH光照实现分明的光照转换,它们也只能与漫反射光照起作用(对于镜面高光来说频率太低了)。
·SH光照不是本地的,SH的点光源或是聚光灯靠近某些表面会“视觉错误”。
总之,SH光照对于小的动态物体来说通常是足够好了。