基于Ogre的DeferredShading(延迟渲染)的实现以及应用
想免费获取内部独家PPT资料库?观看行业大牛直播?点击加入腾讯游戏学院游戏程序行业精英群
711501594三年前开始接触ogre引擎,由于工作需要一直进行图形方面的研发和尝试,随着引擎技术的进步,ogre的与Cryengine3、Unreal3等一线图形引擎在画面上的差距越来越大,主要原因在于ogre目前的设计趋于一套开放性的架构,并不着眼于细节的完善,也就是说盖一栋别墅,如果你要住进去就要自己去装修....软件开发都说魔鬼是藏在细节里面,这样的开放式框架也给项目使用者带来很大门槛,更多的时间花在了完善ogre的功能上。
在图形方面,ogre的默认图形架构属于最传统的方式,当今次时代引擎无一不进入延时渲染时代(Deferred Shading),这种渲染架构既保证了渲染效率又带来了新的渲染效果,Ogre例子里虽然也涉及DeferredShading的例子,但是并不实用(显然只是开发者用来告诉使用者Deferred Shading这个都东西可以有),针对这一点,基于ogre1.65(已经升级到1.75)我重新设计了一套Deferred Shading框架,接下来就由这个框架来简单介绍一下Deferred Shading(根据读者需求我会针对单个的技术写文章)。首先,来几张DeferredShading框架下的Demo截图,该相关信息也将会发布在ogre Froums上,敬请期待。








上传到优酷的Demo视频 :
很多人对森林那部分场景感兴趣,我简单做了下技术解析,主要针对渲染架构下的数据信息输出,以及各种渲染技术叠加所产生的效果,并包含一些单个技术的解析。
一下是我使用的渲染流程图表:
包含深度数据以及法线数据,深度数据可以还原成每个像素的位置数据,有了这个信息我们实现了SSAO、Fog、Light shaft、Dof等众多效果。发线图除了应用于光照,对SSAO或者以后将要有的SSGI都有一定的贡献,我相信在将来的一段时间的图形新技术也免不了要依赖于G-Buffer,该图表充分反应了G-Buffer的重要性,而且提供了更广泛的扩展性。
上图是要说明的是各个效果之间的相互作用与叠加对图像产生的影响,我想表明的观点是,任何效果只有在相互融合的情况下才能发挥出应有的作用甚至超乎自己的想象,这需要你对场景特点的解读以及对自然界细心的观察,并经过反复的调整,对于美术人员来说,需要充分对这些效果进行透彻的理解(这点比较困难,美术人员理解方式与技术人员有较大不同),然后把心里所想的场景氛围一层层的剖析分解,再使用现有技术进行调整。
接下来我将做一些单个技术的解析:
光源
在渲染场景物体的时候,我讲透明和非透明物体分开进行渲染,这是因为DeferredShading的先天性对Alpha测试处理的缺陷,只能使用前向渲染来处理里半透明物体,从另一个角度上来说半透明物体失去了DeferredShading光照的优势,所以DeferredShaing对处理写实场景具有很大优势。
在光源处理上,将太阳光进行了单独的处理,在美术的角度上,要想获得模型较好的光照效果,普遍使用三角光源来渲染模型样板,其实仔细的对自然光的观察,也可以将自然光拆分成三个光源,我姑且先起名为:(太阳)直射光,逆射光,天光。
直射光描述太阳产生的方向光,让物体产生立体感,这个最容易理解。逆射光与方向光的方向相反,主要表现太阳光照射在物体上的反射光线,突出暗部边缘和于正面光源颜色的互补。天光则是描述阳光在空气中的散射,以垂直向下的方向光进行模拟,但是因为空气散射是四面八方没有固定的方向,我们可以修改一下phone模型的公式,将光照范围扩大一倍,这样混合的光感就更接近自然。
在光源无变化的场景中的静态物体使用VSM技术和LightMap混合的方式,在一定范围内才是很正的阴影,超出之歌范围则自动过渡到LightMap烘焙的阴影部分,这样阴影的计算量就小了很多。在诸如有日夜变化的场景中,显然烘焙的阴影不能达到要求,这就需要所有物体都进行产生真实的阴影,也就是使用开销很大的PSSM技术,该技术有也是有很多优化空间,但是总体来说还是需要使用者心中权衡利弊。
游戏中使用的最多的半透明物体就是水,自然界中的水会对水面以下的东西进行扰动,这一点上Deferred Shading可以发挥作用,在光照阶段将不透明的物体均渲染得到的纹理Buffer,我称为LightColorBuffer,将LightColorBuffer作为纹理贴在水面上,再根据法线对该纹理进行扰动,这样我们就得到一个廉价又美观的折射效果,再配合方向光的光照(主要是Specular)就得到一个不错的水面效果,另外还可以通过获得G-Buffer中的高度数据来实现水面的自动深度,今后我会做一个专题文章。
水的效果
水晶材质
SSAO(全场景光线遮蔽)
光线在空气中以光粒子的形态传播,会受到各种物质的反射和干扰,可以看到在现实生活中一面墙壁的角落会比其他地方更暗一些,也就是说传统的phone模型光照是以射线的方式来进行计算光照,无法模拟出空气已经物体对光的反射和折射关系。SSAO全名问全屏(幕光线遮蔽),最早是由cryengine2的研发人员设计并真正应用的一项技术,目前已经目前次时代作品普遍使用的一项技术。SSAO可以模仿出上述这种光线在传播的效果(只是模仿而已),通过G-Buffer中获取的深度图计算当前像素和周围像素之间的位置关系,进而得到该像素点是否处于光线比较难以到达的位置。
该项在该技术发明之前许多游戏工作者已经发现AO对场景存在感有着质的提升,所以很多老游戏都采用使用美术手段在3D软件中烘焙LightMap(光照图)的方式(最早使用者是大名鼎鼎的卡马克),这种方法仍然沿用至今,甚至有LightMap和SSAO混合是用的例子(Unreal Engine3)。
Glow(自发光)
很多游戏中存在一些细小且不规则的发光物体,想一些发光的符文,这些细小特别的发光物体使用灯光物体是不需要使用真正的光源,Glow效果在此处就有了用武之地。
我们将发光信息存储在模型的纹理中,如图:在渲染物体时将该信息提取并做为一个(或者三个)通道存储在Buffer中,这样在后期再从Buffer中得到这个发光信息,通过高斯模糊处理再与原Color重叠即可得到Glow的效果。Glow并不能照亮环境中的其他景物,是一种视觉欺骗,不管如何我要的效果是达到了。(图形学里面充满各种视觉欺骗...)
Fog(雾效)
这项技术的实现手法跟DOF很类似,同样要用到DepthMap,根据参数得到maskmap,根据太阳的位置对maskmap进行径向模糊(参考PS的滤镜),最后调整好光的颜色以及与场景的混合方式就OK了。

这篇文章写于两年半前,作为我在这的第一篇文章吧。写完这篇文章之后我就和几个朋友一起创业,带着技术人员的偏执和单纯,折腾了1年左右最终以失败告终,而如今的我是一家创业公司的主城,使用的引擎已经是Unity,可能有人会问我你之前的积累不是白费了吗? 我自己觉得并不是这样,Ogre 是个很好的学习参考,通过Ogre我深刻理解了引擎底层的机制,这让我对很多引擎都能比较轻松的掌控,万变不离其宗就是这个道理,希望如今新入行的朋友们,不要只被各种引擎花哨的效果迷了双眼,事事多追本溯源会对你今后的发展有非常大的帮助。