acm-header
登录

ACM通信

研究突出了

GPU射线跟踪


再现惠泰德的球体场景

用用户指定的程序重新创建Whitted的球体场景。在1k * 1k分辨率的GeForce GTX680上以超过100fps的速度运行。

NVIDIA®OptiX射线跟踪引擎是为NVIDIA gpu和其他高度并行架构设计的可编程系统。OptiX引擎建立在一个关键的观察结果上,即大多数射线跟踪算法可以使用一小组可编程操作实现。因此,OptiX的核心是一个特定于领域的即时编译器,通过结合用户提供的射线生成、材质着色、对象相交和场景遍历程序,生成定制的射线跟踪内核。这使得基于光线跟踪的高度多样化的算法和应用得以实现,包括交互渲染、离线渲染、碰撞检测系统、人工智能查询和科学模拟(如声音传播)。OptiX通过紧凑的对象模型和几种射线跟踪特定编译器优化的应用实现了高性能。为了便于使用,它公开了一个单射线编程模型,完全支持递归和类似于虚函数调用的动态调度机制。

回到顶部

1.简介

许多计算机专业的本科生都学过计算机图形学课程,他们在课程中编写了一个简单的射线追踪程序。通过对光传输物理的一些简单概念,学生可以获得具有反射、折射、阴影和景深等相机效果的高质量图像,所有这些都对当代实时图形管道提出了挑战。不幸的是,光线追踪的计算负担使它在许多情况下不实际,特别是在交互性很重要的情况下。研究人员发明了许多技术来提高射线追踪的性能,13特别是在映射到高性能体系结构特性(如显式SIMD指令)时12和基于单指令多线程(SIMT)6gpu。1不幸的是,大多数这样的技术混淆了使射线追踪具有吸引力的简单性和概念的纯洁性。行业标准也没有像Direct3D和OpenGL为栅格化所做的那样,隐藏这些复杂性。

为了解决这些问题,我们引入了OptiX,一种通用的射线跟踪引擎。通用编程接口支持在图形和非图形领域实现各种基于射线跟踪的算法,如渲染、声音传播、碰撞检测和人工智能。这个接口在概念上很简单,但在现代的GPU架构上却能实现高性能,与手工编码的方法相比具有竞争力。

在本文中,我们讨论了OptiX引擎的设计目标以及NVIDIA图形处理器的实现。在我们的实现中,我们用一组灵活的场景层次控制、加速结构创建和遍历、动态场景更新和动态负载平衡的GPU执行模型组成特定于领域的编译。尽管OptiX主要针对高度并行的GPU架构,但它适用于广泛的专用和通用硬件,包括现代cpu。

*1.1.射线追踪,栅格化和图形处理器

计算机图形学算法呈现,或图像合成,采取两种互补的方法之一。一组算法循环遍历图像中的像素,计算每个像素处的第一个可见对象;这种方法叫做射线跟踪因为它解决了从像素到物体的射线相交的几何问题。第二组算法循环遍历场景中的对象,为每个对象计算该对象覆盖的像素。因为生成的每个对象像素(称为片段)被格式化为光栅显示,这种方法称为光栅化.射线追踪的中心数据结构是一个称为an的空间索引加速结构,用来避免在所有对象上测试每条射线。栅格化的中心数据结构是深度缓冲,它存储在每个像素处最近的物体的距离,并丢弃来自不可见物体的碎片。虽然这两种方法都得到了推广和优化,但基本的区别仍然存在:射线跟踪迭代射线,而栅格化迭代对象。高性能射线跟踪和光栅化,都专注于渲染最简单的对象:三角形。

历史上,射线追踪被认为是慢的而栅格化是快的。深度缓冲栅格化的简单、规则结构适合于高度并行的硬件实现:每个对象经过几个计算阶段(所谓的图形管道),每个阶段以数据并行的方式对管道中飞行的许多对象、片段和像素执行类似的计算。随着图形硬件变得越来越并行,它也变得越来越通用,从专门的固定功能电路实现图形管道的各个阶段演变为完全可编程处理器,将这些阶段虚拟化到数百甚至数千个小型通用核心上。今天的图形处理单元(gpu)是大型并行处理器,能够执行数万亿次浮点数学运算,每秒绘制数十亿个三角形。现代gpu的计算能力和功率效率使其对高性能计算具有吸引力,从世界上许多最快的超级计算机到桌面上的科学、数学和工程代码。所有这些都提出了一个问题:光线追踪能否在gpu上高效而灵活地实现?

*1.2.贡献和设计目标

