英特尔® Open Image Denoise 库有助于节省时间,提高质量

在使用光线跟踪增强真实性与沉浸感时,游戏开发人员面临复杂的权衡。渲染可能耗费数小时,才能完全融合成高质量图像。因此,在许多情况下使用降噪方法,以显著缩短融合时间。降噪滤波器可以降低噪声,改善图像质量,但是开发高质量、高性能降噪滤波器难度很大,并且需要该领域的专业知识。为了克服这些挑战,英特尔创建了使用光线跟踪进行图像渲染的一整套解决方案,包含高性能开源滤波器。该解决方案已发布测试版,被集成至 Unity* 游戏开发引擎。在本白皮书中,我们将讨论降噪,介绍英特尔解决方案并展示其如何帮助开发人员增加游戏的复杂性并改善图像质量。

全新降噪库

英特尔® Open Image Denoise 是英特尔® 渲染框架中的一个开源库,基于 Apache* 2.0 许可证发布。它的目标是为开发人员提供可显著缩短渲染时间的开源高质量解决方案。其原理是滤除光线跟踪方法(如路径追踪)中常见的 Monte Carlo 噪声。

库:

  • 帮助降低每像素必要的样本数量
  • 整了合灵活的 C/C++ 应用编程接口 (API)
  • 包含广泛的文档
  • 可以轻松集成至大多数渲染解决方案中。

David Bookout 在一篇英特尔文章中提及,光线跟踪“是一种渲染技术,通过将光线路径作为图像平面中的像素进行跟踪,从而生成图像,然后模拟这些路线与各种对象相交的效果。效果非常震撼,但是计算要求极高。”

英特尔图形软件工程师 Attila Áfra 表示,图像噪声通常由计算限制引起。Áfra 拥有计算机科学博士学位,是基于光线跟踪的渲染方面的专家。他帮助英特尔开发专门用于解决视觉和渲染问题的开源库。他加入了 英特尔® Embree 光线跟踪库和英特尔® OSPRay 项目,这是一个高保真视觉库,目前专门用于英特尔 Open Image Denoise 库。

rendered at 64 samples per pixel
图 1.原始 Amazon Lumberyard Bistro 图像,以每像素 64 个样本 (spp) 进行渲染。请注意窗户上的噪声及其粒状外观。(使用滑动器显示本文中的图像,以比较原始效果和降噪效果之间的差异,图像位于 Open Image Denoise 图库。)

Denoised image with less noise in the windows
图 2.降噪图像,窗户上的噪声更少,整体外观更清晰。

Áfra 表示:“大多数光线跟踪算法为随机算法,这意味着您实际上使用随机数,这使得成生成图像中出现噪声。”渲染越多,收集的样本越多,噪声越少。理论上,如果有充足的时间和计算能力,图像将融合为地面真值,噪声被消除。

但是,完整的降噪成本高昂,会消耗大量时间和计算能力。Áfra 表示:“您需要离线运行,因为创建完全融合图像会占用太多时间。”

光照贴图加快渲染速度

获得逼真效果的一个捷径是在图像中映射从表面反射的光线。光照贴图不是最终图像,但是可以用于加速渲染。

Áfra 解释称:“这就是在游戏中使用光照贴图的原因。在当前的硬件上,大多数真实示例不可能实时创建融合的光线跟踪图像。因此,一种选择是预计算不依赖任何视图的光照贴图。”这些贴图表示几何和光线,开发人员可以实时渲染光照贴图,因为它们经过了预计算。随后,额外的效果可以增强图像质量。Áfra 指出,Unity、Unreal* 游戏引擎等解决方案使用预计算光照贴图。

另一种选择是使用降噪解决方案消除噪声,不渲染完全融合图像。但是,这种解决方案仍可能导致伪影,某些算法需要大量计算来生成近乎完美的图像(被称作“地面真值”)。Áfra 提醒道:“取决于您使用的降噪算法的质量优劣,耗时可能会很长。”此外,大多数商用降噪库是专有库,对硬件有限制或针对一个渲染解决方案。

Áfra 表示实施高质量降噪算法既困难又费时,并且大多数开发人员没有亲自实施的时间。这就是为什么 Áfra 目前的工作如此重要。

