延时光照渲染路径

本页面详细说明了延时光照 (Deferred Lighting) 渲染路径。有关延时光照的技术概述,请参阅本文

延时光照 (Deferred Lighting) 渲染路径是具有最高光照和阴影保真度的渲染路径。影响物体的光线数量没有限制,并且采用逐像素的方式评估所有光照,这意味着这些光照将全部与法线贴图准确交互。此外,所有光照都可有 cookie 和阴影。

延时光照有这样一个优点:无论光线照射的物体数量是多少,光照的处理开销与屏幕上的光线尺寸成正比。因此,保持较小的光线尺寸可提高性能。延时光照还有高度一致和可预测的行为。每束光线的效果都是按逐像素光照计算的,因此不会出现在大三角形等上崩溃的光照计算。

延时光照的缺点是没有实际的抗锯齿支持,也不能处理半透明物体(这些必须使用“正向渲染”(Forward Rendering) 来渲染)。同时不支持网格渲染器 (Mesh Renderer) 的接收阴影 (Receive Shadows) 标识,并且剔除遮蔽图的支持方式也有限。(具体而言,您最多可以使用四个剔除遮蔽图。即:剔除层遮蔽图必须至少包含减去 4 个任意层后的所有层,所以 32 层中必须设置 28 层。否则会得到图形假象。)

要求

延时光照只能用于 Unity 专业版。延时光照要求 Shader Model 3.0(或更高版本)的图形卡,并且支持深度 (Depth) 渲染纹理和双面模板缓冲区。大多数 2004 年后制作的图形卡都支持延时光照,包括 GeForce FX 或其更高版本、Radeon X1300 或其更高版本、Intel 965 / GMA X3100 或其更高版本。然而,目前移动平台和 Flash 平台都不支持延时光照。

性能注意事项

延时光照中实时光线的渲染开销与光线照射的像素数量成正比,而非取决于场景的复杂性。所以微小点或者聚光灯耗费的渲染资源非常少。如果它们被场景物体完全或部分遮住,甚至会更加便宜。

当然,带阴影的光源比不带阴影的光源要昂贵许多。延时光照中,阴影投射物体仍需为每个阴影投射光进行一次或多次渲染。而且,产生阴影的光照着色器的渲染开销比禁用阴影时使用的光照着色器更高。

实施细节

当使用延时光照 (Deferred Lighting) 时,Unity 中的渲染过程分为三步,如下所示:-

  1. 基础通道:渲染物体以生成带有深度、法线和高光强度的屏幕空间缓冲区。
  2. 光照通道:使用上一步生成的缓冲区将光照计算到另一个屏幕空间的缓存区中。
  3. 最终通道:再次渲染物体。将已计算好的光照取出并与颜色纹理混合,然后添加任何环境/放射性光照。

带有不能处理延时光照着色器的物体在该过程完成后会使用正向渲染路径进行渲染。

基础通道

基础通道对每个对象渲染一次。视图空间法线和高光强度被渲染进单个 ARGB32 渲染纹理中(法线在 RGB 通道、高光强度在 A 通道)。如果平台和硬件支持将 Z 缓冲区读取为纹理,那么深度不会进行明确渲染。如果 Z 缓冲区不能以纹理的方式进行访问,则用着色器替换在其他某个渲染通道中渲染深度。

基础通道的结果是被屏幕内容填满的 Z 缓冲区以及带有法线和高光强度的渲染纹理 (Render Texture)。

光照通道

光照通道根据深度、法线和高光强度计算光照。光照是在屏幕空间中计算的,因此所需的处理时间与屏幕复杂性无关。光照缓冲区是单独的 ARGB32 渲染纹理 (Render Texture),纹理的 RGB 通道有漫反射光照,A 通道有单色高光光照。光照值采用对数值编码,从而提供 比 ARGB32 纹理通常所能达到的动态范围更广的动态范围。延时渲染的唯一光照模式是 Blinn-Phong。

没有跨越相机近平面的点光源和聚光灯被渲染成三维形状,并启用针对场景的 Z 缓冲区测试。这使部分或全部遮挡住的点光源和聚光灯所耗费的渲染资源很少。跨越近平面的方向灯或点光源/聚光灯被渲染成全屏四边形。

如果光源开启阴影,则这些光源会在此通道中加以渲染和应用。请注意阴影并不是“免费”的,需要渲染阴影投射器并运用更加复杂的光线着色器。

可用的唯一光照模式为 Blinn-Phong。如果想要不同的模式,可以通过将内置着色器中修改后的 Internal-PrePassLighting.shader 文件版本放置到“资产”文件夹中名为“资源”的文件夹来修改光照通道着色器。

最终通道

最终通道生成最终渲染图像。所有物体都将用着色器再次渲染,其中着色器将采集光照,将光照与纹理混合,并添加任何放射性光照。光照贴图也会应用到最终通道中。靠近相机时使用实时光照,并只添加烘焙反射光照。这样做可交叉淡化成远离相机的全烘焙光照。

Page last updated: 2013-07-01