加入收藏 | 设为首页 | 会员中心 | 我要投稿 应用网_阳江站长网 (https://www.0662zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 网络游戏 > 网页游戏 > 正文

《荒野大镖客2》的大气云雾技术

发布时间:2020-03-26 23:15:58 所属栏目:网页游戏 来源:新浪游戏
导读:技术一直行业领先,但是一直低调的Rockstar,终于在SIGGRAPH 2019放了大,做了《荒野大镖客2》(大表哥2,Red Dead: Redemption II)中的大气云雾技术分享。 看得也是近几年最过瘾的一篇了,high点: 是发售游戏中实际使用的、完整的、系统化的技术合集

  可能有的读者对ray marching还不是特别熟悉,ray marching特别常用于volume类的渲染中,鉴于一些计算硬件和数据的限制,有些情况难以很容易的使用ray trace的方式寻找交点,比如local reflection中要对depth buffer找交点。那么就用步进的方式来找交点,这种方法就是ray marching;这里的步长的选择是应用ray marching的时候需要具体斟酌的地方。

《荒野大镖客2》的大气云雾技术

  回到《荒野大镖客2》,ray marching的步长策略选择也是颇费心思:

  考虑到场景深度、ground plane、cloud dome

  另外要仔细考虑到云层的厚度信息

  即便这样也很容易跳过比较薄的云层。

  ray marching优化

  先看下最终的性能

《荒野大镖客2》的大气云雾技术

  可以看到ray march是占据着性能的大头,而且这还是经过优化过之后的结果。

  这里优化就基于两个大的策略:low resolution + temperal,也就是在低分辨率上做ray march计算,然后通过多帧来重建。

  这个部分很精彩,我们多展开。

《荒野大镖客2》的大气云雾技术

  这里ray march的起点是在froxel的末端,带上blue noise(可以理解成一个频率较高的noise了,感兴趣可查下)做偏移。

  半分辨率大小,然后分4帧来计算。

  ray march reconstruct

《荒野大镖客2》的大气云雾技术

  由于是分4帧来构建,所以每帧只能ray march 2x2 像素中的一个,另外三个就要从history buffer中拿。

  这里用了temperal相关的很多做法,一些在taa中颇为常见。

  1、使用了3x3像素color aabb clamp的方式

  2、大的深度断裂的地方,临接像素就不考虑了

  3、在深度断裂(depth discrepancies)的地方,放更多的ray

  这里能正确的判定出来depth discrepancy还是比较棘手的,要做的事情就是在6x6(2x2 ray, 3x3 neighbouhood, 所以一共6x6)像素中,正确的识别depth的min/max;

  尝试1,uniform分布

《荒野大镖客2》的大气云雾技术

  可以看到在frame2里面,min/max就错了,这个会导致误判。

  尝试2,checker board方式

  能处理的case好很多:

《荒野大镖客2》的大气云雾技术

  但是这种情况下还是不行:

《荒野大镖客2》的大气云雾技术

  总之局部的分布策略总是有cover不住的情况了,还是要引入整体的信息才行。

  尝试3:checker board+depth neighborhood analysis

  先是拿到3x3tile(每个tile是2x2像素)的depth min/max,然后每一个tile中和其余的8个点比,如果其余的8个都是min,那么这个就取一个max depth的点。

  up scaling

《荒野大镖客2》的大气云雾技术 《荒野大镖客2》的大气云雾技术

  up scale这里是4taps dither,depth连续就平均,不连续就取最近

  效率

《荒野大镖客2》的大气云雾技术

  长的ray march部分是最消耗的。

《荒野大镖客2》的大气云雾技术

  scene integration

  第三部分,integration,也就是把计算好的光照等和场景集成起来。

《荒野大镖客2》的大气云雾技术

  这里是一个integration完整的示意图,我们接下来可以一步步看看。

  sky scattering

  sky scattering算法上是Precomputed Atmospheric Scattering,三个特点:

  考虑了earth shadow

  分帧实时更新的

  存放在32x16x32的LUT中

《荒野大镖客2》的大气云雾技术

  [ 用于sample sky scatter的深度信息 ]

  在sample sky scattering信息的时候,就不是ray march每一步都踩了,否则虽然更加正确,但是太费了。

  最终按照depth信息,就依据depth来sample一次。

《荒野大镖客2》的大气云雾技术

  [ visibility信息 ]

  然后visibility信息(类似shadow)信息都是分离的。

  放在一起的效果:

《荒野大镖客2》的大气云雾技术

  光照组成

  把前面列的放在这里:

  frustum volume lookup

  ray march result

  sky scattering / transmittance

  sky irradiance probe

《荒野大镖客2》的大气云雾技术

  地图里32x32的3rd order spherical harmonics probe map, 每个probe覆盖(256mx256m),这个用作sky irraidance probe。

  总结

  ppt本身的总结是有这么几条:

  volumetric效果是“一等公民”

  这是一个统一,基于物理,支持多种材质的scattering/transimitance系统

  近处是frustum align的volume based技术

  远处是ray march based的技术

  个人的阅读总结:除了第一篇的high点之外,有几点印象非常深刻

  对大量的渲染技术运用的如此纯熟灵活,非常给力

  能够hold住如此复杂的系统,非常给力

  研发的本原的样子

  一系列的笔记,可能是解读技术文章以来最多的一次了,笔记部分基本上是大家看了原文之后大致能记住的部分,实际上原文涵盖的内容要更多更杂,然后这背后还有更多的探索和尝试,因为篇幅的原因没有写出来。

  读的时候完全没法像一些论文,尤其是少项目而重理论和demo向的,可以简单的做抽象和总结,可以“一句话说清楚”。

  实际像《荒野大镖客2》这样的项目,这个就是研发中所面临的问题,理论掺杂着妥协与变通(hack),并且要覆盖极高的复杂度。

  实际做的时候,宏观的视野?是的;扎实的理论?是的;扎实的engineering?是的;充分的耐心?是的;灵活的变通?是的;

  像我个人之前做《天涯明月刀》《无限法则》相关的技术分享,ppt写的时候往往写得“重点突出”、“易听易懂”甚至还带着两个笑话;

  而实际上,做项目开发中,就是一个复杂度高的多,繁杂的多的过程,但是那么来写ppt,往往观众会听得云里雾里,所以最终的结果还是“一句话说清楚”。

  《荒野大镖客2》,分享者也足够耐心,列了方方面面,包括ray marching中优化的几个失败案例,确实更像研发原本的样子。

  来源:腾讯游戏学院

(编辑:应用网_阳江站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

推荐文章
    热点阅读