为了为广泛的光线追踪任务创建高性能系统,几个权衡和设计决策导致了以下贡献:

  • 一个通用的,低水平的射线追踪引擎.OptiX不是渲染器。它专门关注光线跟踪所需的基本计算,避免嵌入、渲染特定结构,如光、阴影和反射率。
  • 可编程射线跟踪管道.OptiX表明,大多数射线跟踪算法都可以通过一小组轻量级可编程操作实现。它将抽象的射线跟踪执行模型定义为一系列用户指定的程序,类似于传统的基于栅格化的图形管道。
  • 一个简单的编程模型.OptiX避免了高性能射线追踪算法给用户带来的负担。它公开了一个熟悉的递归、单射线编程模型,而不是射线包或显式向量结构,并抽象了射线的任何批处理或重排序。
  • 一个领域特定的编译器.OptiX引擎将实时编译技术与射线跟踪相关知识相结合,可以有效地实现其编程模型。引擎抽象允许编译器针对可用的系统硬件调优执行模型。

回到顶部

2.相关工作

虽然已经提出了许多高级射线跟踪库、引擎和api,13迄今为止的努力都集中在渲染算法的特定应用程序或类别上,这使得它们很难适应其他领域或体系结构。另一方面,一些研究人员已经展示了如何将射线跟踪算法有效地映射到gpu和NVIDIA®CUDA架构,1,3.,11但是这些系统关注的是性能而不是灵活性。

对相关制度和研究的进一步讨论可在原文中找到。10

回到顶部

3.可编程射线跟踪管道

OptiX引擎背后的核心思想是,大多数光线跟踪算法可以通过组合一小组可编程操作来实现。这直接类似于OpenGL和Direct3D所使用的可编程栅格化管道。在较高的级别上,这些系统公开了一个抽象光栅化器,其中包含用于顶点着色、几何处理、镶嵌和像素着色操作的轻量级回调函数。这些程序类型的集合通常用于多个通道,可用于实现多种基于栅格化的算法。

我们已经确定了一个相应的可编程射线跟踪执行模型,以及可以定制的轻量级操作,以实现各种基于射线跟踪的算法。9这些用户提供的操作,我们简单地称之为项目,可与用户定义的数据结构(有效载荷)与每条射线相联系。程序集成在一起实现特定客户机应用程序的算法。

*3.1项目

OptiX包括七种不同类型的此类程序,每一种程序在概念上一次操作一条射线。此外,边界框程序对几何图形进行操作,以确定加速结构构造的原始边界。用户程序和硬编码OptiX内核代码的组合形成射线跟踪管道,这已在图2.与前馈光栅化管道不同,将射线跟踪管道视为调用图更为自然。核心操作,rtTrace,在十字路口(遍历)和回应那个交叉路口(阴影).通过在用户定义的射线有效负载和全局设备内存数组中读取和写入数据缓冲区,将这些操作组合起来,在射线跟踪过程中进行任意计算。

线代程序是进入射线追踪管道的入口。的单一调用rtContextLaunch从主机将创建这些程序的许多实例。典型的射线生成程序将使用相机模型为像素内的单个样本创建射线,启动跟踪操作,并将生成的颜色存储在输出缓冲区中。但通过将光线生成与图像中的像素区分开,OptiX可以进行其他操作,如创建光子图、预计算照明纹理图(也称为烘焙)、处理来自OpenGL的光线请求、拍摄多个光线进行超级采样或实现不同的相机模型。

十字路口程序实现射线-几何相交测试。当遍历加速度结构时,系统将调用交叉程序来执行几何查询。程序确定光线是否接触到物体以及在哪里接触到物体,并根据击中的位置计算法线、纹理坐标或其他属性。每个交集可以关联任意数量的属性。相交程序支持多边形和三角形以外的任意曲面,如位移图、球体、圆柱体、高阶曲面,甚至像Julia设置的分形几何图1.可编程的交集操作即使在只有三角形的系统中也很有用,因为它方便直接访问本机网格格式。

Closest-hit一旦遍历找到了与场景几何图形最近的射线交点,就调用程序。这种程序类型类似于经典渲染系统中的表面着色器。通常,最近命中的程序将执行阴影等计算,在过程中可能投射新的射线,并将结果数据存储在射线有效载荷中。

