▌Part1
游戏行业中,如果说一款游戏对于基于物理的光照(Physically Based Rendering,后面简称PBR),那大概是非使命召唤系列莫属了。
本期嘉宾:《Call of Duty: Black Ops》
虽然很早的时候Halo系列已经非常hardcore的开始使用PBR,但是那个时候游戏行业还在Phong模型+hack搞得不亦乐乎,很厉害,但多少有些超前了。
到了接近2010年的时候,siggraph中PBR专题已经越来越多,这股风潮从cg行业开始,加上理论逐渐成熟,如果单纯看理论的话,可以说已经非常扎实了,对于能看懂相关论文和介绍的人来说,已经不需要辩驳,就知道这个是必然趋势了。
也有了一些能出效果的游戏以及数不清的demo,但这始终缺乏说服力,在2011年《Call of Duty: Black Ops》在siggraph上面发表的《Physically Based Lighting in Call of Duty: Black Ops》,可以说给广大跃跃欲试的开发者以极强的信心了(COD都这么干了,还怕什么?)
这也正是当时在《天涯明月刀》里实现PBR的时间点。
PBR乃是“气宗”,难点不在实现
看看早期谈PBR的文章,很多都谈到升级PBR这件事情是最难的事情之一,而且难的不是技术部分,而是要在团队沟通上花很大精力(俗称“和美术吵架”)。
也常常听一些开发者直接说有没有PBR,好像PBR是一个像ik一样的,很具体的技术。
其实PBR更多的是一种思维方式,非常像金庸小说中的气宗:
非常明确的追求数学正确:整条pipeline,从制作到最后呈现,符合正确的数学模型
这里在相当程度上是颠覆了开发团队的习惯,之前开发团队尤其是美术方面,都是本着以“好看”为指引来构建如何去做,材质各种hack,都是OK的。
但是到了PBR阶段,画风一转,首先追求数学正确,在这个基础上再谈好看。
仿佛练熟了“胡家刀法”的人,被突然要求得变一变,要按着“九阴真经”走起,“要用意不用劲。随人而动,随屈就伸,挨何处,心要用在何处。”,这种转变在不了解其所以然的情况下,吃几个败仗,当然要骂娘了。
实现层面,尤其是2011年这个时代的PBR都是比较简单,处理好HDR、linear space calculation以及macrofacet的模型,基本就可以,其难度只需要刚毕业的学生就可以。
但在其推进层面,则是超难的一件事情。
“习惯于原先hack的美术们,对这个新系统的使用也颇有不习惯,工业光魔内部甚至引发了一场“圣战”,简而言之,费了好多力气才把新的系统(energy conservation, normalized specular等)推行下去。”
这可是让我们在电影院里高潮迭起的工业光魔......
在项目中推进一个新事物
早些年常常听到一些开发者说在其项目中如何快的实现了PBR,但是项目组如何的不理解不支持,最后导致难产。
这里就涉及到一个关键的问题,如何在项目中推进一个新的事物,基本需要
-
道理站得住,且解释的明白——道理对的,团队不理解还是不行
-
成功项目案例做支撑
-
好的影响力——在项目里你是老板还是老“板儿“,那推进自然有天壤之别
所以当年即便一直跟进,已经很明确知道PBR乃大势所趋,但是依旧不能轻易在项目中来推进,直到《使命召唤》放出了他们的presentation。
带着解释清楚的道理,成功得不能再成功的《使命召唤》案例,在项目里开始推进PBR,然后......依旧很艰难。
对于习惯的改变大家本能是反对的,尤其是大家始终不能脱离开应该是“好看就好”为宗旨来构建该怎么做,数学模型太飘渺太束缚。
另外,《使命召唤》行,我们行么?会不会人家是因为其他一些我们不知道的因素。
所以一方面反复的解释沟通,做效果,一方面迅速在1、2周内完成所有升级。
争议,尝试,看效果,进度缓慢中进行。
这时倒是有一个很有意思的转折点,有一个美术始终不认可这种做法,并不按照给出的各项物理属性来制作物件,并在中午的环境下制作出一个确实很“带感的”场景,当时刺客信条有一个类似的场景,确实已经非常接近了。
然后我查看了各个物件的材质属性之后,就把光照环境切到晚上,于是“刺客信条”的画面即刻变成一锅“八宝粥”。
后面逐渐就顺利了,24小时的时间循环,风雨雷电,潮湿到结冰,一套材质始终表现很好。
复杂度杀手——数学
这里我们再回顾下早期CG行业引入PBR的时代背景,简言之就是项目组被复杂度压垮了。
当时也是shader等由艺术家来主导,怎么好看怎么来,在简单地动画拍起来没问题,然后动画变得越来越复杂,材质、场景、时段都在猛烈的增加,然后项目组就崩溃了。
白天好的材质,到了晚上就不行了,换个视角就不行了,整个一被绒线缠住的萌猫,被撸得一点脾气都没有。
然后开始PBR,事情就简单了。
其背后的原因,就是面对超大规模超高复杂度,就要有一个坚实的数学基础。
而没有数学正确的hack,则如同不能放之四海皆准的道理一样,本地可以,换个情况就“不准”了。
到了今天,除非二次元这种风格化的游戏,写实类几乎都是PBR的了,但这也并不意味着项目组得了其神韵,很多团队和开发者依旧无视项目的规模复杂度,在光照材质以外的地方,无视数学模型的在hack,在绒线里打滚。
so简言之,正确的数学模型才是应对规模和复杂度的正确姿势,宇宙通用语言就这么酷炫。
---
▌Part2
“没有最PBR,只有更PBR”
上一部分也聊到了,PBR不是一个具体的技术,而是类似“气宗”这样一种思维方式,要以数学正确为基础来构建解决方案。
所以这里就会有大量的流派出现,而不会如一些开发者所认为的,你也PBR了,我也PBR了,大家就一样的PBR了。
第n层PBR
Tim Sweeney在12年的D.I.C.E. Summit对于realtime rendering做了一个很好的比喻,他就像一个对于现实的泰勒展开。
实际中我们从上世纪90年代开始,就是一直在做这个事情,到了PBR也只是其中的一个阶段,在PBR内部,具体的数学模型,BRDF的表达上,还是会一层层的深入进去,倒是挺像武学中的一层层的,越练越牛啤呢。
"Material advances in Call of Duty: WWII"
这里就SledgeHammer在18年siggraph上的这个paper来看一窥现在这层PBR。
这里是在PBR的大框架下,在实时的,产品级别的前提下,不停的逐步推进物理准确性。
主要看点:
-
目前PBR的进一步发展趋势,就是在更加细节的地方,物理更加正确。
-
Activision做R&D的方式,非常的严谨,和实验室发论文并无二致,非常喜欢,不过所以本篇文章偏理论,读者看着会比较枯燥,但必须疾呼这个其实很酷很牛逼的。
-
工程上,每一个方面的提升,都是基于正确的理论,来做高效的近似,而不是“直接hack,看着挺好就挺好”。
主要内容
-
normal & gloss mipmapping
-
material surface occlusion
-
multiscattering diffuse BRDF
normal&gloss mipmapping
我们现在普遍使用的方式是normal map是normal map,gloss(roughness)是gloss,两者互相独立,那么在实际情况者面对这样的情况:
在远处就和实际情况不对。
这里sledge hammer的做法,其实在farcry和crytek的之前文章都有涉猎,在方向上是一致的:把normalmap看做gloss的一部分,尤其是远处的时候,normal的细节因为normalmap的mipmap的原因丢失,那么应该转入gloss的mipmap中去。
所以做出来的gloss就要考虑normal map进去,mip做出来这样:
最后效果对比再贴下:
文中也给出了gloss对normal的经验值:
文中进一步给出了更精准的数学推理和做法,上图的表就比较有应用作用了。
blending细节normal的时候,再次提到经典blog:
https://blog.selfshadow.com/publications/blending-in-detail/
material surface occlusion
这里也是考虑得颇为细致,赞一个。
就是normalmap可以用来在材质级别上去生成ao&self shadow信息,并且重新思考了ao的shading方式。
normal map->ao做法上这个顺序
-
normal map->heightmap
-
heightmap->ao
ao的shading
这个是我们常用的shading ao的方式,可见的部分是一个亮度,被occluded的地方,就是黑的,但是这个和实际情况不符,occluded的地方也是有反射的。
这里可以考虑到旁边材质的间接反射:
这样就精准了。
[ 对比图可以看到右边更符合现实了 ]
ao的应用
最后ao也是用在了specular occlusion上面
multiscattering diffuse brdf
这是一个早期开发时候的图,文中发现左边比右边亮,这个不符合我们的常识,右边是向阳的,应该更亮才对呀。
这里进一步就引发了对光照模型的探索,中间是明确区分了specular和diffuse,这个导致了不够能量守恒。
能量守恒
正确方式:
所以我们要根据specular的能量反射来调整diffuse lighting的量。
这个specular lighting的反射如何测定(或者游戏中现实的方式去决定),作者使用的是EnvBRDF的table来做specular的能量测定方式。
multiple scattering diffuse brdf
另外作者也进一步引进了Heitz的做法。
考虑到了能量在macrofacet之间的反射,要进一步将scatter考虑进来。
这里就是对于光照模型的运用,贴下ref就好了
[Mat03] A Data-Driven Reflectance Model
[Brd12] BRDF Explorer
---
▌Part3
"We shall PBR on the beaches, we shall PBR on the landing grounds, we shall PBR in the fields and in the streets, we shall PBR in the hills; we shall never Hack!!!"
前面聊了PBR的产生历史原因,逐步发展的更加正确完善数学模型,这里就是聊下PBR的应用广度。
早先我们所谈的PBR,更多的集中在典型的材质的反射模型,包括石头、金属、皮质等等,但这远不能完整的表达现实世界,更不能满足开发者的狂热幻想了。
我们可以看这些COD的材质所支持的:
[ 冰层的透射 ]
[ 旗子的准确opacity表达 ]
[ 枪表面非常复杂多样的材质 ]
所以游戏中PBR的继续发展方向之一就是,要在production限制(合理的开发效率和运行效率,我们始终不能脱离这点来谈任何东西)下,能够不断增强表达范围。
而且deferred shading这种比较限制表达的render pipeline看来要退出历史了。
这里我们可以结合siggraph17,由infinity ward带来的<Practical Multilayered Materials>
主要看点:
-
更完善的材质属性和表达,包括了反射,透射和散射等
-
更多层材质
-
而且使用unified shading model
-
整体向cg的方向在发展
details:
unified shader/parameter
activision这里的做法形式上是支持多种材质属性并且支持多层:
多属性
首先是将材质分成了三大类:
-
surface: normal/roughness
-
macro:density/thickness
-
micro:材质的介质属性
实际光照模型对于这些属性进行一个完整支持,并且支持多层:
[ 上图中下面一列的部分都是多层材质的结果(涂油漆的木头等等) ]
activision做法是,就是一层层的计算,计算包括:
-
光的absorption,scattering
-
积累光照的结果
forward lighting+
这些放在一起,deferred shading就不给力了,forward lighting来处理这些复杂的材质计算。
deferred shading从07年killzone2的paper开始正式流行,到现在的PBR的阶段,预计是要逐渐退出历史舞台了。
material compiler
形式上更加趋近于电影的方式。
具体的技术细节
opacity计算
这里就是考虑到alpha和thickness
直接代码吧:
thin fim layer
thin film这里讲得是材质表面上盖得另外一层比较薄的一层,但是会影响光的wavelength的这种材质。
这种材质的表达,会很大的影响材质的表达能力
hmm推理过程套路就还是那些,要点是我们要知道有这么个东西,而从早期pbr过来的时候,这些概念还比较缺乏,而直接上movie industry的一套,取舍的研究要做很久,知道那个在实际游戏中用那个不用即可,细节直接看论文吧,贴下代码: