欢迎来到夜之城,V
大家好,失踪人口小张回归了,失踪的这段日子里发生了一些事(比如我离开了 NVIDIA),这些事回头再聊。今天,乘着赛博朋克2077的热点还在,小张想先聊聊实时光线追踪(下文省略为 RTX)里的一个知识点——BVH 盒子(为了减少术语的数量,以下简称为盒子)。RTX 的开发风格特别硬核,英文缩写不胜可数,繁文缛节苦不堪言。脱离代码在中文的语境里聊,更是容易引起场面尴尬,这次小张先拿游戏里的夜之城场景作为切入点试试手,如果没崩,日后接着聊 SBT、RTPSO 等更硬核的知识点。
有部分读者是被我的标题吸引进来的,不懂图形没关系。这篇文章足够接地气,看完后你可能会爱上图形渲染。我想通过这篇文章传达的信息其实已经在标题里都写好了,正文的内容都是为了提供论点来支撑标题里抛出的观点,下面的内容你们看完忘记也没事,记住这个标题,尤其是前五个字。
大力出奇迹
真反射与假反射
赛博朋克 2077 是将 RTX 技术推广得最成功的一款游戏,水面、玻璃、金属,这些老黄发布会上最爱的视觉元素和谐地充斥在 赛博朋克 2077 的场景,即位于美国西海岸的夜之城(Night City)中。RTX 打破了传统绘制方式的局限性,即
绘制场景中某一个物体时,无法获得周围其他物体的信息。
为了绕开这个限制,机智的图形程序员们曾发明各种奇技淫巧来增加真实感。比如水面、金属表面常见的反射效果,在 RTX 的 真反射 出现前,游戏中普遍用的是 假反射 。假反射 通常基于屏幕上出现的颜色来近似反射,对于屏幕外的颜色值无能为力。
作为对比,我们看下 真反射 ,屏幕中下方的小水坑中能观察到屏幕以外的颜色值。
假反射 看不到是因为传统方式无法访问周围场景,真反射 能看到则是因为它可以访问。在 RTX 中访问周围场景的是一束束光线,光线与场景中海量三角形的相交是个非常耗时的操作。在讨论 2077 中的场景前,我们先虚构一个简单场景来帮助理解光线和场景的关系,这个场景里只有两面格子墙、一盏灯和一个灰色的光滑小球。光线打到光滑的球面后并没有停止,而是继续弹射多次(次数越多画面越卡),弹射过程中周围场景表面的颜色值都会影响小球表面的颜色值。通过光线的弹射来获取周围场景的颜色值,便是 真反射 的核心。
回到 赛博朋克 2077,小张的 RTX 2080 Super 在打开光追后显存依然不够用,按照小张在老东家折腾各种 RTX 应用的经历来看,开发商 CDPR 采用了非常暴力的方式来保存场景。到底有多暴力?让小张掏出工具箱来看看它。
你看这个盒子,它又大又方
小张从工具箱里选出三个工具:
- RenderDoc 失败了,它不支持 RTX 游戏。
- 微软的 PIX 也失败了,它不支持从 Steam 启动的游戏。
- 老东家 NVIDIA 的 Nsight Graphics,成了! 有一定几率游戏会挂,但是可行。
经历了若干次游戏奔溃后,小张成功捕获到一坨坨的盒子。
整个场景可以认为是 大盒子 (Nsight 的界面里没有把盒子的边框画出来,请大家脑补下), 大盒子 里有通过颜色区分的 小盒子 ,每个 小盒子 里有很多的三角形。前文提到的光线与场景中海量三角形的相交在 N 卡上分为两步:
- 光线与 小盒子 求交
- 如果有交点,再与 小盒子 里的三角形们求交
第一眼看到这个场景的时候小张并不相信自己的眼睛,夜之城这么大,怎么能一股脑地都塞进一个 大盒子 呢?这优化做得太糟糕了吧?(好吧,CDPR 的优化做得的确很糟糕……)
我们先把盒子边框关掉。
再从官网上下载夜之城的地图。
进行比对,没错, 大盒子 和官方地图完美匹配。看来开发商 CDPR 的确采用了非常暴力的方式来处理 RTX 中的场景。这样做的优点是不需要随着玩家的移动而更新 大盒子 和 小盒子 的信息,缺点则是非常耗显存。下面就是查看细节的程度了。
我们将镜头拉近,画面中是海伍德、 圣多明哥 及 太平洲。
再拉近,中心位置的围墙分隔着海伍德和太平洲。
继续拉近,太平洲已从画面中消失。
现在可以看清海伍德的建筑顶了,两个三角形组成一个建筑顶。
继续拉近,在这个距离可以直观地感受到用于 RTX 的三角形模型的粗糙程度。
小结下
我希望通过这篇文章传递的信息有:
- 我复工了,别取关。
- RTX 的核心思想是光线与三角形求交,简单,暴力。
- 三角形放在 BVH 盒子 里。
- 赛博朋克 2077 用一个巨大无比的 BVH 盒子 包住了整个夜之城的场景。
vinjn.com - Democratizing Visual Computing