任何成功在遍历发现的每个射线-物体交集时调用程序。任意命中程序允许材料参与物体相交决策,同时保持阴影操作与几何操作分离。它可以选择使用内置函数终止射线rtTerminateRay的所有遍历,并将调用堆栈展开到最近的调用rtTrace.这是一个轻量级的异常机制,可用于实现阴影射线和环境遮挡的早期射线终止。或者,任意命中的程序可以忽略使用的交集rtIgnoreIntersection,允许遍历继续寻找其他几何对象。例如,程序可以选择忽略基于纹理通道查找的交互,以实现高效的alpha映射透明性,而无需重新启动遍历。任意命中程序的另一个用例可以在第6.1节中找到,其中应用程序对玻璃物体投下的部分阴影执行可见性衰减。注意,交叉路口可能会出现乱序。默认的任意命中程序是一个无操作,这通常是需要的操作。

小姐当射线在规定的区间内不与任何几何图形相交时,程序将被执行。它们可用于实现背景颜色或环境映射查找。

异常当系统遇到异常条件时,程序将被执行,例如,当递归堆栈超过每个线程可用的内存量时,或者当缓冲区访问索引超出范围时。OptiX还支持可从任何程序抛出的用户定义异常。异常程序可以做出反应,例如,通过打印诊断消息或通过向输出像素缓冲区写入特殊颜色值来可视化条件。

选择器的访问程序公开了粗级别节点图遍历的可编程性。例如,应用程序可以选择在每射线的基础上改变场景部分的几何细节级别。

*3.2现场代表

OptiX的一个明确目标是最小化场景表示的开销,而不是强迫用户使用重量级的场景图。OptiX引擎使用一个简单但灵活的结构来表示场景信息和相关的可编程操作,这些操作被收集在一个名为上下文.这种表示方式也是将可编程着色器绑定到它们所需的特定于对象的数据的机制。

层次结构节点.场景被表示为一个轻量级图,它控制光线在场景中的遍历。它还可以用于为刚性对象的动画或其他常见的场景结构实现实例化两级层次结构。为了支持实例化和共享公共数据,节点可以有多个父节点。

四种主要节点类型可用于使用有向图提供场景表示。任何节点都可以作为场景遍历的根。例如,这允许对不同的射线类型使用不同的表示。

集团节点包含任何节点类型的零个或多个(但通常是两个或多个)子节点。组节点具有与之关联的加速结构,可用于提供两级遍历结构的顶层。

几何组节点是图的叶子,包含下面描述的基本对象和物质对象。这种节点类型还有一个与之相关联的加速结构。任何非空场景将包含至少一个几何组。

变换节点具有任意节点类型的单个子节点,以及一个相关的4×3矩阵,该矩阵用于执行底层几何结构的仿射转换。

选择器节点有零个或多个任意节点类型的子节点,加上一个用于在可用子节点中进行选择的访问程序。

几何和实物.场景数据的大部分存储在图的叶子处的几何节点中。这些对象包含定义几何和阴影操作的对象。它们也可能有多个父节点,允许在图中的多个点上共享材料和几何信息。举个例子图3.右边的图显示了一个简单场景的完整OptiX上下文,其中包含针孔相机、两个物体和阴影。射线生成程序实现相机,而miss程序实现恒定的白色背景。单个几何组包含两个几何实例,具有单个几何索引——在本例中是建立在三角形网格和地平面中所有底层几何上的有界体积层次结构(BVH)。实现了两种类型的几何图形,一个三角形网格和一个平行四边形,每一种都有自己的一组交集和边界框程序。这两个几何实例共享一个实现漫射照明模型的单一材料,并分别通过近距离撞击和任意撞击程序完全衰减阴影射线。

左边的图表图3说明如何调用这些程序的3射线遍历场景:射线生成程序创建射线并根据几何组跟踪它们。这将启动如图所示的遍历阶段图2,执行平行四边形和三角形网格的相交,直到找到一个相交点(2和3)。如果射线与几何图形相交,则调用最近命中的程序,无论该相交点是在地平面上还是在三角形网格上。该材料将递归生成显示射线,以确定光源是否通畅。4.当发现阴影射线的任何交叉点时,any-hit程序将终止射线遍历并返回调用程序,并提供阴影遮挡信息。5.如果一条射线没有与任何场景几何体相交,miss程序将被调用。

几何实例对象绑定一个几何对象到一组实物.这是场景图用来保持几何和阴影信息正交的常见结构。

几何对象包含几何原语的列表。每个几何对象都与一个边界框程序和一个交集程序相关联,这两个程序都在几何对象的原语之间共享。

材料对象保存关于着色操作的信息,包括3.1节中描述的任意命中和最近命中的程序。

*3.3.系统概述