运行英特尔 Open Image Denoise 库的大多数 CPU 是在过去 10 年内生产的。由于它是开源库,用户可以扩展代码并且在需要时修改代码。用户还会受益于大型社区,全心投入的开发人员在这里分享见解、进展和错误报告。随着库的成熟,大多数优势将突显。

Áfra 表示:“无论是离线还是实时运行光线跟踪,您都需要通过降噪来提升性能。无论您的用途和时间限制如何,降噪技术使光线跟踪更切实可行。”

与 Unity* 2019.2 集成

在 GDC 2019,英特尔和 Unity 工程师将提供有关将英特尔 Open Image Denoise 库整合至 Unity* 2019.2 游戏引擎的信息。开发人员将了解该库如何使用人工智能 (AI) 降噪器大幅缩短光照贴图渲染的融合时间,从而显著提升双向模糊的保真度。我们还将讨论使用英特尔 Open Image Denoise 进行通用图像降噪的其他可能性。

Áfra 解释道,在编辑器层面将库实施于 Unity。使用高效的降噪库能够大幅降低生成融合光照贴图的时间,这将彻底改变开发人员生成素材的方式。当设计人员编辑游戏关卡时,需要重复检查光照。他们进行最终烘焙,以实现最高质量。根据设置的不同,烘焙单个关卡需要数小时甚至数天时间;这将破坏交互式工作流。全新降噪库可显著降低烘焙时间。

Rendered at 16  s p p, with grainy masonry and shadows
图 3.Dubrovnik 中的 Atrium Sponza Palace(由 Crytek* 的 Frank Meinl 重新建模;灵感来源于 Marko Dabrovic 的原始图像),以 16 spp 进行渲染,石块和阴影部分呈粒状。

