unity3d 渲染路径(延迟光照,正向渲染,顶点光照)

转自:http://edu.china.unity3d.com/learning_document/getData?file=/Manual/RenderingPaths.html

渲染路径

Unity 支持不同的渲染路径 (Rendering Paths)。应根据游戏内容和目标平台/硬件选择所需的路径。不同的渲染路径功能和性能特征不同,主要影响光照 (Lights) 和阴影 (Shadows)。

可在播放器设置 (Player Settings) 中选择工程所需的渲染路径 (Rendering Paths)。另外,可为每个相机 (Camera) 重写渲染路径。

如果图形卡无法处理所选的渲染路径,Unity 将自动使用较低保真度的路径。无法处理延迟光照 (Deferred Lighting) 的 GPU 将使用正向渲染 (Forward Rendering)。如果不支持正向渲染 (Forward Rendering),则将使用顶点光照 (Vertex Lit)。

延时光照渲染路径

本页面详细说明了延时光照 (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 文件版本放置到“资产”文件夹中名为“资源”的文件夹来修改光照通道着色器。

最终通道

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

正向渲染路径细节

本页面描述了正向 (Forward) 渲染路径的细节。

根据影响对象的光源的不同,正向渲染 (Forward Rendering) 路径在一个或多个通道中渲染每个对象。根据设置和强度,光源本身也会受到正向渲染 (Forward Rendering) 的不同处理。

实施细节

在正向渲染 (Forward Rendering) 中,影响每个对象的一定数量的最亮光源以全逐像素光照模式被渲染。然后,最多 4 个点光灯会逐顶点被计算。其他灯根据球谐函数 (SH) 进行计算,这种计算方式更快速,但只能得到近似值。根据以下内容判断某个光源是否是逐像素光源:

  • 渲染模式 (Render Mode) 设置为不重要 (Not Important) 的光源通常是逐顶点或球谐函数。
  • 最亮的方向灯通常为逐像素。
  • 渲染模式 (Render Mode) 设置为重要 (Important) 的光源通常是逐像素。
  • 如果以上内容导致光源数量小于当前像素光源数量 (Pixel Light Count) 质量设置,则为了降低亮度,会有更多的光源以逐像素的方式进行渲染。

用以下方法渲染每个对象:

  • 基础通道 (Base Pass) 应用一个逐像素方向灯以及所有逐顶点/球谐函数光源。
  • 其他逐像素光源在其他通道中进行渲染,一个通道对应一个光源。

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

假设光源 A 到 光源 H 具有相同的颜色和强度,且他们的渲染模式都为自动 (Auto) 模式,则他们在该对象上将严格按照这种顺序进行排序。最亮的光源将以逐像素光照模式进行渲染(A 到 D),然后最多 4 个光源以逐顶点光照模式进行渲染(D 到 G),剩下的光源以球谐函数进行渲染(G 到 H):

请注意不同的光照组间有重叠。例如,最后一个逐像素光源混合有逐顶点光照模式,这样能减少对象和光源移动时可能出现的“光照跳跃”现象。

基础通道

基础通道用一个逐像素方向灯和所有球谐函数光源渲染对象。该通道还从着色器中添加任何光照贴图、环境光照和放射性光照。该通道中渲染的方向灯可以有阴影 (Shadows)。请注意,使用了光照贴图的对象不会获得来自球谐函数光源的光照。

附加通道

附加通道为影响该对象的每个附加逐像素光源进行渲染。这些通道中的光源不能有阴影(因此,正向渲染 (Forward Rendering) 支持一个带阴影的方向灯)。

性能注意事项

球谐函数光源渲染地快。它们只耗费很少的 CPU,并且实际上无需耗费 GPU(换言之,基础通道通常计算球谐函数光照,但由于球谐函数光照的运行方式,无论有多少球谐函数光源,耗费都是完全相同的)。

球谐函数光源的缺点有:

  • 它们计算的是对象的顶点,而非像素。这意味着它们不支持灯光 Cookies 或法线贴图。
  • 球谐函数光源的频率很低。球谐函数光源无法有明显的照明过渡。它们也只会影响漫反射光照(对高光亮点来说,球谐函数光照的频率过低)。
  • 球谐函数光照不是局部的;靠近某些表面的球谐函数点光灯或聚光灯“看起来别扭”。

总的说来,球谐函数灯对小的动态对象来说已经足够好了。

顶点光照渲染路径细节

本页面描述了顶点光照 (Vertex Lit) 渲染路径的细节。

顶点光照 (Vertex Lit) 路径通常在一个通道中渲染每个对象,所有光源的照明都在对象顶点上进行计算。

顶点光照 (Vertex Lit) 路径通常在一个通道中渲染每个对象,所有光源的照明都在对象顶点上进行计算。

由于所有的光照都在顶点层级上计算,所以此渲染路径不支持大多数的逐像素渲染效果:如阴影、法线贴图、灯光 Cookie、高精度的高光亮点。

渲染路径比较

 延迟光照正向渲染顶点光照
功能   
逐像素光照(法线贴图和灯光 cookies)-
实时阴影1 束平行光-
双重光照贴图--
深度与法线缓冲区额外渲染通道-
软粒子--
半透明物体-
抗锯齿-
光照剔除遮蔽图受限
光照保真度全部逐像素部分逐像素全部逐顶点
性能   
逐像素光照的成本照亮的像素数像素数 * 照亮的对象数-
支持平台   
PC (Windows/Mac)Shader Model 3.0+Shader Model 2.0+所有平台
移动平台 (iOS/Android)-OpenGL ES 2.0OpenGL ES 2.0 & 1.1
控制台360, PS3360, PS3-

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值