|
Unity重要特性之一就是可以选择渲染通道。对于那些不熟悉Unity的人来说(通常情况)在正向渲染通道和延迟渲染通道之间做选择就好比在“常”和“奇怪的样子并且感觉像是坏了一样”的渲染方法之间做选择。为了更好的理解为什么会有不止一个渲染通道,首先需要理解他们背后的机制,都是关于灯光照明。
〖 讲解 〗
灯光的开销很大,主要是因为当范围内有灯光时,大量的计算都要被完成以便获取像素点的有效光照颜色。在Unity中灯光可以被逐顶点、逐像素评估,或者作为球函数。这篇文章中我们只讨论前两个。
在逐像素灯光中,每一个像素点颜色都要单独进行计算(例如图中左边)。可以看到在这个案例中即使使用了低模的球体,灯光还是让它看起来是圆的。如果不是边缘的缘故,真的难以看出顶都在哪里。然后,是逐顶点光源。这个需要计算每个顶点的光照。其他位于顶点之间的像素使用常规的颜色混合算法来计算色值(没有进一步的光照计算)。这是光照最廉价的方法,也行,看起来廉价(那么像素光照和顶点光照在哪里转换呢,它隐藏在Light 组件中的Render Mode选项下。Important 选项对应像素光照,Not Important 对应顶点光照,Auto 使最强的光照成为像素光照)。
游戏开发者喜欢逐像素光照胜于逐顶点光照已经不是什么秘密了。然而,这还有一个显著的缺点。每一个光照都会引起范围内对象的额外的渲染通道。限制之一就是四个光照可以影响一个对象。还有一个限制就是阴影——基于Unity文档只有一个光照可以有阴影。(由于某些原因我在.3.4中实现了两个阴影,所以对此并不是很确定。)
〖 措施 〗
用延迟光照来拯救吧:有一个技巧允许将性能保持在合理水平的情况下在场景里尽可能多的使用灯光。它不会限制阴影的数量,如果场景物体在光照范围内也不会造成额外的绘制通道(物体投射阴影是异常的)。这个叫做延迟着色渲染通道。
为什么会如此不同,主要因为多数模型不需要光照计算而被渲染,并且当场景渲染接近完成时光照才被应用去渲染2D图片。这个地方的改变通常被称作在屏幕空间做一些事情。知道这个后,我们可以说光照非延迟渲染呈现在屏幕空间。为了更好的理解它,让我们看一下Frame Debugger。
〖 渲染 〗
场景渲染从渲染所有几何体开始:
这是一个平面图象,那么显卡如何知道怎样去应用光照和阴影?多亏了深度缓存!可以把深度缓存想象成另外一张看不到的图片,并且存储了关于每一个像素点位置距离相机距离的信息。当作为图像呈现出来时,它看起来是这样的:
只有深度信息不足以计算出光照如何应用到表面上。我们至少还需要另外一样东西——方向。3D空间中的定向通常被表示为法线。不寻常的是除了颜色缓存和深度缓存,还有应用到法线的缓存!
如何知道这些是法线?很简单!只需要看一下Scene Gizmo。
看出颜色相似了吗?红色视锥(x)指向左边,所以在之前的图片处理左侧面。绿色(y)是上边,蓝色(z)是右下方(从此透视图来看)。都匹配之前面的颜色。
基于这个信息,光照和阴影就可以被渲染。场景里有多少对象真的不重要。所有事物都在最终的图片中完成。
上图是光照通道倒置版本(1-color)的结果。最后通过混合第一个不透明图片得到了最终结果。看完上边内容你也许对使用新的渲染通道充满了热情,但是不要着急!延迟渲染并不是对所有问题都可以补救。它有一些——
局限性
这要是真的就太好了,不是吗?还是有一些局限性。
首先,延迟渲染不允许我们渲染半透明物体。因为如果有一些半透明物体存在于场景,就没有办法记录透过半透明物体可见的物体还有当前物体本身的深度和法线。Unity通过在整个过程的最后使用正向渲染来渲染半透明物体从而处理了这一局限性。这样运行的非常好,这些对象可以投射阴影,不过不幸的是不能接收其他对象的阴影。他们还会引起一些意外的问题,使用正向渲染不知道有没有这些问题。
第二个局限性是缺少反锯齿支持。原因和半透明对象的问题相似,不过unity并不想用什么办法解决这个问题。你可以用屏幕空间的AA算法(图片特效)来替代,不过视觉效果或许并不好看。
另外一个局限性是可以使用四个剔除遮罩。在文档中可以看到:你的剔除层遮罩必须至少包含所有层减掉四个任意层,所以32个层中有28个需要设置。否则将会得到图形构件。最后,没有对Mesh Renderer的ReceiveShadows标签的支持。
〖 需求 〗
这还不够,延迟渲染只能在有限的显卡上工作。对于PC机,可以很安全的假设不超过10年的显卡都可以支持它。对于移动设备来说,就不要假设什么了,不过这并不是什么大的问题,因为——
〖 性能 〗
最重要的是相比正向渲染,延迟渲染大多数情况下在移动设备中性能都会比较差。因为额外的通道需要每一帧都要完成。如果只使用了一个光照,这样做可能会有点儿不值得。
另一方面,添加额外的灯光很廉价,最坏情况下性能将会线性下降,和正向光照对比,这个依赖于场景中物体的数量。
城市:地平线(Unity制作)使用了延迟渲染通道。游戏中有很多的小光源,游戏依然表现的很好。
via:游戏蛮牛
|
|