Last of Us的光照技术

最近一年异常的忙碌,博客更新就耽搁下来了,现在总算有时间了。还是继续保持每周一篇的分享吧。先来一篇SIGGRAPH2013中比较实用的,由Naughty Dog的二号工作室带来的Last of Us中用到的小技巧分享。这个游戏前不久也买了数字版,虽然也许是不喜欢打僵尸,个人觉得游戏性上不如Uncharted,但是画面还是非常漂亮的,技术和美术的结合非常好。

写一下最感兴趣的部分,解决光照图接缝问题的Trick

Last of Us也大量使用了预烘培光照图技术,并且也遇到一个经典问题,就是一个模型在3D空间连续的面,实际上在2D的UV空间里面是不连续的,这样烘培之后的光照图就会有硬边出现。
Photo & Video Sharing by SmugMug
解决办法出人意料的简单,虽然不是物理正确的,但是也足够了。就是在这种会被分离的三角形边上定义一系列的焊接点,由于需要的是让纹理空间中相同的焊接点位于不同位置的采样点的值相同,所以定义一个Error Function为

\(E_i=(C_{i0}-C_{i1})^2\)

接下来的工作就是如何让整个光照图中所有E最小化。用经典的最小二乘法即可,有很多现成的库可以用。比如这个Eigen。大致想了一下实现方法,因为我们现在的贴图平铺算法也是自己实现的,而大部分模型美术都是依赖工具自动平铺的,人工干预的并不多。所以这个焊接点的标记也可以在平铺算法中自动标记,这样集成这个算法到我们现在的GI烘培流程中并不太困难。以后也许还可以分享一下具体实现的效果。
Photo & Video Sharing by SmugMug
相同的思想也能用来减少3D LUT后期算法的量化误差,通过对PS中的图像和实际的IN-GAME图像使用最小二乘法修正用于后期处理的Volume Texture。可以保证IN-GAME效果和PS中差别不大。
Photo & Video Sharing by SmugMug
总结一下,光照图和静态烘培技术对提高画面品质作用非常大,但是必须要技术和美术的密切结合才能做到出效果,并且需要一套能够实现这些定制渲染算法的工具。虽然开发和维护成本很高,但是确实是衡量一个团队是否有自己的核心技术的标准。现在的通用引擎非常多了,像Unity3D之类的更是以极低的价格集成了大量的中间件。但是从另一个角度来说,能否用好这种引擎,还是要看团队的内功。建立自己的工具管线才是提高制作效率保证效果的王道。

Tags: , ,

2 comments

  1. 好久没来大牛的博客了,更新了不少内容啊,赞!

  2. 里边关于LM的处理跟这篇paper里边的优化算法有些类似:Least Squares Vertex Baking(最小二乘法也是挺有意思的);还有说到的Ambient Shadow效果蛮赞的,不知道fseraph兄有用上没?

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>