原文链接:https://docs.unity3d.com/Manual/RenderTech-DeferredShading.html
这一篇详细介绍了延迟着色渲染路径。请看维基百科:延迟着色(链接见原网页)来获取技术概况的介绍。
概况
当使用延迟着色时,对于一个游戏物体可以被多少光照所作用没有限制。所有的光照使用逐像素计算,这意味着它们都可以与法线贴图等相交互。另外,所有光照都可以有缓存和阴影。
延迟着色具有优势,其处理光照的开销与光照照射到的像素成比例。这取决于场景中光照值的大小,不论它照射了多少个游戏物体。因此,可以通过使光照变小提高性能。延迟着色也是高度一致的和行为可预测的。每个光照的影响都是逐像素计算的,所以没有光照计算会拆分大的三角面。
劣势方面,延迟着色并不真正支持抗失真,并且也不能处理半透明游戏物体(它们使用正向渲染)。其也不支持网格渲染器接收阴影的标记,并且剔除遮罩仅仅以有限方式支持。您最多只能使用四个剔除遮罩。也就是说您的剔除遮罩层必须至少包含所有的层减去四个任意的层,所以32个层中必须要设置28个层。否则,您会得到图形的假象。
要求
它需要支持多渲染目标(MRT)的显卡,Shader Model 3.0(或更高版本),并且支持深度渲染纹理。在2006年后生产的大多数PC显卡支持延迟着色,以GeForce 8xxx,Radeon X2400,Intel G45开头。
在移动平台,延迟着色不被支持,主要是由于使用MRT格式(一些支持MRT的GPU也只是支持非常有限的位计算)。
请注意:当使用正交投影时不支持延迟着色。如果摄像机的投影模式改成正交,那此摄像机也会退到正向渲染。
性能考虑
延迟着色的实时光照渲染开销不取决于场景的复杂性,而是与被此光照照射到的像素数量成比例。所以小的点光源或是聚光灯渲染的消耗是非常低的,而且如果它们完全或者部分的被场景中的游戏物体遮挡,那么它们的消耗会更低。
当然,有阴影的光照比没有阴影的光照性能消耗要高得多。在延迟着色中,投射阴影的游戏物体始终需要被投射阴影的光照渲染一次或更多次。更进一步说,开启阴影的光照shader的渲染开销要比不使用阴影的更高。
实现细节
有不支持延迟着色shader的物体在延迟着色完成后,使用正向渲染路径。
几何Buffer(g-buffer)中的渲染目标(RT0-RT4)的默认布局列在了下面。数据类型被放在每个渲染目标的不同通道中。使用的通道显示在圆括号中。
·RT0, ARGB32格式:漫反射颜色(RGB),遮挡(A)。
·RT1, ARGB32格式:高光反射颜色(RGB),粗糙度(A)。
·RT2, ARGB2101010格式:世界空间法线(RGB),未使用(A)。
·RT3, ARGB2101010(非HDR)或ARGBHalf(HDR)格式:自发光+光照+光照贴图+反射探头buffer。
·深度+模板buffer。
所以默认的g-buffer布局是160位/像素(非HDR)或是192位/像素(HDR)。
如果混合光照使用阴影遮罩或距离阴影遮罩模式,则要使用第五个目标:
·RT4,ARGB32格式:光照遮挡值(RGBA)。
那么这样g-buffer布局是160位/像素(非HDR)或是192位/像素(HDR)。
如果硬件不支持五个并发渲染目标,那么使用阴影遮罩的物体将回退到正向渲染路径。当摄像机不使用HDR时,自发光+光照buffer(RT3)会被对数的编码来提供比通常可能的ARGB32纹理更大的动态范围。
请注意,当摄像机使用HDR渲染时,没有为自发光+光照buffer(RT3)创建单独的渲染目标。而是把摄像机渲染到的(也就是说,其被传递到图片效果)作为RT3使用。
G-Buffer pass
G-buffer pass渲染每个游戏物体一次。漫反射和高光颜色,表面平滑,世界空间法线和自发光+环境光+反射+光照贴图被渲染到G-buffer纹理中。G-buffer纹理被设置为全局shader属性以便后面的shader调用(CameraGBufferTexture0 .. CameraGBufferTexture3 名字)。
光照pass
光照pass基于g-buffer和深度计算光照。光照在屏幕空间中计算,所以其执行花费的时间是基于场景复杂度。光照被添加到自发光buffer。
不通过摄像机近截面的点光源和直射光作为3D图形来渲染,并进行深度测试来决定是否在场景中启动。这使得部分或完全被遮挡的点光源或直射光渲染的代价非常低。平行光和平通过近截面的点光源和直射光被作为全屏四边形来渲染。
如果一个光照启用阴影,那么这些阴影也将在这个pass中进行渲染和应用。请注意阴影不是免费的,阴影投射器需要被渲染,并且一个更复杂的光照shader必须被应用。
唯一可用的光照模型是Standard。如果想用一个不同的模型,您可以更改光照pass shader,通过将修改版本的Internal-DeferredShading.shader文件从内置shader文件夹中放置到Assets文件夹下的Resources文件夹中。然后到Edit->Project Settings->Graphics窗口,选择Deferred下拉框中的Custom Shader。然后选择看起来是您正在使用的shader的shader选项。