Forward Rendering Path

该页面描述 正向渲染路径(Forward  Rendering Path)的详细内容。

 正向渲染路径会在一个或多个 Pass 中渲染每个物体,这取决于影响物体的光照。灯光的设置和强度(intensity)不一样,正向渲染的光照也不一样。

实现细节

在正向渲染中,一些影响物体表面的明亮灯光将会以全像素点亮模式(fully per-pixel lit mode)渲染出来。然后,最多4个点光源在每顶点(per-vertex)被计算。

其他的光照作为球面调和函数 / 球谐函数(Spherical Harmonics,SH)被计算出来,虽然它更快,但只是一个近似值。一个灯光是否是像素光照(per-pixel light)取决于以下条件:

  • 设置为不重要(Not Important)渲染模式的光照总是 逐顶点 或者 球面调和 处理。
  • 平行光总是像素计算的。
  • 设置为重要(Important )渲染模式的光照总是 像素计算的。
  • 如果以上结果比当前在 Quality Setting 中的像素光源少,那么为了降低亮度,更多的光照将逐像素渲染。

 渲染的流程如下:

  • 基本的 Pass 应用于一个逐像素(per-pixel)的平行光和所有的逐顶点(per-vertex)或球面调和(SH)处理的光照。
  • 其他的像素光在附加的 Pass 被渲染,每个光源一个 Pass。

例如,如果某些物体被一些数量的光源影响(如图下所示,影响A到H):


我们假设光源 A 到 H 有同样的颜色、光照强度,以及自动的渲染模式。这些光源将为该物体做一个精确的分类排序。最亮的光源将按逐像素点亮模式(per-pixel lit mode)从 A 到 D 渲染。

 

注意到光组的重叠(Per-Pixel、Per-vertex、SH之间)。例如,最近的像素光融入顶点点亮模式(per-vertex lit mode),所以在移动的物体和光源周围会有比较少的光照出现(light popping)。

Base Pass

Base Pass 使用一个逐像素(per-pixel)的平行光和所有的顶点或球面调和光源(SH/vertex lights)渲染。该 Pass 也会添加到任何光照贴图(lightmaps),环境光(ambient )和从Shader发射的平行光。

平行光在该 Pass 的渲染具有阴影 (Shadows)。要注意的是烘焙的物体不会从球面调和光源(SH lights)得到光照。

当在 Shader 的 “Pass Flag”(告诉引擎它们期望被渲染到引擎的时间和方式) 中启用了 “OnlyDirectional”时,正向的 Base Pass 仅渲染主要的平行光( directional light),

环境光或光照探头(ambient/lightprobe),光照贴图(lightmaps )(球面调和光和顶点光照不包括在 Pass 数据内)。

Additional Passes

额外 Passes 的渲染受物体每个额外的像素光影响。在该 Pass 的光源默认是不会有阴影的(因此正向渲染支持一个带阴影的平行光),除非使用 Multi_Compile_fwdadd_fullshadows 变形快捷方式。

性能考虑

球面调和光源(Spherical Harmonics lights)的渲染速度是很快的。它们在 CPU 内具有很小的开销,并且很容易被 GPU 接受(那是因为 Base Pass 会计算球面调和光照,但由于 SH Lights 的工作原理,无论多少个 SH Lights 它们的开销是一样的)。

球面调和光照(SH Lights)的弊端如下:

  • 它们在物体的顶点被计算,而不是按像素。这意味着它们将不支持光照缓存(light Cookies)或法线贴图(normal maps)。
  • 球面调和光照(SH Lights)调用的频率是很低的,你不能用 SH Lights 做一些明显的光照过度。它们也只会影响漫射光照(Diffuse Light),在高光曲线反射区 / 镜面反射(specular highlights)的调用频率也是很低的。
  • SH Light 不是局部的,接近物体表面的球面调和点光源(point or spot SH lights)看起来是错误的。

总之,球面调和光照(SH Lights)对于小的动态物体往往是不够的。

猜你喜欢

转载自avi.iteye.com/blog/2344931