GPU 光栅化技术综述
概述
在虚拟场景中,物体有不同的表达方式,如以离散或可微形式。以图元(如三角形片面)为单位的离散表达,为如今最常用的表达,而光栅化则是将这种3D表达转换为2D屏幕内容的一种手段。随着时间和需求发展,虚拟场景的物体越发复杂,其中所包含的图元在急剧攀升,为高效率的光栅化带来挑战,为此光栅化被固化为现代GPU的一个重要组件,而 DirectX, OpenGL, Vulkan 等图形 API 则为使用它的重要接口。除了效率,管线的设计非常重要,其灵活度一方面也决定了上层软件设计的表达能力。

Figure 1: Rasterization[1]
发展
功能
早期的光栅化管线为不可编程式的固化功能,即给定一定格式的输入,其返回固定格式输出的形式,对图形表达能力有较大幅度的限制,后来的可编程管线的引入大幅提高了管线的灵活度,如顶点,几何,像素等着色器,从而提高了渲染的表现能力。但这同时也将光栅化管线切分的越来越细,且越来越复杂,每个阶段都存在一些约束,这也在不断提高用户使用的门槛。从 GPU 光栅化的起因来看,其本身是为了解决效率问题,在算力和架构的不断提升和优化之后,能否减少固化功能,提高通用性,重新使其化繁为简,或是提出更为灵活的结构一直是一个重要的话题。如Mesh Shader的提出,重新整合了顶点,细分,几何着色器的能力,功能上基本向通用计算着色器靠拢,一方面简化了管线,一方面也提高了其灵活性,用户能够自定义输入数据,从而支持自定义几何数据压缩等[4]。当然,其与图形 API 以及 3D 软件的底层实现是高度耦合的,而它们的实现都是比较复杂的,这会成为相关技术迭代的一个阻力。

Figure 2: Graphic Pipeline[2]
性能
一方面GPU固化的光栅化管线针对通用设计的,如通常面向较大的图元,而在不同粒度的图元,通常理论上所占用的算力不同,这导致其需要思考一个折中的方法,能够统一的处理所有样例,这可能也导致在某些情况下容易出现低效的表现,如密集的像素级的图元,由于功能设计上的让步,使其通常容易导致 OverDraw,或者说产生多余像素,而 UE5 中 Nanite 所使用软光栅的部分优势也来源于此。这也迫使我们思考,是否需要改变如今管线的设计,解决如今存在的问题,或是将编程能力转交到用户手里。另一方面,由于渲染本身所依赖的数据量较大,有限的资源经常也会成为性能瓶颈的因素,因此对多种资源的合理调度,变得异常重要。实际场景中,计算单元往往难以达到完全利用,那么如何在保证功能正确的情况下,提高计算单元占用率,即算力利用率,也是重要的话题。

Figure 3: OverShading as scene triangles size shrinks[3]
其它
除了离散表达,近两年来Nerf等非离散的表达技术的发展,也让我们需要思考,其将来是否足够承担场景表达的任务,是否能够替代离散化表达,同时是否能够提供足够快且灵活的渲染结果,或是提供一个新的表达场景的思路。

Figure 4: Nerf[5]
引用
[1] https://cg.informatik.uni-freiburg.de/course_notes/graphics_05_rasterization.pdf
[2] Graphics Compendium | Overview
[3] https://graphics.stanford.edu/papers/fragmerging/shade_sig10.pdf
[4] Mesh Shader | DirectX-Specs
[5] https://arxiv.org/pdf/2003.08934