OptiX引擎由两个不同的api组成。的主机API是一组C函数,客户机应用程序调用它来创建和配置上下文、组装节点图和启动射线跟踪内核。它还提供了管理GPU设备的调用。的程序API是向用户程序公开的功能。这包括用于跟踪射线、报告交叉点和访问数据的函数调用。此外,还有几个语义变量对特定于射线跟踪的状态进行编码,例如,到最近交集的当前距离。打印和异常处理工具也可用于调试。

在使用OptiX主机、API函数提供场景数据,如几何、材料、加速结构、层次关系和程序后,应用程序将启动光线跟踪rtContextLaunch将控制传递给OptiX的API函数。如果需要,将从给定的用户程序编译一个新的射线跟踪内核,构建(或更新)加速结构,并在主机和设备内存之间同步数据,最后执行射线跟踪内核,调用上面所述的各种用户程序。

在射线跟踪内核的执行完成后,应用程序可以使用其结果数据。通常,这涉及从一个用户程序填充的输出缓冲区中读取数据,或者直接显示这样的缓冲区,例如通过OpenGL。然后,一个交互式或多通道应用程序从上下文设置开始重复这个过程,可以对上下文进行任意更改,然后再次启动内核。

回到顶部

4.领域特定的编译

OptiX主机运行时的核心是即时(JIT)编译器,它提供几个重要的功能。首先,JIT阶段将所有用户提供的着色器程序合并到一个或多个内核中。其次,分析节点图以确定数据相关的优化。最后,使用CUDA驱动程序API在GPU上执行生成的内核。

为大规模并行架构生成和优化代码提供了一些挑战。一个挑战是每次计算的代码大小和实时状态必须最小化,以获得最大的性能。另一个挑战是构建代码以减少分歧。我们使用OptiX的经验强调了这些有时相互冲突的需求之间有趣的紧张关系。

*4.1.OptiX项目

3.1节中描述的用户指定程序以并行线程执行(PTX)函数的形式提供给OptiX主机API。8PTX是一种用于NVIDIA CUDA架构的虚拟机汇编语言,在许多方面类似于流行的开源底层虚拟机(LLVM)中间表示。5与LLVM类似,PTX定义了一组简单的指令,为算术、控制流和内存访问提供基本操作。PTX还提供了一些高级操作,如纹理访问和超越操作。同样类似于LLVM, PTX假定一个无限的寄存器文件,并抽象出许多真实的机器指令。CUDA运行时中的JIT编译器在生成针对特定GPU架构的机器代码时,将执行寄存器分配、指令调度、死代码消除和许多其他后期优化。

PTX是从单个线程的角度编写的,因此不需要显式的通道掩码操作。这使得从高级着色语言降低PTX变得简单,同时让OptiX运行时能够操作和优化结果代码。

NVIDIA的CUDA C/ c++编译器,学校网站,发出PTX,目前是OptiX编程的首选机制。使用离线编译程序学校网站并作为PTX字符串提交给OptiX API。通过利用CUDA c++编译器,OptiX着色器程序有一组丰富的编程语言构造,包括指针、模板和重载,这些都是通过使用c++作为输入语言自动实现的。提供了一组头文件,支持跟踪射线和其他OptiX操作所需的变量注释和伪指令。这些操作以a的形式降低到PTX调用指令被OptiX运行时进一步处理。

*4.2.PTX到PTX编译

给定特定场景的PTX函数集,OptiX编译器使用多个PTX到PTX转换传递重写PTX,这与在LLVM基础结构中已被证明成功的编译器传递类似。通过这种方式,OptiX使用PTX作为中间表示,而不是传统的指令集。这个过程实现了许多特定于领域的操作,包括ABI(调用序列)、链接时间优化和依赖于数据的优化。在典型的射线跟踪器中,大多数数据结构都是只读的,这为优化提供了大量的机会,而在更一般的环境中,这些优化被认为是不安全的。

主要步骤之一是将互递归程序集转换为非递归状态机。尽管最初这样做是为了允许在不支持递归的设备上执行,但我们发现在SIMT设备上调度一致操作有好处,现在甚至在直接支持递归的新设备上也使用了这种转换。转换的主要步骤是引入一个延续,这是恢复挂起的函数所需的最小数据集。

在continuation中保存的PTX寄存器集是使用向后数据流分析通道确定的,该数据流分析通道确定在递归调用(例如,rtTrace遇到)。动态寄存器是用来作为数据流图中后续指令的参数的寄存器。我们在每个线程的堆栈数组中为每个变量保留插槽,在调用之前将它们存储在堆栈中,并在调用之后恢复它们。这类似于传统编译器为基于cpu的编程语言实现的调用者保存ABI。为了准备引入延续,我们对每个函数执行循环提升传递和复制传播传递,以帮助最小化每个延续中保存的状态。

最后,将调用替换为一个将执行返回到下面描述的状态机的分支,以及一个可用于最终将控制流返回到此函数的标签。关于这种转换的更多细节可以在原文中找到。

*4.3.优化

OptiX编译器基础设施提供了一组特定于领域的和依赖于数据的优化,在静态编译环境中实现这些优化将是一个挑战。这些包括:

  • 省略不使用转换节点的节点图的转换操作。
  • 如果当前执行中没有启用这些选项,则消除打印和异常相关的代码。
  • 通过在恢复后重新生成常量和中间产物来减少延续大小。由于OptiX执行模型保证特定于对象的变量是只读的,因此这个局部优化不需要过程间传递。
  • 基于树特征(如简并叶、简并树、共享加速结构数据或混合原始类型的存在)的专门化遍历。
  • 如果有可用空间,将小的只读数据移动到常量内存或纹理中。

此外,允许重写通道引入对代码的大量修改,这些修改可以通过其他标准优化通道来清除,例如死代码消除、常量传播、循环提升和复制传播。

回到顶部

5.执行模型

基本上,光线跟踪是一种高度并行的MIMD操作。在任何有趣的渲染算法中,光线会迅速发散,即使它们在相机模型中开始时是一起的。乍一看,这对依赖于SIMT执行来提高效率的gpu来说是一个挑战。然而,应该注意的是,执行分歧只是暂时的;射向玻璃材料的光线与射向油漆表面的光线暂时分离,但它们都很快回到追踪光线的核心操作——前者是折射或反射,后者是阴影光线。

因此,第4节中描述的状态机提供了在暂时发散后重新收敛的机会。为了完成这一点,我们将所有转换后的程序链接到一个单块内核megakernel这一方法在现代gpu上已被证明是成功的。1这种方法最大限度地减少了内核启动开销,但是潜在地降低了处理器的利用率,因为跨组成内核的寄存器需求增长到最大。OptiX通过将一组独立的用户程序链接在一起,并在运行时在它们之间遍历由执行流引起的状态机来实现megakernel。

*5.1.Megakernel执行

megakernel执行的一个直接方法是在开关实例结构上进行简单迭代。在每个case中,执行一个用户程序,这个计算的结果就是要在下一个迭代中选择的case或状态。在这种状态机机制中,OptiX可以实现函数调用、递归和异常。

图4演示了一个简单的状态机。程序状态只是插入到switch语句的主体中。状态索引,我们称之为a虚拟程序计数器(VPC),选择接下来要执行的程序片段。函数调用是通过直接设置VPC来实现的,虚拟函数调用是通过从表中设置VPC来实现的,函数返回只是简单地将状态恢复到与之前活动的函数(虚拟返回地址)相关联的延续。此外,特殊的控制流,如异常,直接操作VPC,以一种类似于setjmp / longjmpC提供的功能。

*5.2.细粒度的调度

虽然megakernel执行的直接方法在功能上是正确的,但当状态在单个SIMT单元内发散时,它会遭受序列化的惩罚。6为了减轻执行分歧的影响,OptiX运行时使用细粒度调度方案回收分歧的线程,否则这些线程将处于休眠状态。OptiX没有允许SIMT硬件自动序列化发散交换机的执行,而是使用调度启发式显式地为整个SIMT单元选择一个状态来执行。SIMT单元中不需要该状态的线程只需将迭代闲置。机理概述在图5

我们已经尝试了各种细粒度的调度启发式方法。一个简单的方案通过在状态上分配静态优先级来确定调度。通过在执行过程中调度具有相似状态的线程,OptiX减少了SIMT单元产生的总状态转换的数量,这可以大大减少由串行化硬件引起的自动调度的执行时间。图6展示了这种简化的一个例子。

随着gpu的发展,不同的执行模型可能会变得实际。例如,流执行模型2在某些体系结构上可能有用。其他体系结构可能为加速结构遍历或其他常见操作提供硬件支持。由于OptiX引擎没有规定射线树根之间的执行顺序,因此可以使用类似于我们目前用于生成megakernel的重写传递来针对这些替代方案。

回到顶部

6.应用案例研究

本节通过讨论许多不同应用程序背后的基本思想,介绍OptiX的一些示例用例。更多的例子可以在Parker等人中找到。10

*6.1.Whitted-style射线跟踪

OptiX SDK包含几个射线跟踪应用程序示例。其中一幅是Whitted最初球体场景的更新再现(图7).14这个场景很简单,但是演示了OptiX引擎的重要特性。

样品的射线生成程序实现了一个基本的针孔相机模型。摄像机的位置、方向和视锥是由一组程序变量指定的,可以交互修改。射线生成程序通过每像素拍摄一条射线或通过超采样执行自适应抗锯齿来开始着色过程。这种材料closest-hit然后程序负责递归地投射光线并计算阴影样本颜色。从递归返回后,射线生成程序将存储在射线有效负载中的样本颜色累积到输出缓冲区中。

该应用程序定义了三对独立的交叉和边界框程序,每个程序实现了不同的几何原语:一个平行四边形用于地板,一个球体用于金属球,一个薄壳球体用于中空玻璃球。玻璃球本可以用两个普通球体原语实例来建模,但是OptiX程序模型的灵活性使我们可以自由地为这种情况实现一个更有效的专门版本。每个交集程序都设置几个属性变量:一个几何法线,一个阴影法线,如果合适的话,还有一个纹理坐标。材料程序利用这些属性来执行阴影计算。

采用射线类型机制来区分亮度和阴影射线。申请书附于材料的任何成功阴影射线槽,一个简单的程序,立即终止射线。这种早期的射线终止为阴影点和光源之间的相互可见性测试提供了高效率。然而,玻璃材料是一个例外:在这里,任意命中程序被用来衰减存储在射线有效载荷中的可见系数。因此,玻璃球比金属球投射出更微妙的阴影。

*6.2.英伟达设计车库

NVIDIA设计车库是一个复杂的交互式渲染演示,旨在公开发布。的顶部图像图2使用该软件渲染。设计车库的核心是一个基于物理的蒙特卡罗路径跟踪系统4它不断地对光路进行采样,并随着时间的推移通过集成新的采样来优化图像估计。当初始的噪声图像收敛到最终的解决方案时,用户可以交互地查看和编辑场景。

为了控制堆栈的使用,Design Garage在射线生成程序中使用迭代实现路径跟踪,而不是递归调用rtTrace.的伪代码图8总结了。

在“设计车库”中,每种材料都使用一个最近命中的程序来确定下一个要跟踪的射线,并使用射线有效载荷中的特定字段将其传递回去。最近命中的程序还计算当前光反射的吞吐量,射线生成使用它来维持整个光路径上吞吐量的累积积。将照射到的光源的颜色乘以路径中的最后一束光线,就得到了最终的样本贡献。

OptiX在射线程序中对c++的支持允许材料共享一个实现光环和其他核心照明操作的通用最近击中实现,而一个特定的双向散射分布函数(BSDF)模型实现了重要性采样和概率密度评估。设计车库实现了许多不同的物理基础材料,包括金属和汽车油漆。其中一些着色器支持法线和镜面贴图。

OptiX实现了Design Garage的所有光线追踪功能,OpenGL管道实现了最终的图像重建和显示。该管道使用基于栅格化的标准技术执行各种后处理阶段,如色调映射、眩光和滤波。

*6.3.图像空间光子映射

图像空间光子映射(ISPM)7是一种结合了光线追踪和栅格化策略的实时渲染算法(图9).我们将发布的实现移植到OptiX引擎。这一过程让我们了解了传统的矢量串行射线跟踪器与OptiX之间的区别。

ISPM算法通过光栅化光的参考系“反弹图”来计算来自光的光子路径的第一段。然后,它通过递归的射线追踪传播光子,直到眼睛前面的最后一个散射事件。在每个散射事件中,光子被沉积到一个阵列中,这就是“光子图”。间接照明然后通过栅格化小体积周围的每个光子从眼睛的观点聚集在图像空间。通过阴影映射和栅格化计算直接照度。

考虑CPU-ISPM光子示踪器的结构。它为每个核心启动一个持久线程。这些线程处理来自全局原子工作队列的光子路径。ISPM光子映射产生非相干射线,因此传统的向量化射线遍历分组策略对这一过程没有帮助。对于每条路径,处理线程进入一个while-loop,每次迭代都在全局光子数组中存放一个光子。环路在光子吸收时终止。

跟踪性能随着将程序成功地细粒度调度为连贯单元而增加,随着程序之间通信的状态的大小而减小。在OptiX下,模仿传统cpu风格的软件架构是低效的,因为它需要在射线生成和命中程序之间传递所有材料参数,并在最近命中的程序中进行变量迭代while-loop。因此OptiX-ISPM遵循一种替代设计,将所有传播迭代都视为协同例程。它包含一个单射线生成程序,每个光子路径有一个线程。一个递归的最近命中程序实现了传播和保存迭代。这允许线程在迭代之间让步,以便细粒度调度程序可以对它们进行重新分组。

回到顶部

7.总结及未来工作

OptiX系统提供了一个通用的、高性能的射线跟踪API。OptiX通过提供一个简单的编程模型来平衡易用性和性能,该模型基于一个可编程的射线跟踪管道,用于单射线用户程序,可编译成一个高效的自调度megakernel。因此,OptiX的核心是处理的JIT编译器项目, PTX语言中用户指定的代码片段。OptiX将这些程序与图中的节点相关联,图中节点定义了射线跟踪的几何配置和加速数据结构。我们的贡献包括一个低级射线跟踪API和相关的编程模型、可编程射线跟踪管道的概念和相关的程序类型集、一个执行megakernel转换并实现若干特定于领域优化的特定于领域的JIT编译器,以及一个轻量级场景表示,它有助于实现高性能射线跟踪并支持但不限制应用程序场景图的结构。OptiX射线跟踪引擎是一款运输产品,已经支持广泛的应用。我们通过多个从简单到相当复杂的例子来说明OptiX的广泛适用性。

虽然OptiX已经包含了一组丰富的功能,并且适合于许多用例,但它还将继续改进和改进。例如,我们(或第三方开发人员)可以添加对进一步高级输入语言的支持,即生成供OptiX使用的PTX代码的语言。除了语言前端,我们还计划支持更多的后端。因为PTX仅作为中间表示,所以可以在非NVIDIA gpu的机器上翻译和执行编译后的megakerkernel。OptiX有一个CPU备用路径,它采用了这种方法。

与任何编译器一样,OptiX的一个缺点是,编译内核的性能并不总是与针对特定用例的手动调优内核相匹配。我们将继续探索优化技术以缩小这一差距。原文更详细地讨论了性能。

我们还发现了内核在编译时专门化方面的一些折衷方法,这些方法可以实现高性能,但当违反假设并必须重新生成内核时,会产生很小的延迟。将来,在编译新的专门内核时,系统可能会选择退回到一般化内核,以保持轻微降级的交互性。

*致谢

汽车,青蛙和发动机模型图1由TurboSquid提供。里面的兔子模特图3而且9由斯坦福大学图形实验室提供。菲尔·米勒(Phil Miller)在使这一努力走上正轨方面发挥了重要作用。作者从与NVIDIA Research和SceniX团队成员关于光线追踪的基础工作和大量对话中受益匪浅。

回到顶部

参考文献

1.艾拉,T,莱恩,S.理解gpu上射线遍历的效率。在高性能图形学报2009(2009), 145149。

2.格里布尔,C.P, Ramani, K.通过流滤波的相干射线跟踪。在交互式射线追踪2006 IEEE研讨会论文集(2008), 5966。

3.dr . Horn, Sugerman, J. Houston, M. Hanrahan, P.交互式k-d树射线追踪。在I3D’07:交互式3D图像和游戏2007年研讨会论文集(2007), ACM,纽约,纽约,美国,167174。

4.Kajiya, J.T.渲染方程。在计算机图形学(美国计算机学会会刊)(1986), 143150。

5.Lattner, C., Adve, V. LLVM:终生程序分析和转换的编译框架。在CGO’04:2004年代码生成和优化国际研讨会论文集(2004).

6.Lindholm, E., Nickolls, J., Oberman, S., Montrym, J. NVIDIA特斯拉:统一的图形和计算架构。IEEE微28(2008), 3955。

7.McGuire, M. Luebke, D.基于图像空间光子映射的硬件加速全局照明。在高性能图形2009年ACM SIGGRAPH/欧洲图形会议论文集(2009)。

8.NVIDIA。并行线程执行ISA版本2.3(2011)。http://developer.download.nvidia.com/-compute/DevZone/docs/html/C/doc/ptx_isa_2.3.pdf

9.NVIDIA。NVIDIA OptiX射线跟踪引擎编程指南2.5版本(2012)。http://www.nvidia.com/object/optix.html

10.Parker, s.g., Bigler, J., Dietrich, A., Friedrich, H., Hoberock, J., Luebke, D., McAllister, D., McGuire, M., Morley, K., Robison, A., Stich, M. OptiX:通用射线追踪引擎。在美国计算机学会图形学报(TOG)(2010)。

11.Popov, S., Günther, J., Seidel, H.P, Slusallek, P.用于高性能gpu射线跟踪的Stackless kd树遍历。在计算机图形学论坛(欧洲图形学学报)第26卷第4期。3(2007年9月),415424。

