Version: 2019.3
Rendering paths in the Built-in Render Pipeline
Deferred Shading rendering path

Forward rendering path

This page describes the Forward rendering path in Unity’s Built-in Render Pipeline.

Forward rendering renders each object in one or more passes, depending on lights that affect the object. Lights themselves are also treated differently by Forward Rendering, depending on their settings and intensity.

实现详细信息

In Forward rendering, some number of brightest lights that affect each object are rendered in fully per-pixel lit mode. Then, up to 4 point lights are calculated per-vertex. The other lights are computed as Spherical Harmonics (SH), which is much faster but is only an approximation. Whether a light will be a per-pixel light or not is dependent on this:

  • Render Mode 设置为 Not Important 的光源始终为每顶点或 SH 光源。
  • 最亮的方向光始终为每像素光源。
  • Render Mode 设置为 Important 的光源始终为每像素光源。
  • 如果上述情况导致光源数少于当前的 Pixel Light Count 质量设置,则按照亮度降低的顺序,更多光源采用每像素渲染方式。

每个对象的渲染按如下方式进行:

  • 基础通道应用一个每像素方向光和所有每顶点/SH 光源。
  • 其他每像素光源在额外的通道中渲染(每个光源对应一个通道)。

例如,如果某个对象受到许多光源的影响(下图中的圆形受光源 A 到 H 的影响):

让我们假设光源 A 到 H 具有相同的颜色和强度,并且所有光源都具有自动渲染模式,因此它们将严格按照此对象的以下顺序排序。最亮的光源将以每像素光照模式渲染(A 到 D),然后最多 4 个光源以每顶点光照模式渲染(D 到 G),最后其余光源以 SH 进行渲染(G 到 H):

请注意,光源组会重叠;例如,最后一个每像素光源混合到每顶点光照模式,因此当对象和光源移动时,“光射量”(light popping) 较少。

基础通道

基础通道使用一个每像素方向光和所有 SH/每顶点光源来渲染对象。此通道还会添加着色器中的所有光照贴图、环境光照和发射光照。在此通道中渲染的方向光可以具有阴影。请注意,光照贴图的对象不会从 SH 光源获得光照。

请注意,在着色器中使用“OnlyDirectional”通道标志时,前向基础通道仅渲染主方向光、环境光/光照探针和光照贴图(SH 和顶点光源不包括在通道数据中)。

其他通道

对于影响此对象的每个额外的每像素光源,需要额外的渲染通道。默认情况下,这些通道中的光源没有阴影(因此在结果中,前向渲染支持一个带阴影的方向光),除非使用 multi_compile_fwdadd_fullshadows 变体快捷方式。

性能注意事项

球谐函数光源的渲染速度_很_快。这些光源的 CPU 成本很低,并且使用 GPU 的_成本基本为零_(也就是说,基础通道始终会计算 SH 光照;但由于 SH 光源工作方式的原因,无论 SH 光源有多少,成本都完全相同)。

SH 光源的缺点:

  • 按对象的顶点而不是按像素计算。这意味着它们不支持光照剪影和法线贴图。
  • SH 光照的频率很低。SH 光源无法实现快速的光照过渡。它们也只影响漫射光照(频率对镜面高光而言太低)。
  • SH 光照不是局部光照;SH 点光源或聚光灯在靠近某种表面时“看起是错误的”。

总的来说,SH 光源通常足以达到小型动态对象的光照要求。

Rendering paths in the Built-in Render Pipeline
Deferred Shading rendering path