Intro
《destiny》是《Halo》缔造者bungie脱离微软之后,开发的第一款作品,其引擎pipeline由一帮业界大牛历时4年重新开发,这里是介绍下其中的一部分渲染技术。
140+页的ppt,还真是带劲,由纵横业界多年的灭绝师太,natalya领衔带来。
links:
原始link:
http://advances.realtimerendering.com/s2013/
微云:
http://url.cn/KIfbwI
http://url.cn/VnKevH
背景
娜姐先是谈了将近40页的背景,设计理念等等,可以感受到业界真正顶级的人才是如何思考和开发的,感受到其追求与过硬的实力。
engineer团队在《destiny》项目伊始思考要做什么来让美术和策划展现整个世界,答案是整一套更牛的引擎pipeline,更方便的工具,更强大更具扩展性的engine,重新做一个真正牛的引擎。
这里也把最后一页,bungie的愿景拿出来应应景:
简而言之,这样劲猛的决定需要非常明确的理想追求和过硬的实力,否则可能把自己玩死。
bungie的engineer对技术与游戏设计的关系把握的非常到位,其技术就是为游戏服务的,只有在服务于游戏且效率过关的前提下,其技术才有价值,否则再酷也不会被考虑。
娜姐也谈到《destiny》是一个什么样的游戏,其特点是怎么样的,而engineer从技术端可以在pipeline,在效果与效率上能做什么。
这是一个我非常赞同的视角,开发者(不管你是美术,程序还是策划)都需要从整个游戏的视角来看自己这块,然后用自己的专业技能来提出方案,解决问题。
新引擎跨了5个平台(pc,ps3,ps4,xbox360,xboxone)。
然后进入技术bu'ff [bu'fen]
DeferredLighting
GBuffer
destiny使用的是这样的gbuffer:
material信息存到贴图里面作为look up table,这样做的一个重要原因也是受限于xbox360的edram的大小。
不可避免的artist在做的时候,肯定是要受限了,但是效率肯定非常的好了。
这里material信息其实就是specular相关的东西了,包括三块:
接下来是在此pipeline上的一些扩展:
这个图片挺酷的:
皮肤
技术中规中矩,但是pipeline结合的比较好:
使用screen space subsurface scattering,这里就显示了其pipeline的和feature的良好结合,因为有diffuse lighting accumulation buffer,因此就在这个上面做scattering即可。
specular model是kelemen。
头发
使用的是简化版的marshner模型(不是一般比较常用的kajiyakay),是在gbuffer构建阶段把anisotropic highlight的结果直接修改到diffuse和specular roughness中。
这个方法感觉比较有意思,不会因为[0.0f,1.0f]范围导致表示亮度不够出问题么?
嗯,用了应该就是问题不大吧。
透明物体渲染
光照
透明物体希望和opaque物体一样受复杂的光照和shadow等信息,做的方法是使用一系列light probe收集光照信息,然后transparent object渲染的时候就sample这些light probe信息来做。
原理和irradiance volume等radiosity类的差不多。
但是区别也要分清,irradiance volume那个要记录间接光照,所以cook起来就慢多了,这个只需要记录直接光照和shadow,所以计算量远不是一个量级的。
bungie使用gpu来收集信息,以SH参数来存,xbox360上面:1024 light probe, 50个光源:0.15ms。
1/16 buffer渲染优化
这个比较猛,使用variance depth map(简称VDM),来达到一个比较好的过渡效果。
要做的事情就是在这种地方,在从低精度到高精度的composite的时候,有比较准确的混合
方法比较数学,基本思路是,在1/16 buffer上面渲染particle的时候,记录其深度值的概率分布,然后在up sample的时候,使用高精度depth做参数,计算粒子应该透过来多少。
一系列粒子的分布就是用高斯分布来描述,一般比较自然的情况都是用这个分布来描述,使用方差就可以把这个分布描述清楚。
然后up sample的时候,高精度depth,作为积累分布函数的参数,计算出的结果,作为低精度particle,up sample到高精度color buffer上面的透明值。
(积累分布函数的意义,数学意义是对于连续函数,所有小于等于a的值,出现的概率和,结合这个例子就是,对于给定depth,以及这个particle深度分布,particle出现于小于这个depth的概率和,在进一步举例子就是,如果高精度depth是在particle的后面,那么概率就是1,那么up sample的时候就一点也不用fade out,反之如果是particle分布的中间,那可能就是0.5,如果是紧贴着camera,那就是0)
算法清楚了之后,渲染过程就顺理成章了,一共有这么几个buffer: