使用 Rust 进行本土渲染。在这篇文章中,Embark 软件工程师……| 作者:Tomasz Stachowiak | Embark Studios

我们的创意平台的渲染需求非常简单。在相对平淡的场景中,我们只需进行基本的视锥剔除,就能将几何图形推送到 GPU。得益于简单的材质系统,对象可以高效渲染,中间几乎无需进行状态切换。

然而,天下没有免费的午餐。简单的场景和简单的材料意味着在灯光方面承受着巨大的压力,以提供美观的图像。这就是我们创新的地方,也是我们集中精力管理复杂性的地方。

我们围绕代码驱动图构建了渲染器(渲染图),其中节点通常对应单个 图形计算, 或者 光线追踪 该图表高度专门化了延迟照明技术和后期处理的特点,为设置数据流、创建临时资源和跨帧传递信息提供了一个非常简单的界面。

让我们以运动模糊为例。典型的算法首先会扩大并降低每个像素速度矢量的分辨率。为了做到这一点,我们必须首先分配一个临时纹理来保存结果,然后在 GPU 上运行计算着色器。使用我们的渲染图,CPU 端的设置可以像下面的代码一样简单:

运动模糊算法中的渲染图使用

运行整个算法的代码并不比这复杂多少:再进行一次计算传递来降低垂直速度,然后进行第三次模糊处理。图形的编译器负责资源分配和重用、管理 Vulkan 细节,并自动提供分析和调试功能。

当我们不再关注渲染通道管道的底层细节时,我们可以专注于 GPU 方面的事情。也就是着色器。

得益于我们的 rust-gpu 项目,我们不仅能够在 CPU 上使用 Rust,还能对 GPU 进行编程。传统上,GPU 代码是用简化的着色(或计算)语言编写的。虽然这些语言各有优势,但现代 GPU 代码的精细度正在提高,高级语言功能开始变得重要。

我们也使用了一些 HLSL——它的编译速度更快,并且后端相当成熟,因此对于快速原型设计来说,它可能是更好的选择。另一方面,您无法普遍地将其与使用真实编程语言的好处进行权衡,因此我们的两个渲染器采取了不同的立场。实验性渲染器使用混合:Rust 用于稳定位,HLSL 用于正在积极处理的代码。生产渲染器重视稳定性、正确性和代码共享,因此几乎在所有地方都选择 rust-gpu。

使用 Rust 编写着色器在很多方面都给我们带来了好处。例如,我们可以通过常规模块和包以类型安全的方式在 CPU 和 GPU 代码之间共享函数和结构。我们还遇到过几种情况,着色器中的昂贵计算在整个渲染过程中都是恒定的,我们可以简单地在 CPU 上执行它,而无需重写或移植任何内容。

对 rust-gpu 着色器进行单元测试

我们能够做的另一件事是在 CPU 端对着色器进行单元测试。通常,测试 GPU 代码需要复杂的设置,并连接真实的显卡或在测试机器上进行模拟。由于着色器是常规的 Rust 代码,我们可以将它们作为我们通常的持续集成过程的一部分进行验证。

我们为所取得的成就感到自豪 rust-gpu 到目前为止,我们已经能够将它用作我们渲染堆栈的基础——特别是考虑到 GPU 编译器后端主要由我们团队中的两个人完成:Ashley Hauck 和 eddyb。

要构建成熟的编译器,并进一步完善 Rust 作为 GPU 编程的语言和生态系统,还有许多工作要做。事实上,我们正在寻找更多 编译工程师开源工程师 加入团队并提供帮助!

1719233728
#使用 #Rust #进行本土渲染在这篇文章中Embark #软件工程师 #作者Tomasz #Stachowiak #Embark #Studios
2024-06-24 11:05:18

Leave a Reply

Your email address will not be published. Required fields are marked *

近期新闻​

编辑精选​