简略前向渲染与递延渲染说明

渲染路径可选是unity最重要的特性之一。或许对于那些对unity不甚理解的人来说,前向渲染和递延渲染仅仅类似于将物体的外形在正常以及怪异之间进行切换。为了更好理解为什么需要多个渲染路径,我们需要对其背后的工作原理有所了解。

与光照相关

在渲染过程中光照计算非常损耗性能,它需要在一个给定的光照强度范围内为每个像素找到一个适当的颜色值。Unity的光照类型有3种,逐顶点,逐像素和球面谐波等。限于篇幅等原因,本文仅讨论前2种光照。

在逐像素过程中,每个像素的颜色值都是单独计算的(如左图所示)。就算我们对左图的轮廓使用低模效果,中央光照效果依然看起来非常圆润。如果不看左图的边缘区域,您会很难发现渲染的痕迹,这就是逐顶点光照的效果,即让着色器对每个顶点进行光照计算。顶点与顶点之间的像素颜色通过混合算法进行插值(不含光照运算)。或者说看起来非常节省的方法(如果您不知道如何开启Lighting,你可以在Light组件下的Render Moder进行设置。Important 强制为逐像素光源,Not Important 为逐顶点光影,Auto 设置逐像素光影为最强光)。

相对于逐顶点光照,游戏开发者更加偏爱逐像素光照,但它有个致命的缺点-----光源在某种程度上占用游戏物体的渲染通道。例如,只要有4个以上光源,游戏物体的渲染就会不正常。除此之外,阴影也会受到影响---Unity 5.3.4版本有明确的介绍,即一个光源只能有一个印象成像。(但由于某种不可描述的原因,我曾经得到过2个阴影,所以这个我不太确定是否准备)。

递延渲染的救赎

如果您的电脑性能强劲,使用递延渲染能让您随心所欲地在场景里添加光源。它的阴影不会受到影响并且也不需要占用额外的渲染通道(游戏物体投射阴影除外)。


为什么它那么牛逼?因为大多数模型进行渲染时没有进行光影运算并且在几乎完成场景渲染时才将光源光影应用到2D纹理上。这个阶段是在裁剪空间变换到屏幕空间过程中进行操作。或者说,非递延光照渲染就是屏幕空间。为了更好地理解,我们引入帧调试器进行观察。

场景渲染第一步:几何体渲染。


上图的几何体仅仅是一个平面图形,那现在问题来了,显卡怎么绘制游戏物体的光影效果呢?答案就是深度缓存!您可以将深度缓存想象成那些对您不可见的图像但保存着与摄像机保持一定距离的像素位置的数据。当该图像被渲染后如下图所示:


单独的深度数据并不足以指示显卡渲染游戏物体的表面光影。所以,我们还需要另外一些神器---方向。我们在Unity中一般用法线来表示方向。换句话说,能让颜色缓存(深度缓存)与众不同就在于其存储了法线数据。


那我们怎么知道上述几何体有法线?非常简单,让我们将目光转向场景方向标(红色箭头所指)。


您有没有注意到颜色指向?X轴(Red)指向左,所以先前图像的左边轮廓受到辐射。Y轴(绿)向上,Z轴(蓝)朝底(从图片视角看)。它都符合我们的预期。

基于上述信息,我们就可以渲染游戏物体的光影了。它与游戏场景中的物体多寡无关。所有的操作将在最后一个图像完成。


延迟光照通道

上图所示为光照颜色反转(1-color)的案例,它与第一张不透明图进行混合得到最终效果。

我们该怎么选择?

看完了简单的教程描述,相信您肯定想试一试新的渲染路径,但请不要冲动!!递延渲染并不适用所有项目,它也有不少的...

局限

首先,递延渲染不可用于渲染半透明物体。这是因为当场景里存在半透明游戏物体时,无法存储那些需要半透明物体显影的透明物体和当前物体的深度法线。unity解决这种局限的方法是在渲染的后半阶段使用前向渲染。虽然通过前向渲染时,透明物体能投射阴影,但是不能其他物体的阴影,并且会出现不确定的错误信息。

第二,它不支持抗锯齿。该局限原因类似于半透明的渲染,但unity没有相关的解决方案。您可以尝试使用屏幕空间的AA算法(图像效应),但其渲染效果不是很好。

第三个局限就是您仅可使用四个以下的裁剪遮罩。您可以在unity文档看到下文:

最后一个局限就是它不支持网格渲染Receive Shadows的标志。

项目

如果您的项目都没踩什么坑,接下来就要考虑运行平台的问题了。当在PC端进行运行时,您要确保显卡的使用时间不超过10年,而移动设备就不需要考虑显卡了,但是....

性能

在大多数情况下移动设备的递延渲染的性能不如前向渲染。因为在每一帧都需要很多的渲染通道。如果您的项目仅使用一个光源,使用递延渲染就很不明智了。

值得注意的是,递延渲染可随意添加光源且不太耗费GPU。与前向渲染比较,极端情况下性能会线性下降,但与场景物体的数目无关。


如城市:天际线(unity制造)使用的就是递延渲染。它有非常多小光源,但是它的运行效率非常高。

原文链接:http://blog.theknightsofunity.com/forward-vs-deferred-rendering-paths/
转载于:蛮牛译馆

推荐阅读