开源 Radeon ProRender

首次发布时间:

总结

在本篇博客文章中,我们将宣布 Radeon™ ProRender 渲染器的开源可用性,这是一个 Radeon™ ProRender API 的实现。我们将简要概述其功能,并提供一些关于渲染器内部的技术见解。

该项目最初是为了创建一个演示 AMD Radeon Rays 交叉引擎用法的示例应用程序。后来,它发展成为一个功能齐全的渲染引擎,面向图形研究人员、教育机构以及广大开源爱好者。它也是一个旨在供开发人员测试将 Radeon ProRender 集成到他们自己应用程序中的示例。

Radeon™ ProRender 是一个快速高效的基于 GPU 的全局光照渲染器,使用 OpenCL™ 实现,并依赖于 AMD 的 Radeon Rays 交叉引擎。它跨平台且独立于厂商。它对硬件的唯一要求是支持 OpenCL 1.2。Radeon ProRender 在所有厂商的硬件上都保持着高性能,但特别针对 AMD GPU 和 APU 进行了优化。

功能

请注意,Radeon ProRender 插件具有一些当前在开源 Radeon ProRender 包中不可用的功能。然而,Radeon ProRender 拥有强大的功能集,例如:

光传输

“科幻”场景由 Juan Carlos Silva (3drender.com) 提供。

Radeon ProRender 本质上是一个有偏见的路径追踪器,但它是高度可配置的,因此可以设置为进行光线追踪(一次采样多个光源)而不是纯路径追踪。双向路径追踪求解器的实现正在开发中。

几何体

“未来城市 4”场景,由 turbosquid.com 提供:https://www.turbosquid.com/FullPreview/Index.cfm/ID/1088714

为了保持高效率,Radeon ProRender 只支持三角形网格和实例。然而,通过 Radeon ProRender API,可以使用四边形。这是可能的,因为 API 层能够预先细分四边形并将三角形网格传递给 Radeon ProRender。三角形网格的大小仅受可用 GPU 内存的限制。通过重用几何数据和加速结构,可以使用实例来大大减小内存占用。

内部网格和实例使用 Shape 接口表示。如果通过 Radeon ProRender API 使用,网格和实例由 rpr_shape 不透明指针类型表示。

材质

“材质球”场景,由 Silicon Studios 提供。

Radeon ProRender 支持由以下构建块组成的复合材质:

  • 哑光 BRDF(朗伯体)
  • 微表面 BRDF(GGX 或 Beckmann 分布)
  • 理想反射 BRDF
  • 理想折射 BTDF
  • 微表面折射 BTDF(GGX 或 Beckmann 分布)
  • 透明 BTDF
  • 半透明 BTDF
  • 发射

这些构建块中的每一个都可以具有:

  • 内置菲涅尔因子
  • 法线贴图
  • 凹凸贴图

构建块使用以下混合模式之一组合在一起:

  • 混合 - 使用固定权重线性插值分量
  • 菲涅尔混合 - 使用取决于入射角的权重线性插值分量

材质可以使用 RGBA uint8、float16 或 float32 未压缩纹理用于反照率、权重和法线/凹凸贴图。

内部材质表示为 Material 类的子类:SingleBxdf 用于单个组件,MultiBxdf 用于复合材质。在 Radeon ProRender API 级别,它们由 rpr_material_node 不透明指针表示。请注意,并非所有 Radeon ProRender 材质都受当前开源 Radeon ProRender 支持(请参阅下面的部分)。

光源

BMW Blender Benchmark 模型,由 Mike Pan 提供。

Radeon ProRender 支持以下类型光源:

  • 点光源
  • 方向光
  • 聚光灯
  • 区域光(发射几何体)
  • 基于图像的环境光

所有光源在内部由 Light 接口的不同子类表示。如果通过 RPR API 使用,光源由 rpr_light 不透明指针表示。

采样

