资源预览内容
第1页 / 共16页
第2页 / 共16页
第3页 / 共16页
第4页 / 共16页
第5页 / 共16页
第6页 / 共16页
第7页 / 共16页
第8页 / 共16页
第9页 / 共16页
第10页 / 共16页
亲,该文档总共16页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
延迟渲染及材质ID技术背景最近太懒了,打LOL, RM这一块都荒废了下来,关于延迟渲染的RM工程其实个把月前写 好的,杂务所扰,一直没有静下心来整理,现在正值年关,终于可以继续了,努力在接下来 的几周把接下来的Monkey计划完成。关于延迟渲染技术,在现阶段的游戏程序中正被越来越推广使用,从PS3, Xbox360的次时 代,到暴雪的星际2,及最近效果完全征服我的战地3,无一例外的使用了延迟渲染 DeferredShadin(以下简称DS, DeferredLighting, DL技术暂不在这里讨论)。那么传说中的强大延迟渲染技术到底有何强大之处呢?!其实,理论早在几十年前就已经提出,实现也不难,真正的优势,要从传统的前向渲染(Forwardshading, FS)说起,下面引用一段介绍:在TabulaRasa中,我们一开始的渲染引擎是基于最初的DX9而完成的传统前向渲染技术(FS) 的,使用了 HLSL和D3DXEffect。我们的Effect使用了 Pass里的Annotation来描述这个 Pass所支持的光照。而在CPU这边,引擎可以算出来每个几何体被那些光源所影响一一这 个信息连同那些在Pass的Annotation里的信息一起,用于设置光源的参数、以及确定每 个 Pass 该调用多少次。这种前向着色有多种问题:1, 计算每个几何体受那些光影响耗费了 CPU的时间,更坏的是,这是个0(n*m)的操作。2, Shader经常需要超过一次以上的Pass来渲染光照,渲染n个灯光,对于复杂的Shader, 可能需要0(n)次运算。3, 增加新的光照模型和新的光源类型,可能需要改变所有Effect的源文件。4, Shader很快就将达到或者超出SM2的指令限制。在MMO里,我们对游戏环境很少会有过于苛求的要求。我们无法控制同屏可见的玩家数量、 无法控制同屏会有多少特效和光源。由于传统前向渲染缺乏对环境的控制,且对于光源的 复杂度难于估量,因此我们选择了延期着色。这可以让我们的画面更接近于当今顶尖的游 戏引擎,并且让光照所耗费的资源独立于场景的几何复杂度。延期着色提供了下面的好处: 1,光照所耗费的资源独立于场景复杂度,这样就不用再费尽心机去想着处理那些光源影响 几何体了。2, 不必要再为几何体的受光提供附加的Pass 了,这样就节省了 DrawCall和状态切换的数 量。3, 在增加新的光源类型和光照模型时,材质的Shader不需要做出任何改变。4, 材质Shader不产生光照,这样就节省了计算额外的几何体的指令数。简单的说,DS最大优势便是在如今渲染模块中PixelShader变得越来越复杂的情况下, 能最大限度地节约硬件效能。实现原理延迟渲染管线可分为俩个阶段:Geometry,Lighting,当然如将GeometryBuffer中的丰富的信息 仅仅用于光照点亮过程显而易见不是俺们程序猿“雁过拔毛”的性格,所以通常各种 Post-processing也会被被我们加入管线之中,这里且不做深入。鄙人很懒,相比码字,更喜欢用代码说话,所以这里就杂糅一些别人的著说,后面再一一提 名感谢,嘿嘿Geometry阶段:将本帧所有的几何信息(位置,法线,贴图)光栅化到G-buffer Lighting阶段:以G-buffer作为输入(位置,法线)进行逐像素的光照计算,得到渲染结果。DS整体渲染过程并不复杂,但问题往往出在细节,下面先一一列举各个步骤。G-bufferGeometry阶段将几何信息渲染到MultiRenderTarget上(MRT),当前最多支持4个MRT。 并且驱动要求4个MRT必须相同的bit宽度。RT对显存占用过大会增加带宽,降低cache 命中。而简单格式的RT又会影响画质。因此决定使用32bit的RT (如A8R8G8B8, R16G16F) 或64bit宽度的RT(如A16R16G16B16F)。需要在画质和性能间做出折衷。(开发时尽可能 可以方便的配置)。中有一些性能比较。光照计算使用延迟渲染技术最大的好处就是可以渲染光照极为复杂的场景。这里场景中的光照可以分 为两类。影响整个场景的scenelight。如directionallight。渲染一个screenquad,逐像素光照计算,没 什么好说的。另一类是只影响一部分区域的locallight。如点光源,聚光灯,以及特效等等。这些ocallight 只影响到屏幕上的某些像素,当然不需要逐像素的进行光照计算。最简单的方法是绘制这些 光源的包围体(点光源的包围体是球,聚光灯的包围体是圆锥),包围体的大小要大于等于 光源的衰减范围。这些包围体经过变换投影到屏幕上的对应区域,随后在pixelshader中计 算光照。优化:1光源包围体的视锥剔除,遮挡剔除。2光源包围体投影后很小时剔除;若干个靠的比较近的小光源合并成一个较大的光源3.光源包围体的backfaceculling4屏幕空间中没有被光源照到的,或者被更近的物体遮挡住的像素不需要光照计算,因此可 以逐像素的深度剔除。a.使用正确的stencillightvolume。类似shadowvolume的方案,将渲染lightvolume的正反两 面,得到正确的stencilmask,然后光照计算时使用stencilbuffer。这种方法可以得到正确的 结果,但是需要渲染每盏灯时频繁改变renderstate,可能会带来一定性能上的损失。b使用ztest,可以得到“一定程度上正确”的结果。阴影光照计算的同时计算阴影。使用传统的shadowmap,预先生成一张阴影图。考虑在编辑场 景的时候指定那些重要的光源才会产生阴影。在计算shadowmap时要针对光源的 bindingvolume 进行剔除。方向光和聚光灯可以使用基本的shadowmap投影(正交投影,透视投影)。点光源会复杂 一些,需要使用 cubicshadowmap。(考虑 unwrappingmethod14)半透明由于在延迟渲染的过程中只计算离屏幕距离最近的那个像素的光照,因此无法处理半透明物 体的光照。方案1延迟渲染的过程中只处理不透明的物体,将所有半透明的物体放在渲染过程的最后,使用传 统的 forwardshading 渲染。方案2在Geometry阶段将半透明的物体和背景逐像素的交织起来,将透明度放在一个单独的通道 中。按一般的方法计算光照。随后在composition阶段再根据透明度将透明物体和背景逐像 素的混合起来。优点:光照一致性。半透明的物体也参加延迟渲染,可以接受多光源的光照。简单并且健壮。不需要单独区分不透明物体和半透明物体,不需要单独的半透明渲染管道。 速度快。只增加了 7到10条ps指令,两张贴图,只有约2%的性能损失。缺点:模糊。在半透明的物体上会有一点模糊,原因是在交织的过程中会有一定信息损失。 边缘锯齿。反交织的过程中半透明物体的边缘会产生一些锯齿。只能有一层半透明。多种材质在延迟光照的过程中支持多种材质需要如下方案:在Gbuffer阶段输出材质的ID到Gbuffer的一个通道中,随后在lighting阶段根据材质ID使用不同的光照函数计算光照。这种方案在sm3.0中使用动态分支的前提下可以很好的工作。 反锯齿Dx9API不支持反锯齿的MRT(需要在后处理上自行解决AntiAlias),Dx10支持。一种方案是使用超采样,先渲染到大的RT上,再downsample到正常的大小,得到没有锯 齿的结果。延迟渲染的效率跟分辨率有很大关系,因此这种方法会极大的降低性能,基本不 可取。另一种方案是使用“intelligentblur”,只模糊物体边缘的像素:根据相邻像素的深度和法线提取物体边界,然后对提取出的边界进行模糊。模糊时要避免不 正确的泄露。如后面物体的颜色泄露到前面的物体上。总体而言实现会较为复杂。另一种方案:prelighting一种 pre-zrendering 和 deferredrendering 的结合。G-buffer 阶段只保存 depth 和 normal,然 后计算光照信息到lightingbuffer,格式如下LightColor.r*N.L*AttLightColor.g*N.L*AttLightColor.b*N.L*AttR.Vn*N.L*Att最后使用传统的forwardshading再将整个场景渲染一遍,期间查询lightingbuffer。与普通的deferredshading相比:优点:占用带宽小,第一遍渲染只输出normal, depth是自动获得的。可以用在较老的硬件平台上, 不需要MRT支持。对现有forwardshading管道改动较小,比较容易实现。缺点:整个场景需要渲染两遍,相当于在pre-z和forwardshading中间加了一个lightingstage。 Resistance2,GTAIV,MidnightClubLosAngeles使用了这种技术。CryEngine3 中 也使用了这种方案。RT选择分配MRT 中必须的信息:position(depth),normal,diffuse(texture)可能需要的信息:specular,power,emissive,ao,materialid这些信息需要在这4个RT上用合理 格式,合理的组织。这里还可以就存储空间和shader的复杂性做折衷。如只保存depth,然 后在光照时计算position。以及用球面坐标保存法线。以目前的资料得出的结论是应该尽可 能地pack数据,减少内存占用,多出来的若干条shader指令不会明显影响性能。RT的预置,分配是需要针对实际使用而设计的,如何最大化地发挥每一个bit的作用, 是一门需要不断实践的技术活。saA8Depth 24bppDSLighting Accumulation RGBIntensityRTONormal X KFP祐Normal (FP16)RTlMotia 11就炖话男Spec-Pow&rSpeclntensityRT2匚Diffuse Albedo Rl3Sun-Occlusi-ofiRT3KillZone中的MRTf分布管理MultipleRenderTargets(Direct3D9)MultipleRenderTargets(MRT)referstotheabilitytorendertomultiplesurfaces(se IDirect3D9Surface )withasingledrawcall.Thesesurfacescanbecreatedindependentlyofeachother.Rendertargetscanbe setusingIDirect3DDevice9:SetRenderTarget.Multiplerendertargetshavethefollowingrestrictions: Allrendertargetsurfacesusedtogethermusthavethesamebitdepthbutcanbeofdifferentfor mats,unlesstheD3DPMISCCAPS_MRTINDEPENDENTBITDEPTHScapisset. Allsu rf acesofamultiplerendertargetshouldhavethesamewidthandheight. Someimplement
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号