两个诅咒降临渲染工程师。首先,我们失去了看待现实的能力,而没有不断地提醒人们解决光传输和模型材料的难易程度。
其次,当您开始玩任何游戏时,您都不能避免尝试颠倒其渲染技术(对于多人游戏而言,这尤其令人生气-停止向我射击,我就在这里看着石头如何投射阴影!)。
因此,当我购买《赛博朋克2077》时,我不得不研究一下它如何渲染框架。用RenderDoc捕获它非常简单,所以我真的没有任何借口。
以下是有关其渲染技术的推测,在掠过捕获并玩了几个小时的观察结果。
这绝不是对逆向工程的认真尝试。为此,我缺乏时间和才华。我还通过以下借口合理化了做不好的事情:这样实际上更好。
我认为最好是从外部来源(在这种情况下,是RenderDoc捕获)中获得某种程度的灵感,然后再幻想渲染(或任何东西)的真实状态,而不是确切地知道发生了什么。
如果我们知道,我们就不再有神秘感。这是我们不知道的,这使我们思考,有时我们确切地猜测正在发生什么,但是有时候我们做得更好,我们会产生新的幻觉...不是那么美妙?
以下内容主要是对单个捕获的通读。我确实打开了第二个,试图填补一些空白,但是到目前为止,仅此而已。
我在没有RTX或DLSS的情况下在高设置下进行了捕获,因为RenderDoc不允许这样做(还可以吗?)。我禁用了Motionblur和其他无用的post-fx,并确保我在所有捕获中都移动了,以便能够更好地告知传递过去访问前一帧数据的时间。
我也不依赖内部信息。使一切变得更加轻松有趣。
一目了然,很快就可以描述Cyberpunk 2077渲染的核心。它是经典的延迟渲染器,具有相当不错的g缓冲区布局。我们看不到Suckerpunch的PS4推出了Infamous:Second Son之类的疯狂缓冲区,也没有看到复杂的位打包和通道重新解释。
10.10.10.2反照率。还不清楚Alpha在这里做什么,它似乎只是为所有绘制的内容设置为一个,但可能仅仅是我得到的捕获
Z缓冲区和模具。后者似乎隔离了对象/材料类型。移动对象被标记。皮肤。汽车。植被。头发。道路。很难说出来/需要花费时间来识别每个位的含义,但是要点...
如果我们按时间顺序查看框架,则从一堆UI绘制(我没有进一步研究)开始,从CPU缓冲区到VS常数的一堆副本,然后是阴影映射更新(稍后将对此进行详细介绍) ,最后进行深度预传。
此深度预传递是局部的(不绘制整个场景),仅用于减少后续g缓冲区传递中的透支。
基本上,所有几何图形绘制都使用实例化和某种形式的无绑定纹理。我想这是将引擎从The Witcher 3更新为现代硬件的重要组成部分。
不幸的是,Bindless也使查看renderDoc中的捕获变得很烦人-通过抽查,我在g缓冲区传递中看不到太多不同的着色器-也许这是不允许艺术家通过视觉图形制作着色器的信号吗?
其他大胆的猜测:我看不到g缓冲区中的任何从前到后的排序,并且深度预传递呈现了各种几何形状,而不仅仅是壁,因此似乎没有针对这些的特殊创作(画笔,形成BSP)-艺术家也没有为手动过关设计的带有手动标签的对象,因为有些相对较差的"封堵器使削减。我想象在剔除对象列表之后,将按着色器对对象进行排序,然后在CPU上动态形成实例化的绘制。
开场白没有提到Umbra(在《巫师3》中使用过),因此我想CDPr推出了自己的可视性解决方案。由于可见性是GPU / CPU平衡的问题,因此它的有效性确实很难评估,但是对于价值多少,似乎有很多平局对图像没有贡献。看起来有时渲染可以显示" hidden"房间,所以它看起来不是一个单元格和门户系统-我猜想对于如此大的世界,要求艺术家做大量的手工工作以提高知名度是不切实际的。最后,我没有看到在GPU端进行任何剔除,包括深度金字塔等,没有按三角形或簇剔除或谓词绘制,因此我猜所有平截头体和遮挡剔除都是在CPU端进行的。
注意:人们在问&" bad"剔除是当前性能问题的原因,我想这对ps4 / xb1有意义。无法进行这种推断,也不能将可见性系统称为" bad" -正如我已经写的。 FWIW-在大多数情况下,控制台在内存和流媒体方面的挣扎比其他任何事情都多。谁知道...
让我们继续...在主要的g缓冲区传递之后(似乎总是一分为二-不知道是否存在渲染原因,或者也许这是在不同线程上完成的两个命令缓冲区),还有其他用于移动对象的通道(写入运动矢量-首先通过摄像机运动初始化运动矢量缓冲区)。
此阶段包括化身,并且这些对象的着色器不使用无边界(也许仅用于世界几何)-因此,如果需要,可以更容易地看到那里发生了什么至。
最后,我们完成了主要的g缓冲区传递,深度写入已关闭,并且贴花有最后传递。令人惊讶的是,它们很漂亮。同样,它们大多数是网状贴花。
贴图也将深度模板绑定为输入,很难分辨是否读取深度部分,模板或两者,但是由于大多数贴图是基于网格的,因此不需要深度,所以让我们猜测模板是这里使用了什么...
看起来只有使用特殊贴花网格渲染了带有贴花的三角形,但除此之外,其他一切都非常简单。在贴图传递的末尾,我们有时还会看到投影的贴图,我没有研究过由武器创建的动态贴图,但是在关卡上的静态贴图只是在几何体周围使用了紧密的盒子,我想是手工制作的,没有任何模版标记技术(在这种情况下可能无济于事)来尝试最小化阴影像素。
至于主要的g缓冲区平局,很多贴花可能最终对图像完全没有贡献,我看不到有很多证据表明进行了贴花剔除(因为一些微小的平局是平局),但它也可能取决于我选择的设置。
g缓冲区传递非常重,最终结果非常出色。例如。看正常,一切都有图案,一般来说,细节频率很高。
注意正常缓冲区中的斑点。这些可能是最适合常规编码的伪像,因为它们似乎没有映射到最终图像中的斑点。
显然,没有任何延迟的渲染分析可以在g缓冲区处停止,我们将阴影一分为二,现在我们要看一下下半部分,照明是如何完成的。
在这里,事情变得有些杂乱无章,因为在现代的计算着色器中,一切都被打包到了我们不容易看到的结构中。当纹理不携带连续数据而是将谁知道的内容打包为整数时,甚至很难读取。
无论如何,很显然,在说完所有深度/ g缓冲区工作之后,就需要进行超级摘要传递来处理一堆与深度有关的东西。它首先使用Crytek基于查找的最佳拟合法向编码将法线和粗糙度打包到RGBA8中,然后创建深度值的最小-最大mip金字塔。
金字塔然后用于为群集照明创建看起来像体积纹理的外观。
所以-从我所看到的来看,它看起来像一个群集的延迟照明系统。群集在屏幕空间(像素)中似乎是32x32像素,带有64个z切片。虽然照明似乎是通过16x16的图块粒度完成的,但全部都是通过计算着色器间接调度完成的。
我敢说这是因为CS通过瓷砖中存在的材料和灯光进行专业化处理,然后进行相应的调度-这是当代延迟渲染系统中的常见设置(例如,请参见“使命召唤:黑色行动3”和“神秘海域4”主题演讲) 。
解析光照通过输出两个RGBA16缓冲区,这似乎是漫反射和镜面反射的贡献。关于场景灯的选项,如果我们只有点/点/球面灯和线/胶囊灯,我不会感到惊讶。赛博朋克的大多数灯光都是霓虹灯,因此绝对需要线灯支持。
您还会注意到很多光线都没有阴影,而且我不认为我曾经在单个对象/化身下看到多个阴影。我确定引擎在这方面没有任何限制,但是所有这些都指向大量的灯光。与艺术家一起精心放置阴影投射灯。如果灯已经手动分配了边界体积以避免泄漏,我也不会感到惊讶。
照明第2部分:阴影但是,我们所看到的并不意味着在《赛博朋克2077》中阴影并不复杂,相反,绝对有很多技巧可以运用,其中绝大部分都不容易逆转!
首先,在深度预先通过之前,总是会有很多绘制成类似阴影贴图的图形。我怀疑这是CSM,但是在我看过的捕获中,我从未见过使用过的捕获,只是渲染了。这是否指向一个可以在许多帧上更新阴影贴图的系统,可能仅使用静态对象?
这些多帧效果很难捕获,因此我不能说是否还有其他缓存系统(例如,请参阅《黑色行动3》的四叉树压缩阴影)。
一件有趣的事是,如果您在关卡中行驶得足够快(例如,在汽车中),您会发现阴影需要一些时间来“赶上”。并且它们以独特的方式逐渐消失。从太阳角度看,似乎几乎应用了深度偏移,随着时间的推移,深度偏移会减少。有趣!
我将在照明计算通过之前将太阳阴影预先解析到屏幕空间缓冲区中,我想可以简化计算着色器并获得更高的占用率。该缓冲区是通过绑定许多纹理的遍历生成的,其中两个看上去类似于CSM。一个显然是CSM,在我的情况下,在纹理数组中有五个条目,其中切片0到3是不同的级联,但是从切片角度来看,最后一个切片似乎与切片0相同的级联。如果有人愿意做这项工作,肯定会有很多逆向工程!
场景中的所有其他阴影都是某种形式的VSM,会随着时间的推移再次递增地计算。我已经看到使用了512x512和256x256,并且在我的捕获中,我可以看到每帧渲染了五个阴影贴图,但是我猜测这取决于设置。其中大多数似乎仅作为渲染目标绑定,因此再次可能是需要多个帧才能完成渲染。一个被模糊化(VSM)到纹理阵列的一个切片中-我已经看到一些切片包含10个切片,另一些切片包含20个切片。最后,我们有了游戏设置所称的“接触阴影”。 -是屏幕空间的短距离射线网格阴影。这些似乎是由照明计算着色器本身计算出来的,因为这些人知道有关灯光及其方向的知识,这才有意义。总的来说,阴影既简单又复杂。带有CSM,VSM和可选的光线行进的设置并不令人感到意外,但是我确信魔鬼的细节在于如何生成和淡入所有这些细节。很少见到明显的工件,因此整个系统必须受到称赞,尤其是在开放世界的游戏中!
自从首次启动游戏以来,我有一种明显的感觉,即大多数照明实际上都不是以分析照明的形式出现的-实际上,从捕捉的角度来看,这似乎并非没有根据。同时,没有光照贴图,我怀疑是否有任何预先烘焙的东西。这也许是渲染中最迷人的部分之一。
首先,有一个很好的半分辨率SSAO通行证。这是在前面提到的uber-depth-summary传递之后立即计算的,它使用打包的RGBA8正常粗糙度而不是g缓冲区。它看起来像是在计算弯曲的法线和光圈圆锥体-不能说出确切的技术,但它确实做得很好,可能与HBAO-GTAO相似。首先,深度,法线/粗糙度和运动矢量都被下采样到半分辨率。然后,通过计算当前帧的AO,随后的一次进行双边滤波和时间重投影。如果我不得不猜测,抖动模式也很规则,也许是豪尔赫(Jorge)的梯度噪声?
很容易猜到,从照明通道发出的单独的漫反射镜面使它更容易更正确地用视锥信息遮挡两者。
其次,我们必须考虑间接照明。轻聚类通过之后,将进行一堆绘制,以更新似乎是球形(或双抛物面形?)未包裹探针的纹理阵列。同样,这是跨帧分布的,并不是每个帧都更新此数组的所有切片。在捕获中不难看出,探针阵列的某些部分已被新探针更新,这些探针是在动态Mipmap上生成的,大概是GGX预过滤的。虽然很难找到探测数据的来源,但是在我使用的主要捕获中,似乎有些东西看起来像是在反射镜面反射的立方图,对于我来说,这不是很明显与阵列中的探针或阵列数据源不同的探针。
另外,很难说这些探针是否是手动放置在水平仪上的,如果重新照明的假设是正确的,那么我会想象这些位置是固定的,也许艺术家将体积或平面放置在定义每个探针的影响区域/避免泄漏。
我们有您的" standard"体积照明,以3d纹理计算,具有两个时间重投影。光线行进是使用场景深度进行钳位的,大概是为了节省性能,但这反过来有时会导致泄漏和重新投影伪影。虽然在大多数情况下不太明显。现在,事情再次变得非常有趣。首先,我们有一个了不起的“屏幕空间反射”通道,它再次使用压缩的法线/粗糙度缓冲区,因此支持模糊反射,并且至少在我的渲染设置下以全分辨率完成。
在UI合成进行反射之前(使用运动矢量进行重新投影),它使用前一帧的颜色数据。即使它使用蓝噪声纹理来抖动,它还是有很多噪音!
然后是间接的扩散/环境GI。绑定g缓冲区和一堆难以解码的64x64x64卷纹理。从输入和输出中,您可以推测出该体积是在相机周围居中并包含某种计算辐照度的索引,例如球形谐波等。光照非常柔和/低频,在此过程中间接阴影并不真正可见。这甚至可以通过动态GI实现!
当然是体积的,它的优点是“均匀”。跨越所有对象(无论是否移动),这种连贯性在最终游戏中得以体现。
最后,所有东西组合在一起:镜面探头,SSR,SSAO,漫射GI和分析照明。这一遍再次发出两个缓冲区,一个似乎是最终照明,而另一个则只是镜面反射。在这里,我们可以看到我一开始所说的话。大多数照明不是来自分析灯!我们看不到交易的惯用技巧,因为大量的交易填补了交易中的空白。由艺术家添加的灯光(尽管灯光设计绝对是非常谨慎的),相反,间接照明是构成场景的主要部分。这种间接照明效果不及“精确”。作为更依赖GI烘焙和复杂编码的引擎,但它非常统一,并通过两个非常高质量的屏幕空间通道(AO和反射通道)获得了高频效果。
屏幕空间通道非常嘈杂,这反过来又使时间重影变得非常重要,这是此引擎另一个非常有趣的方面。传统观点认为,重投影在具有很多透明表面的游戏中不起作用。赛博朋克的科幻世界绝对有资格满足此要求,但是这里的工程师们没有得到消息,反正一切正常!
是的,有时可能会看到重投影伪像,并且整个阴影可能会有一些“游泳”的现象。在运动中,但总的来说,它具有连贯的,连贯的特质,甚至许多使用光照贴图的引擎也无法声称具有。漏光并不常见,轮廓通常阴影良好,遮挡适当。
为了简洁并保持理智,我们将不介绍引擎中的许多其他影响。头发非常有趣,看起来可以渲染多个深度切片,并将自身部分注入g缓冲区中,并具有一些预照明和怪异的法线(假各向异性)效果。半透明/皮肤阴影无疑是我不会剖析的另一个重要效果。
在框架结束之前,我们必须提到透明胶片-肯定会在这里进行更多的魔术操作。首先,我认为有一张通行证似乎可以计算出光明图表,我认为对于所有透明胶片,不仅是粒子。
Glass可以模糊其背后的任何内容,这需要通过专门的遍历才能完成,首先在缓冲区中渲染透明的几何体,以累积模糊量,然后一系列计算着色器最终创建三个mips屏幕,最后将所有内容合成回到现场。
在“玻璃模糊”之后,使用图表中计算的照明信息再次将透明胶片与粒子一起渲染。至少在我的渲染设置下,此处的所有操作均以全分辨率完成。最后,全能的时间投影。我真的很想看看没有此功能的游戏,时间重投影前后的差异非常惊人。发生了某种膨胀的面具魔术,但是老实说,我看不到任何奇怪的事情在发生,这真是令人惊讶。也许有一些非常复杂的秘密配方潜伏在着色器中某处,或者超出了我理解捕捉的能力。
我最后写了因为我不会进一步看,即后效果堆栈的细节,所以这里的内容并不令人惊讶。当然,Bloom占了很大一部分,几乎增加了另一层间接照明,它是预期中的,稳定且宽广的顶级产品。景深,当然是色调映射和自动曝光...当然,您可能希望并且可能要禁用所有的图像退化修正:胶片颗粒,镜头光晕,运动模糊,色差...甚至UI合成也不是一件容易的事,所有事情都是在计算上完成的,但是谁有时间...既然我已经掌握了所有这些知识,那么我终于可以尝试玩游戏了!再见!