|
如何评价Epic Games今日公布的虚幻引擎5?我们邀请到了我们的程序同事“蛋炒饭”谈一谈这个话题,希望他的回答能对大家有所帮助。
虚幻引擎5已经发布了一些时日,大家不仅惊艳于次世代的画面表现,同时也很好奇他们到底用了什么黑科技能支持到如此高的面数以及高质量的全局光照效果,这里我们就来总结和科普一下各个大佬们的猜测和提到的一些技术点。
Virtualized Geometry
Nanite是一个能够处理同屏数十亿三角面,并将模型以超高精度展示出来的一套系统。这套系统中最核心的技术官方称之为Virtualized Geometry,这个可以说是整个展示中最神秘的技术谜团了,因为此前大家都没听说过这么个概念。它使得展示出来的三角面分辨率能够直接达到像素级别,即每一个像素都有一个面,来看下像素级的三角面密度是个什么概念(密恐慎入)
也就是说未来不需要法线贴图这种Trick了,也没有LOD什么事了,顶点密度以屏幕能达到的最高精度怼给你,夫复何求!
这在业界引发了非常多的议论。最普遍的猜测是使用了Mesh Shader。
Mesh Shader
Mesh shader是NVidia在2018年提出的[1],目的就是为了解决具有大量三角形(数以千万计)的复杂模型遇到的瓶颈。结合GPU Driven pipeline的趋势,Mesh shader合并了原先Vertex shader、Hull Shader、Tessellation Shader等等复杂的顶点处理管线流程,并且打通了Computer Shader与图形主管线的通过系统内存交互的界限。使得新的管线流程对GPU Driven的开发无比友好。
下图是NVidia提出的Task Shader(可选) + Mesh Shader管线流程:
Mesh Shader处理的基本单元是Meshlet,即将模型拆分后的小模型。其中数据包含了VertexBuffer和IndexBuffer等。
这套管线还解决了旧管线两个瓶颈:
1. 原先Geometry阶段是按整个模型处理的,且必须按Index Buffer的顺序来处理。
2. 被遮蔽的顶点本可以被剔除掉的,但仍然被处理了。
UE5的Demo演示中表示“每一帧里的原始几何体三角面都超过十亿个,Nanite将他们无损压缩成大约2000万个三角面”。综合前述的Mesh Shader的一些优势,UE5是非常像是用到了Mesh Shader的。
但是仍然存在一个问题,那就是如何将十亿级别的三角面数据提供给GPU。按照一般情况估计,单个顶点需要8个以上的浮点数(空间坐标、纹理坐标、法线方向),每个浮点32位,意味着每个顶点需要32个字节,十亿级的顶点需要带宽大约是3.2G每帧,30帧率的情况下,约100GB/s。目前主机GPU带宽上限基本在400~500GB/s左右,也就是说每帧光传输数据就需要占到至少1/5的帧时长,显然是无法接受的,而Mesh Shader并不能解决这个问题。
Geometry Image
此前已经有回答:
https://www.zhihu.com/question/394668511/answer/1222159046
挖出了Brian Karis (负责Nanite的图形学技术大佬,也是Demo视频中左边的老哥)在2009年的一篇文章。现在看来可以说是Virtualized Geometry的最初思路了。其中非常明确的提到了他受到Geometry image这个idea的启发。
首先将几何体的顶点按照共形参数化映射到一张方形图片上,左边图片每个像素记录顶点的一个相对空间坐标,右边图片记录法向量方向。这样就可以通过两张贴图将模型完全重建出来。
我当初看到这个方案时也觉得非常妙,因为通过图像重建的模型顶点是可以达到像素级密度的,还可以套用当前各种图像压缩、Mipmaps、以及虚拟化技术等等业界成熟的方案。同时通过压缩,也可以解决十亿级别的顶点数据传输问题,减少了高模在硬盘的存储空间。Virtual Geometry Image也非常接近Virtualized Geometry这个命名。
但是我个人觉得,几何体的一些高频信息在转图像时可能会丢失,尤其在压缩或者滤波之后,在图像上不易察觉的信息丢失,在模型上可能就会非常明显。
而在14日Brian Karis承认了Geometry Image确实是他的最初的思路,不过现在已经远不是之前那个方案了。
Reyes Rendering
在Brian Karis 2009年的文章中还提到一个有意思的点:
“If the performance is there to have the two at the same resolution a new trick becomes available. Vertex density will match pixel density so all pixel work can be pushed to the vertex shader. This gets around the quad problem with tiny triangles. If you aren't familiar with this, all pixel processing on modern GPU's gets grouped into 2x2 quads. Unused pixels in the quad get processed anyways and thrown out. This means if you have many pixel size triangles your pixel performance will approach 1/4 the speed. If the processing is done in the vertex shader instead this problem goes away. At this point the pipeline is looking similar to Reyes.” 这里涉及到一个Quad Over-shading的概念。在现代GPU渲染流程中,一般会以2x2像素块作为最小渲染单元。因此当几何体的密度达到像素的分辨率级别时,对于亚像素的三角面的绘制,可能会额外计算3个像素,然后抛弃掉,导致极大的浪费。因此可以将PS的工作移到VS中,大幅提高计算效率。
这部分正是参考了Reyes渲染架构[2],Reyes Rendering是早期电影CG行业常用的离线渲染架构,与现代实时渲染管线不一样,他是将几何体进行分割和拆解,直到变成像素级的微多边形网格,然后再对每个微多边形网格的顶点计算灯光、颜色等等。然后再进行采样、光栅化,可见性检测等流程。
Reyes对于高密度的模型的渲染效率是极高的。极有可能Nanite参考或者引入了部分Reyes渲染的流程。
Software Rasterization
在DigitalFoundry的这篇报道里Brian提到UE5中使用了软光栅:
"The vast majority of triangles are software rasterised using hyper-optimised compute shaders specifically designed for the advantages we can exploit," explains Brian Karis. "As a result, we've been able to leave hardware rasterisers in the dust at this specific task. Software rasterisation is a core component of Nanite that allows it to achieve what it does. We can't beat hardware rasterisers in all cases though so we'll use hardware when we've determined it's the faster path. On PlayStation 5 we use primitive shaders for that path which is considerably faster than using the old pipeline we had before with vertex shaders." 这点非常有意思,因为软光栅在实时渲染领域已经很少有人使用了。但是在几何体顶点密度接近于像素分辨率的极端情况,硬件光栅化可能反而达不到软件光栅化的效率。极有可能Nanite抛弃了部分传统管线的流程,而是通过GPU管线软件重写了光栅化,与前述的Reyes管线相呼应。另外他们还使用了Primitive Shader达到比传统管线高得多的效率,而Primitive Shader正是AMD对标NVidia的Mesh Shader提出的设计。
综上所述,Virtualized Geometry有可能是这样一个流程:在预处理模型阶段,先通过Virtual Geometry Image等手段压缩模型,然后在绘制时,利用Primitive Shader或者Compute Shader进行类似于Reyes流程的重建模型、裁剪剔除、光栅化等工作。
Virtual Texture
UE5的Demo中经常会提到一个技术叫虚拟纹理Virtual Texture(又称Mega Texture)。虚拟纹理技术是John Carmack在id工作室提出的。基本思想就是将一张超大的纹理分割为多个小块,称之为Pages,然后再通过一个索引纹理——Indirection Texture,将某些当前需要用到的Pages,Runtime的存放到一张较小的物理纹理缓存上。Indirection Texture记录了不同Pages在物理纹理上的寻址偏移坐标。[3]
这种技术使得需要较大分辨率贴图的方案得以实施(例如大世界地表、Lightmap),通过只加载当前所需的纹理信息,可以显著降低所需的内存,提高纹理的精度。
UE4.23以来 Virtual Texture技术已经实用上。UE5的Demo中更是每个模型都用了8k的纹理,非常丧心病狂。
Virtual Shadow Map
在DigitalFoundary的文章中提到一个重要细节是虚拟阴影贴图。
"Really, the core method here, and the reason there is such a jump in shadow fidelity, is virtual shadow maps. This is basically virtual textures but for shadow maps. Nanite enables a number of things we simply couldn't do before, such as rendering into virtualised shadow maps very efficiently. We pick the resolution of the virtual shadow map for each pixel such that the texels are pixel-sized, so roughly one texel per pixel, and thus razor sharp shadows. This effectively gives us 16K shadow maps for every light in the demo where previously we'd use maybe 2K at most. High resolution is great, but we want physically plausible soft shadows, so we extended some of our previous work on denoising ray-traced shadows to filter shadow map shadows and give us those nice penumbras." 传统的Shadowmap流程实际上并不能展现出这么多的微阴影细节,UE5阴影可能是通过Ray Tracing来实现的,然后记录在这张16k x 16k的超大虚拟化Shadowmap上,达到像素级的阴影细节效果。
Dynamic Global Illumination
UE5展现出来另一个强大系统是Lumen,他允许几乎实时的全局间接光效果。并且UE5还专门提到,动态GI并不依赖于光追硬件设备。意味着UE5并不是NVidia RTX+AI Denoise那套硬件解决方案。在B站直播中王祢提到UE5的全局光照并不是一个单一的方案,而是一个"混合体",结合了几种方案的优缺点。再根据DigitalFoundary的那篇文章提供的一些细节:
"Lumen uses ray tracing to solve indirect lighting, but not triangle ray tracing," explains Daniel Wright, technical director of graphics at Epic. "Lumen traces rays against a scene representation consisting of signed distance fields, voxels and height fields. As a result, it requires no special ray tracing hardware." To achieve fully dynamic real-time GI, Lumen has a specific hierarchy. "Lumen uses a combination of different techniques to efficiently trace rays," continues Wright. "Screen-space traces handle tiny details, mesh signed distance field traces handle medium-scale light transfer and voxel traces handle large scale light transfer." Lumen uses a combination of techniques then: to cover bounce lighting from larger objects and surfaces, it does not trace triangles, but uses voxels instead, which are boxy representations of the scene's geometry. For medium-sized objects Lumen then traces against signed distance fields which are best described as another slightly simplified version of the scene geometry. And finally, the smallest details in the scene are traced in screen-space, much like the screen-space global illumination we saw demoed in Gears of War 5 on Xbox Series X. By utilising varying levels of detail for object size and utilising screen-space information for the most complex smaller detail, Lumen saves on GPU time when compared to hardware triangle ray tracing." 我们几乎可以确定,UE5根据物体的大小和远近分别使用了多种不同的GI方案。对于小物体或近景采用了SSGI(Screen-space GI),对于中物体或者中景采用了DFGI(Distance Field GI),对于大物体或者远景则采用了VXGI(Voxel-Based GI)。
Screen-space GI
这套方案相对其他的GI方案是比较廉价的,其基本思想是在屏幕空间进行RayTracing,类似于SSR(Screen Space Reflection)的算法。
Unigine采用这种方法做的GI有一个非常惊艳的展示视频:
https://www.zhihu.com/video/1247112853527580672
UE4.24也引入了SSGI方案。
这里也有一篇关于UE4的SSGI的实现
https://zhuanlan.zhihu.com/p/97886108
SSGI最大的问题就是无法捕捉到来自屏幕外的光照信息,在屏幕边缘附近可能会导致一些光照错误。
Distance Field GI
基本思想是先构建场景的距离场,然后通过Ray marching逐渐步进求交。
UE4在4.8的版本实现了DFGI,同时还实现了DFAO(Distance Field Ambiant Occlusion)和DFSS(Distance Field Soft Shadow),但是DFGI精度并不能够满足要求,很容易出现漏光和脏的问题,最后UE4用LPV(Light Propagation Volumes)的方案替代了。不过代码并没有删掉(具体可以看UE4中DistanceFieldGlobalIllumination.cpp相关代码),看来又在UE5中捡了起来…
LPV的表现
DFGI的表现[4]
VXGI
VXGI是NVidia推出的一套GI系统[5],做法就是将整个场景都替换成体素,然后把体素化的场景保存在三维数据结构中(一般是八叉树),然后把直接光照的光照信息写入这个三维数据结构中。然后再用Cone-Traced方法,进行间接光的反弹计算。
该方案同样加入了UE4全家桶:
NVIDIA VXGI in UE4 by Byzantos
https://www.zhihu.com/video/1247119871139278848
其中Cone-Traced是这套算法的核心。基本思想是通过将发散射线的积分空间近似为圆锥形。例如半球近似分割为多个独立的圆锥体:
然后每个圆锥体上单独计算Irradiance的积分,这里又会做一次近似,将圆锥体分割为多个Cube,这样对于八叉树的数据结构的计算会变得非常友好:
每个Cube再单独采集三维数据结构的光照信息。然后多个Cube累积起来,就能够近似获得整个Cone的积分结果。虽然做了比较多的近似,但是效果还是比较好的。
VXGI计算较慢,对于小物体可能会因为体素精度的限制导致RayTracing不精确。因此UE5能够将这些GI方案进行结合,扬长避短,是非常聪明的做法。
Streaming
视频最后有一段视野突进的演示,令人惊艳的是在快速移动中,几乎看不到任何LOD Crack和Popping。但这部分内容与其说是UE5做的好,不如说是索尼的软广……
PS5采用了全新的SSD技术和架构,自带硬件Oodle解压缩。极高的硬盘读取速度,使得游戏在运行时不需要担心IO导致的各种加载问题。这也让UE5Demo中快速运动时,资源能够迅速加载。Streaming真正达到无缝衔接。
不得不让人感叹索尼大法好!也许次世代游戏的表现上限不再是受制于浮点运算能力,而是硬盘带宽。从这一点上来说索尼PS5可能比微软XSX更准确地抓住了问题本质。
其他
关于Virtual Geometry,还有猜测用Displacement或者Tessellation的,但这些都被Brian否掉了。这些技术点就不一一列举了。有兴趣的可以自行查阅。
另外Demo视频中还有UE5的一些新功能,比如Niagara的粒子间通信、场景交互式动画、场景空间音效等等内容,也不一一细说了。
总结
目前来看还不能完全确定Virtualized Geometry的技术方案,很可能是基于Reyes Rendering、Geometry Image等技术衍生而来的方案。而GI的方案基本可以确定是用SSGI、DFGI、VXGI等混合的方案。具体的技术方案,还需要等UE5官方的Tech Report来揭晓。
[1] Introduction to Turing Mesh Shaders https://devblogs.nvidia.com/introduction-turing-mesh-shaders/
[2] Reyes Rendering https://en.wikipedia.org/wiki/Reyes_rendering
[3] Adaptive Virtual Texture Rendering in Far Cry 4 https://www.youtube.com/watch?v=SVPMhGteeuE
[4] Guide to Global Illumination https://forums.unrealengine.com/development-discussion/rendering/39098-guide-to-global-illumination
[5] NVida VXGI https://developer.nvidia.com/nvidia-vxgi |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
×
|