[siggraph13]《命运》的实时渲染技术

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的愿景拿出来应应景:

[siggraph13]《命运》的实时渲染技术_第1张图片

简而言之,这样劲猛的决定需要非常明确的理想追求和过硬的实力,否则可能把自己玩死。


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相关的东西了,包括三块:

  • specular color相关的,使用一个id(bungie称之为specular tint id)来到贴图里面sample信息,进而和diffuse color计算出specular color
  • roughness(和gloss,specular power非常类似的物理概念),也是使用一个6bit的roughness id来sample贴图得到
  • shape:这个比较有意思,还是用id来sample高光的分布形状
他们加一起一共18bit,bungie再把他们弄到一个贴图里面,使用material id来sample他们,所以关系是:
8bit material->18bit specular相关的id->sample一系列specular信息。
展开说一下:
specular color转换信息从贴图里面读出,是一个rgba的值,然后使用specular color = diffuse color * a + rgb计算出。
specular 的高光分布(这个真有意思),是到贴图里面去读的,不是简单的公式算出来,这样artist可以随意的来画分布情况,不同材质的表现力应该说也大多了:
[siggraph13]《命运》的实时渲染技术_第2张图片

shading过程
是先算出积累的lighting信息,分diffuse和specular存到2个buffer,然后再读diffuse gbuffer,shading出最后结果。
一方面是specular color也是从diffuse里面算出来的有关,一方面可能考虑到xbox360这样的平台,一起来算会出现带宽问题,反正这是bungie的选择。

接下来是在此pipeline上的一些扩展:

这个图片挺酷的:

[siggraph13]《命运》的实时渲染技术_第3张图片

皮肤

技术中规中矩,但是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的时候,有比较准确的混合

[siggraph13]《命运》的实时渲染技术_第4张图片

方法比较数学,基本思路是,在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:

  • 1/16 depth buffer:down sample depth的时候取最远的depth,存入
  • 1/16 color buffer : rgba8的格式,用来画particle
  • 1/16 transition depth buffer : r16g16格式,用来存particle depth概率分布描述,记录的是depth和depth平方的期望值(平均值)
里面还有很多细节,包括限制particle的depth方差范围(太大这个概率模型就不准了),排序的时候考虑到depth方差等等







你可能感兴趣的:([siggraph13]《命运》的实时渲染技术)