“Crytek Sponza”场景,由 Frank Meinl (Crytek) 提供。

Radeon ProRender 可以使用以下采样器之一来生成随机点/方向:

  • 随机采样器(效率较低,主要用于调试)
  • Sobol 准蒙特卡洛采样器
  • 相关多抖动采样器

此外,Radeon ProRender 使用多重重要性采样来减小直接和间接照明的方差。它还应用俄罗斯轮盘赌来终止低概率路径。

GPU 执行模型

Radeon™ ProRender 基于分核架构,以避免向量通用寄存器(VGPR)占用率瓶颈,并广泛使用 GPU 优化的并行图元来重构工作,使其更适合大规模并行 GPU 架构。首先,该渲染器设计用于渐进式预览,并且具有同步性。这意味着它有一个由用户在循环中调用的 Render() 函数,每次调用该函数都会向每个像素添加一个样本,从而细化图像。此模型允许控制延迟,并在渲染过程中操纵场景和相机。在 Render() 函数内部,每个 OpenCL 工作项被分配一个像素。随着迭代(反弹)的进行,存活的光线越来越少,因此 Render() 函数压缩工作以最小化 GPU 线程发散。

每次调用 Render() 会产生以下内核调用序列:

  1. 将初级光线发射到光线缓冲区
  2. 追踪光线缓冲区
  3. 应用潜在的体积散射事件(某些光线未命中在此处可能成为命中)
  4. 压缩稀疏命中缓冲区
  5. 计算体积材质
  6. 计算表面材质并生成光线样本和阴影射线
  7. 追踪阴影射线并添加贡献光线样本
  8. 对表面进行采样并生成扩展射线到射线缓冲区
  9. 转到步骤 2(如果未达到反弹限制)

性能

在延迟方面,该渲染器能够以高 FPS 进行渐进式渲染,用于中等大小的场景。例如,在以下“科幻”场景(77.5 万个三角形)上,Radeon ProRender 在 Radeon R9 Nano 显卡上以全高清分辨率产生 15 FPS。

在交叉性能方面,性能由底层的 Radeon Rays 引擎决定。以下是使用“科幻”场景在 Radeon R9 Fury X 显卡上的几个示例:

初级光线:7.73 亿条/秒 (2.68 毫秒)

次级光线:2.85 亿条/秒 (7.27 毫秒)

阴影射线:11.09 亿条/秒 (1.87 毫秒)

初级光线:4.70 亿条/秒 (4.42 毫秒)

次级光线:1.95 亿条/秒 (10.66 毫秒)

阴影射线:8.00 亿条/秒 (2.59 毫秒)

初级光线:5.62 亿条/秒 (3.69 毫秒)

次级光线:2.70 亿条/秒 (7.67 毫秒)

阴影射线:12.19 亿条/秒 (1.7 毫秒)

Radeon Pro Render API 支持

我们提供了 Radeon ProRender API 的开源实现。该实现仍处于早期开发阶段,因此内部 RadeonTM ProRender 核心中的许多功能在开源后端中不可用。以下是功能列表:

  • 完整的材质系统(目前仅支持基本 BRDF 及其混合,不支持程序节点和算术节点)
  • 体积效果(目前在 Radeon ProRender 中开发中)
  • IES 灯
  • 可见性标志
  • 置换和细分
  • 倾斜移轴相机
  • 焦外成像形状控制
  • 多个 UV
  • 后期处理
  • 分析天空系统

结论

在本篇博客文章中,我们介绍了一个新的开源物理渲染器以及基于它的 Radeon ProRender API 的开源实现。该渲染器完全开源、跨平台,并在各种硬件上展现出良好的性能。

GitHub 仓库

https://github.com/GPUOpen-LibrariesAndSDKs/RadeonProRender-Baikal

横幅图片由 The Pixelary 使用 Radeon ProRender for Blender 创建。

相关新闻和技术文章

© . This site is unofficial and not affiliated with AMD.