12.Wald, I., Benthin, C., Wagner, M., Slusallek, P.相干射线追踪的交互式渲染。在计算机图形学论坛(2001年欧洲图形学论文集), vol. 20, (2001)

13.Wald, I., Mark, W.R., Günther, J., Boulos, S., Ize, T., Hunt, W., Parker, s.g., Shirley, P.射线追踪动画场景的艺术状态。在2007年欧洲图形学STAR论文集(2007), 89116。

14.用于阴影显示的改进照明模型。Commun。ACM 23, 6(1980), 343349。

回到顶部

作者

史蒂文·g·帕克sparker@nvidia.com),英伟达,圣克拉拉,加利福尼亚州。

海科弗里德里希hfriedrich@nvidia.com),英伟达,圣克拉拉,加利福尼亚州。

大卫Luebkedluebke@nvidia.com),英伟达,圣克拉拉,加利福尼亚州。

基思莫理kmorley@nvidia.com),英伟达,圣克拉拉,加利福尼亚州。

詹姆斯Biglerjbigler@nvidia.com),英伟达,圣克拉拉,加利福尼亚州。

Jared Hoberockjhoberock@nvidia.com),英伟达,圣克拉拉,加利福尼亚州。

大卫·麦卡利斯特davemc@nvidia.com),英伟达,圣克拉拉,加利福尼亚州。

奥斯汀罗宾逊arobison@nvidia.com),英伟达,圣克拉拉,加利福尼亚州。

安德烈亚斯•迪特里希adietrich@nvidia.com),英伟达,圣克拉拉,加利福尼亚州。

格雷格·汉弗莱斯ghumphreys@nvidia.com),英伟达,圣克拉拉,加利福尼亚州。

摩根McGuiremorgan@cs.williams.edu)、NVIDIA和威廉姆斯学院。

马丁诗行mstich@nvidia.com),英伟达,圣克拉拉,加利福尼亚州。

回到顶部

脚注

本文的原始版本题为“OptiX:一个通用射线追踪引擎”,并发表于美国计算机学会图形学报(TOG), 2010年7月,ACM

回到顶部

数据

F1图1。使用OptiX构建的各种应用程序的图像。基于物理的光传输通过路径追踪。程序性Julia集的射线跟踪,光子映射,大尺度视线和碰撞检测,动态几何的whitted风格的射线跟踪,射线跟踪环境遮挡。所有的应用程序都是交互式的。

F2图2。显示通过射线跟踪管道的控制流的调用图。黄框代表用户指定的程序,蓝框代表OptiX内部的算法。执行由API调用发起rtContextLaunch.一个内置的函数,rtTrace,可被射线生成程序用于将射线投射到场景中。这个函数也可以由最近命中的阴影和二次射线程序递归调用。当一个特定射线的执行因错误(例如内存消耗过多)而终止时,将执行异常程序。

F3图3。OptiX场景的构建和执行。

F4图4。伪代码,用于实现megakernel执行的简单状态机方法。接下来要选择的状态由switch语句选择。重复执行该开关,直到状态变量包含一个指示终止的特殊值。

F5图5。伪代码,用于通过具有细粒度调度的状态机执行megakernel。

F6图6。具有优先级的细粒度调度的好处,如在呈现7时所实现的。条形表示每像素执行的状态数。通过用固定的优先级调度状态转换,可以看到显著的减少,如第5.2节所述。

F7图7。用用户指定的程序再现Whitted的球体场景:球体与矩形相交;玻璃,程序检查器,金属打击程序;空中小姐程序;和针孔相机自适应抗锯齿射线产生。在1k * 1k分辨率的GeForce GTX680上以超过100fps的速度运行。

F8图8。设计车库中迭代路径跟踪的伪代码。

F9图9。ISPM实时全局照明。OptiX中的递归最近命中程序实现了光子跟踪。

回到顶部


©2013 0001 - 0782/13/05 ACM

允许为个人或课堂使用部分或全部作品制作数字或硬拷贝,但不得为盈利或商业利益而复制或分发,且副本在首页上附有本通知和完整的引用。除ACM外,本作品的其他组件的版权必须受到尊重。允许有信用的文摘。以其他方式复制、重新发布、在服务器上发布或重新分发到列表,都需要事先获得特定的许可和/或费用。请求发布的权限permissions@acm.org传真(212)869-0481。

数字图书馆是由计算机协会出版的。版权所有©2013 ACM, Inc.


没有发现记录

Baidu
map