Denoised image, with cleaner appearance
图 4.降噪图像,外观更清晰。(更多降噪示例详见英特尔® Open Image Denoise

经过充分训练的 AI

英特尔 Open Image Denoise 库的核心是基于深度学习的降噪滤波器。该滤波器经过专门训练,可处理从每像素 1 个样本 (spp) 到几乎完全融合的广泛设置。因此,它适合预览和最终帧渲染。

Áfra 团队使用人工智能来应对降低噪声以及改善图像效果的挑战。之前的员工使用人工智能降噪进行光线跟踪。在高质量和卓越性能方面,人工智能降噪是目前最先进的。

英特尔团队使用图像对训练人工智能,图像对包括一个噪声图像和一个是无噪声的完全融合图像。它可以从开发人员提供的示例中收集信息,并根据该信息学习如何进行图像降噪。英特尔 Open Image Denoise 库提供该团队开发的一个人工智能网络,该网络经过充分训练,可处理光线跟踪图像。人工智能可以为各种用例、噪声级别、主题设置和光照设置找到合适的解决方案,不必费力输入其他参数。

滤波器可以仅使用噪声颜色 (“beauty”) 缓冲区对图像进行降噪,或者保留尽可能多的细节。它可以利用 “albedo”、“normal” 等辅助缓冲区。大多数渲染器均支持作为任意输出变量 (AOV) 的此类缓冲区,或者轻松地实施后者。

通过使用英特尔 Open Image Denoise 库缩短渲染时间,开发人员可以将精力用在提高着色复杂性和改善图形质量上。之前,开发人员可能在提高场景或关卡复杂性方面有所迟疑,因为渲染可能持续数天。这个全新的解决方案允许他们充分发挥创造力,提高游戏的复杂性,以达到视觉的极限。

该功能支持基于英特尔® 64 位架构的 CPU 和兼容架构,并自动利用英特尔 SSE4、AVX2、AVX-512 等指令集。它在笔记本电脑、工作站和高性能计算 (HPC) 系统中的计算节点上运行。灵活的 C/C++ API 确保将库轻松集成至大多数渲染解决方案。

简单是关键

API 的主要对象是负责实际降噪的设备。CPU 可能是唯一的设备,但是随着库的演变,未来的对象可能是 GPU 设备或者完全不同的设备。一旦设备对象被识别,开发人员可以创建用于降噪的缓冲区。这些缓冲区包含颜色、反射率等属性。

库本质上是一组滤波器,有些滤波器是密切相关的。开发人员可以选择最能满足其需求的滤波器。滤波器对象执行实际降噪。库的初始版本包含一个用于光线跟踪的通用滤波器 RT。Áfra 指出,后续版本将提供名为 RTLightmap 的滤波器,它将进一步提高光照贴图的质量。

创建滤波器对象后,开发人员指定缓冲区,并表示滤波器的输入图像和输出图像。调用函数以进行实际降噪将执行滤波器,然后创建输出。

简言之:使用 API 需要创建设备;从该设备中按需创建缓冲区;创建一个滤波器对象,为其指定输入和输出图像;然后执行滤波器。

破解代码

英特尔 Open Image Denoise 库提供了一个 C99 API(同时兼容 C++)和一个 C++11 包装程序 API。该 API 拥有一个对象导向型设计,因此,它包含设备对象(OIDNDevice 类型)、缓冲区对象(OIDNBuffer 类型)和滤波器对象(OIDNFilter 类型)。

所有对象都采用引用计数法。通过调用适当的 release 函数(如 OIDNReleaseDevice)释放句柄或通过增加引用计数(如 OIDNRetainDevice)保留句柄。

除了少数例外,设置对象参数不会起到立竿见影的效果。在更新参数明确提交给特定对象前,包含该参数的对象不可用。这意味着可以批量进行多个细微修改,并且用户可以准确指定什么时候修改对象。

所有 API 调用都可以确保线程安全。但是,对使用相同设备的操作实施序列化,以最大限度减少来自不同线程的 API 调用数量。

以下是 Áfra 为 C++(版本 11)编写的简单示例代码片段,可以从 GitHub* 下载:

#include <OpenImageDenoise/oidn.hpp>
...
// Create an Open Image Denoise device
oidn::DeviceRef device = oidn::newDevice();
device.commit();

// Create a denoising filter
oidn::FilterRef filter = device.newFilter("RT"); // generic ray tracing filter
filter.setImage("color",  colorPtr,  oidn::Format::Float3, width, height);
filter.setImage("albedo", albedoPtr, oidn::Format::Float3, width, height); // optional
filter.setImage("normal", normalPtr, oidn::Format::Float3, width, height); // optional
filter.setImage("output", outputPtr, oidn::Format::Float3, width, height);
filter.set("hdr", true); // image is HDR
filter.commit();

// Filter the image
filter.execute();

// Check for errors
const char* errorMessage;
if (device.getError(errorMessage) != oidn::Error::None)
  std::cout << "Error: " << errorMessage << std::endl;

时间和质量

游戏程序员面临严格的时间限制,在未经优化的系统上达到 60 帧/秒可能需要数天。Áfra 表示:“没人想这样。所有人都想更快地渲染。无论你是实时还是离线运行,永远都是越快越好。”

如果您比较噪声图像和降噪图像,会发现差异时大时小。Áfra 表示:“您可以从模糊不清的重度噪声图像中获得非常美观、清晰的图像。但是差异也有可能很小,因为图像可能已经接近最高质量。但是,即使轻度噪声图像也可以快速受益于英特尔 Open Image Denoise 库。降噪永远不会重新生成完美的完全融合图像,Áfra 表示:“但是它可以使速度高出一个数量级。”

降噪器的任务是快速获得尽可能接近“地面真值”的结果。

库即将进入生产阶段

Áfra 的代码库即将进入生产阶段。截至发稿时,测试版本为 0.8.1,因此,它仍很新。最新版英特尔 Open Image Denoise 库资源可从 GitHub 中下载。该文档包含分布说明,以帮助开发人员快速入门。

Áfra 相信开发人员有充分理由尝试这款基于人工智能的先进降噪解决方案,该解决方案基于开源代码库而构建,能够在几乎所有 x86 CPU 上运行并产生绝佳的图像质量。他解释道:“部分降噪解决方案需要数分钟来完成图像降噪。在特定硬件上,我们的解决方案仅需数毫秒。”

我们的目标是帮助开发人员专注于构建最复杂、最具沉浸感的环境,以及快速轻松地对这些设计进行迭代。这将为开发人员和用户创造双赢局面。下载最新版解决方案并查看它将为您的项目带来哪些优势。

资源

有关编译器优化的更完整信息,请参阅优化通知