嘉宾简介

李冰

李冰 《无尽战区》渲染方案迭代分享

毕业于北京大学,现任天下事业部资深开发研究员,网易金牌讲师。目前负责《无尽战区》项目客户端引擎开发及项目渲染效果优化等。

分享内容

摘要

  作为网易首款TPS视角MOBA游戏,《无尽战区》不仅在玩法上做出了突破,同时在画面效果和品质上也在不断探索和迭代:日式动漫还是美式卡通?虚幻还是真实?在从无到有的紧张开发期中如何打破层层迷障,创造出有自己特色的渲染方案?

  “在整个过程中,我们要对我们的效果以及整个框架、技术进行不断的更新、迭代和反馈,这样才能得到效果和美术的共赢。”

文字实录

《无尽战区》渲染方案迭代分享

1/30
  • 《无尽战区》渲染方案迭代分享
      我在《无尽战区》项目组主要负责客户端引擎开发以及渲染效果优化工作,并同时担当了TA的工作。

      
  • 《无尽战区》渲染方案迭代分享
       无尽战区是一个跨时空大乱斗背景的游戏。

      
  • 《无尽战区》渲染方案迭代分享
       我们的战斗的核心体验是TPS、第三人称射击和格斗,而在玩法上属于5v5的MOBA类型游戏。

      
  • 《无尽战区》渲染方案迭代分享
       在游戏中你可以操作各种风格迥异的英雄。

      
  • 《无尽战区》渲染方案迭代分享
       我们的游戏对于引擎有着一些特殊的需求,如果完全照搬公司现有方案不太现实,所以我们根据项目的核心需求对我们的渲染引擎做了一系列研究与定制。

      
  • 《无尽战区》渲染方案迭代分享
       总结来看我们项目有两点最核心的需求:

      
  • 《无尽战区》渲染方案迭代分享
       第一我们在基础战斗上是一款格斗+射击类游戏,手感、响应速度对我们来说是至关重要的,引擎的性能和稳定性是我们优先考虑的重点。

      
  • 《无尽战区》渲染方案迭代分享
       第二,由于我们一开始就定义为一个偏卡通风格的游戏,所以角色的个性化渲染,材质的动态效果属于优先考虑的方向,也就是说我们引擎需要提供可定制化并且灵活的渲染框架,可以满足绝大多数特化需求。

      
  • 《无尽战区》渲染方案迭代分享
       在那时我们选方案第一个大问题就是,是该选用Forward还是Deferred渲染。我们的引擎已经在那时提供了Deferred lighting的支持,但是我们最终还是没有选择。原因就在于《无尽战区》是一个重视帧率和响应速度的游戏,Deferred在绘制提交和带宽上的消耗远高于forward,所以在性能上Forward会作为优先考量。而效果上Deferred的确提供了更大的灵活性,但是通过一些辅助的技术,我们在forward中也可以同样达到好的效果,所以那时在技术选型时没有追逐潮流,选择了最适合自己的方案。

      
  • 《无尽战区》渲染方案迭代分享
       为了弥补Forward shading在光照效果上的不足,我们引入了烘焙技术,烘焙能够以很低的实时开销提供很好的全局光照效果,所以现在已经是公司内游戏的标配了。

      
  • 《无尽战区》渲染方案迭代分享
       做好了大方向的选型后,还总是有很多的细节不能让我满意。其实后来细细分析,很多细节都是由于背着老项目的包袱造成的。天下引擎虽然已经迭代到了次时代版本,但是由于之前是为05年的游戏服务的,所以那时为了提高效率给了很多种限制,例如我们的特效系统之前一直在沿用老引擎的30fps定帧更新,所以效果可想而知的差,玩家整体体验是以最低效果作为参考的,如果粒子帧率只有30fps,那么即使渲染达到了60fps也无济于事。除此之外还有贴图品质的一些问题,这些种种限制都在我们立项后的半年内都逐个摒弃掉了。

      
  • 《无尽战区》渲染方案迭代分享
       编辑器是次时代流程很重要的一点,编辑器不仅可以减少开发的重复劳动。也同时为美术和程序开拓了思路,如果没有编辑器,有很多创新是出不来的,因为只有较低的试错成本才能让更多的人愿意去做新的尝试。

      
  • 《无尽战区》渲染方案迭代分享
       敲定了引擎方案之后,我们就马不停蹄的开始了我们的效果迭代,因为是一个多英雄的乱斗游戏,角色风格渲染是我们工作中最主要的一部分。因为我们要做独特的人物风格, 所以在摸索中走了很多的弯路。

      
  • 《无尽战区》渲染方案迭代分享
       那时项目组普遍觉得竞品的效果太过脏乱,我们想做出更加"干净、通透"的效果,早期时的原画,角色本身的风格偏黑暗,颜色、明度上的差异也非常大。

      
  • 《无尽战区》渲染方案迭代分享
       早期美术使用天下和龙剑的材质进行了测试,效果和预想的反差巨大,一股强烈的杀马特风扑面而来,设计复杂,颜色脏乱。总是被美术吐槽:"材质受环境影响太大,无法反应“原画质感”。在这个背景下,我们准备重做一套卡通风格化的角色渲染。

      
  • 《无尽战区》渲染方案迭代分享
       针对需求,美术对我们的人物设计进行了针对性的调整。

      
  • 《无尽战区》渲染方案迭代分享
       到底什么样的卡通风格才是最适合我们的,我们对手绘系和真实系两种卡通风格分别进行了研究,手绘系是日本动漫风格,如火影忍者;而真实系是使用真实渲染风格,结合夸张的形体和动作来表现出的卡通风格,如皮克斯的3D动画。

      
  • 《无尽战区》渲染方案迭代分享
      当然从渲染方法上来说,两者都有一些共有的技术。第一种是类原作动漫的贴图画法和着色,保证颜色最能反馈出想要的质感。第二种是描边笔触处理,在日式动漫里是大量被应用的。第三种是风格化处理。

      
  • 《无尽战区》渲染方案迭代分享
       我们也采用过日式的方案进行预研,但是发现效果满足不了我们的需求。第一点是设计经验问题,我们的美术本身是做3D游戏,对于做这种偏2D的质感和动漫设计方法,是经验欠缺的。另外,我们是一个全新创立的游戏,因为没有原作参考,如果冒然去尝试日式风格,挑战会很大。还有很重要的一点,我们的资源其实没法进行兼容,因为我们在预研的时候是采用美术外包的形式,我们在做材质迭代时,我们角色的制作已经分配给外包了,所以我们必须要兼容我们已有的资源。

      
  • 《无尽战区》渲染方案迭代分享
       后来偶然的机会看到了TF2这个游戏,美式卡通、诙谐幽默、非常高的可读性、兼顾了真实效果和卡通化感觉,主要通过姿态、形体、动作和着色的色快感,干净的贴图来营造卡通感觉。

      
  • 《无尽战区》渲染方案迭代分享
       近期暴雪的新游戏Overwatch也是使用同样的思路,使用真实感的光照和质感,配合人物特色来表现卡通感,当时一看我们就觉得,这才是我们的方向!

      
  • 《无尽战区》渲染方案迭代分享
      TF2人物渲染能够达到比较好的色快感效果,并且过渡平顺,质感和颜色上比较接近我们想要的效果。比较遗憾的是TF2方案是不支持自阴影的。

      
  • 《无尽战区》渲染方案迭代分享
       着色方法很简单,色快感一般由采样一个1d或者一个2d的映射图来将Lambert的光照强度映射到一个固定的颜色上,使用ndotL来去查找一个1D纹理,可以由此实现卡通化的阴影表现,色块感通过1D映射图来调整,还可以实现假的高光;可使用2D纹理来同时实现色阶效果和边缘光效果,视点相关的分量|N・V|r可以用来模拟Fresnel高光,从而达到轮廓光的效果。

      
  • 《无尽战区》渲染方案迭代分享
       在TF2的基础上,我们迭代出了自己的第一版卡通人物材质,仍然是基于传统的Phong模型,分为视点无关和视点相关两部分。

      
  • 《无尽战区》渲染方案迭代分享
       我们在做传统的光照模型的时候,喜欢用ndotl这个lambertion项,但这个项有一个问题是,一般我们会将它clamp到0-1的范围,这样会导致背部缺乏细节。

      
  • 《无尽战区》渲染方案迭代分享
       在这儿我们将n*l不再进行clamp,而是进行了一个放缩、偏移。

      
  • 《无尽战区》渲染方案迭代分享
       第三部分就是最核心的Warping Function部分,这个其实和之前所说的色块感是同样一个道理,通过一个1d的映射图来对我们已经计算出的强度进行映射,这样就获得卡通渲染的关键色块感,相对来说过渡不会很死板,并且美术通过映射图来定义各种不同的过渡感觉。

      
  • 《无尽战区》渲染方案迭代分享
       贴图绘制应该尽量干净,细节和AO、高光等都交由材质实现,这一点一定要对美术外包进行控制,传统外包都是画上去的。

      
  • 《无尽战区》渲染方案迭代分享
       通过以上这几步,我们就已经可以获得一个干净的色快感的风格了。

      
  • 《无尽战区》渲染方案迭代分享
       再加上视点相关部分和轮廓光,我们就得到了我们第一版的卡通风格人物效果,当然这并没有结束。

      
  • 《无尽战区》渲染方案迭代分享
       在我们上一次测试后,美术闲下来,又开始给我们提了更高的挑战,再加上OverWatch的放出,大家都觉得我们在真实性上还不够高,带着这种对效果的虚荣心,我们又对我们的角色进行了进一步迭代,通过一系列方法又将我们的效果提高了一个档次。

      
  • 《无尽战区》渲染方案迭代分享
       这其中最重要的一点,就是Linear space lighting。

       1. 虽然从很早之前就接触过类似gamma校正之类的概念,但是对于为什么要做,怎么做,在那时还没有一个准确的流程;

       2. 从08年的神秘海域2,到近两年gdc上konami的fox引擎,大家其实都在强调正确的线性工作流对于游戏渲染的意义,只有正确的线性空间光照才能带来最接近于真实物理的效果;

       3. 我们游戏里都有用到Diffuse map,我们一般会理解成颜色,但是错误的。在物理上来说,Diffuse map应该解释为反射率;

       4. 我觉得不要以"就要做不真实的效果"作为借口来拒绝线性空间光照;小岛当时说的一句话,我觉得很有意思,他们是先把引擎做的最真实,再在真实的基础上去创造更多效果创新,我们决定也采用同样的思路。

      
  • 《无尽战区》渲染方案迭代分享
       传统的线性空间光照是直接使用srgb空间的数值进行处理的,pow0.45的结果,这样的存储方式是为了尽量将精度利用在人眼所敏感的暗部细节区域,但是这个值拿来做数学运算的结果是错误的,这也就是为什么我们在乘以2的时候,获得的亮度却不是两倍的原因,线性空间光照将贴图记录的srgb值转换为正确的linear数值后,再进行光照运算,最后再校正输出成monitor的gamma曲线。

      
  • 《无尽战区》渲染方案迭代分享
       实际上我们的这个选择是正确的,使用正确的线性空间光照流程后,我们总算摆脱了一直被美术诟病的"材质受环境影响太大,无法反应原画质感"的问题。高光的表现也更为自然,轮廓光和高光过曝的情况也得到了好转,最重要的是:一切都更为可控了,对于高光的调节和特效混合来说,参数更加具有物理意义,两倍就会带来两倍的亮度,并且为我们以后移植PBR打下了很好的基础。目前我们的模型渲染部分已经全部线性化。这个流程和美术的贴图制作也有关系,所以在项目开发期越早做意义越大,总之搞完之后,感觉一切都变得美好了。

      
  • 《无尽战区》渲染方案迭代分享
       由于是实时渲染,所以我们的角色在体积感上会有一些弱,总被吐槽有一些平,其实问题在于无法表达很多的遮蔽细节,手指缝隙、头发遮蔽的皮肤。传统方法,美术喜欢把这种暗部信息直接画到Diffuse贴图里,但是这样是错误的,我刚才提到,Diffuse其实是一个反射率的信息,而这种遮蔽感其实是因为这块地方接收到的间接光照受限所造成的,如果画到了Diffuse里,那么就会对所有的直接光照和间接光照都起作用,其实是错误的,会产生一些奇怪的效果。

      
  • 《无尽战区》渲染方案迭代分享
       我们使用的方法是单独为AO map开辟了一个贴图通道,美术在Max里通过模拟全局光烘焙角色的AO图,shader里再通过AO图来控制间接光照的强度,增加遮蔽感,更加好的全局光照模拟。这种方法在业界也是很常用的,包括dota2和神秘海域系列都在使用这种方法来增加角色真实感。

      
  • 《无尽战区》渲染方案迭代分享
       这个是我们的角色使用了这种方法之后的效果,人物背部的组件,手臂的遮蔽都能完美的表现出来。

      
  • 《无尽战区》渲染方案迭代分享
      在传统光照模型里,我们的间接光照是由一个常量的Ambient光来照亮的,这样一方面没有方向信息,一方面在暗处又会显得毫无细节,更为平淡。为了可以让角色和烘焙的场景融合度更好,为了在阴影里同样可以有细节和方向性信息,我们在场景中预生成了一些Probes来记录场景此处的简洁光照信息,在渲染人物时,将Ambient替换成这种Directional Ambient,就可以达到更好的效果,通过这种方法,场景的环境反射光照或者自发光都可以影响到玩家,目前我们使用CloudGI的点云烘焙技术来实现。

      
  • 《无尽战区》渲染方案迭代分享
       除此之外动态角色如何和烘焙的场景交互也是一个大问题,这个是使用了烘焙技术后很常见的一个失真问题,之前有很多同事感兴趣,关于如何处理烘焙和Forward阴影的关系。我们自己定制了一套在forward lighting下适合于我们项目的阴影处理方案。首先所有的动态角色都走一套统一的Light Space Perspective Shadow Maps算法,通过这个算法就可以达到动态阴影的投射,这个是最基本的。

      
  • 《无尽战区》渲染方案迭代分享
       在此基础之上,我们还需要静态阴影能够影响到动态的物体,就是动态物体走到静态阴影下可以变暗,这个我们是通过一张独立的预烘焙sm来实现的,这个是在加载游戏场景和镜头跳转时做的,开销很小,在绘制角色时会同时考虑到这张静态的sm和动态的sm,就可以做到。但是还有一个问题,人物走在静态烘焙的light map物体上,如果没有动态阴影,会显得很飘。

      
  • 《无尽战区》渲染方案迭代分享
       这种情况下,我们通过动态的软影方法,在烘焙的阴影中产生了一个额外的软影,加上软影之后的人物会显得站的更加踏实。

      
  • 《无尽战区》渲染方案迭代分享
       在烘焙场景中还有个问题就是怎么做好烘焙的light map上的阴影和动态阴影的混合。在这儿我们之前采用过一种方法,就是通过我们之前烘焙的那张静态的shadow map,来削弱角色投射到地面上的shadow map,这种其实大部分情况下是可以满足基本需求的,但是在阴影的边缘上经常存在失真,问题就在于shadow map的精度和light map的精度是不匹配的,所以现在我们换了一种方法,因为我们的场景是室外的,所以可以采用light map本身的强度加上两个阈值来标示light map的阴影对于动态阴影的削弱程度,最后得到的效果也是非常不错的,并且还减少了一次静态shadow map的采样。

      
  • 《无尽战区》渲染方案迭代分享
       搞完了场景融合,我们又对我们的角色自阴影效果进行了增强。以往因为同一走的lisp sm,所以每个角色被分到的精度非常低,而我们美术又很想要这种头发、鼻子、甚至于睫毛的投影,所以对于主角以及玩家所关注的对象,我们增加了一个额外的独立shadow map,这张sm其实和我们动态的lisp sm是共用一张的,所以在显存和DP上并没有额外的开销,但因为用一次就要clear一次,所以我们现在只为玩家最关注的角色加上这种高精度阴影,效果是很不错的。

      
  • 《无尽战区》渲染方案迭代分享
       以前我理解的阴影其实可能只有sm算法一点搞定就好,但实际坐下来感觉还真是个细致活。要想有好的效果,不仅要有SM算法,同样的,还需要有反走样算法和细致的参数调整来解决阴影最恶心的走样问题。反走样算法,我们使用的是constantbias + slope bias + normal map offset的方法,尤其是最后一项,基本上能解决80%以上的走样问题,当然即使如此,我们还是需要对不同用途的情景调整各种参数,这样才能保证效果。

      
  • 《无尽战区》渲染方案迭代分享
       时间有限,以上就是今天想分享的主要内容。当然达到好的效果,细节还不止这些。这儿提一下我的一个感触。贴图制作其实是一个大学问,一个好的材质,配合不适当的贴图,可能只会发挥出其20%的效果。我们以前效果一直很差,想想原因都是因为在沿用之前上一时代的制作思路来做的贴图,后来我跟TA合作亲自改了几次贴图,整个效果一下子就上来了,同时也反馈到我们后来的贴图制作流程中来。这也说明美术这边的技术运用是不能放任不管的,也许我们程序能保证事情做对,但是如何让美术做好,这件事情是需要程序和TA不断关注和跟进的。

      
关闭