遍历在射线追踪中使用的数据的技术

文档序号:1954841 发布日期:2021-12-10 浏览:13次 >En<

阅读说明:本技术 遍历在射线追踪中使用的数据的技术 (Techniques for traversing data used in ray tracing ) 是由 G·穆特乐 J·伯吉斯 于 2021-06-10 设计创作,主要内容包括:公开了支持多个用于控制射线追踪加速数据结构的遍历的说明符的射线追踪硬件加速器。例如,可以通过使用可编程射线操作和显式节点掩膜指定通过此类数据结构的遍历来实现遍历效率和复杂的射线追踪效果。显式节点掩膜利用射线和加速度数据结构的节点中的专用字段来控制遍历。但是,对每个射线,射线操作是可以使用操作码和其他参数进行编程的以控制遍历。通过基于显式节点掩膜和可编程射线操作的结合,使得更主动地剔除部分数据结构,可以提高遍历效率。通过提供基于各个射线特性动态选择节点,可以实现更复杂的射线追踪效果。(A ray tracing hardware accelerator is disclosed that supports a plurality of specifiers for controlling traversal of a ray tracing acceleration data structure. Traversal efficiency and complex ray tracing effects can be achieved, for example, by specifying traversal through such data structures using programmable ray operations and explicit node masks. Explicit node masks utilize special fields in the nodes of the ray and acceleration data structures to control traversal. However, for each ray, the ray operations are programmable using opcodes and other parameters to control traversal. By combining the operation based on the explicit node mask and the programmable ray, partial data structures can be removed more actively, and the traversal efficiency can be improved. By providing for dynamic selection of nodes based on individual ray characteristics, more complex ray tracing effects may be achieved.)

具体实施方式

尽管Nvidia RTX平台的射线操作足够灵活以实现DXR实例掩膜划分或类似功能,但某些可视化效果可能会受益于DXR实例掩膜划分提供的剔除和其他不同的射线操作测试。在现有方法中,如果将可编程射线操作编程为执行实例掩膜划分,则它们将不可用于执行其他附加射线操作。

本公开的示例实施例提供了对于正在渲染的每个帧实时地提高每条射线基础上的射线遍历的灵活性和效率。特别地,某些示例实施例提供了在硬件中以实现更复杂的射线追踪效果同时提高射线追踪效率方式使加速结构中的相同节点经受除任何射线相交测试(确定射线是否与节点相交或与节点相关联的包围体相交的测试)之外的多项选择测试的能力。例如,在一个实施例中,可以对节点进行节点掩膜划分测试(也称为“节点/实例包含测试”)以及几何细节水平的测试,从而提供了在每个节点基础上进行动态选择是否基于多个选择标准遍历节点的能力。

在一个实施例中,加速数据结构存储器格式中的实例节点的先前未使用的字段用于容纳附加实例掩膜信息,在提供附加功能的同时不需要扩展传统实例节点格式。

在示例实施例中,仅当节点掩膜划分测试与射线中指定的掩膜匹配时,节点掩膜划分测试才允许将节点包括在射线的遍历中,并且针对方面(例如,几何细节水平)进行可编程的射线操作测试仅当节点是该特定射线的适当几何细节水平时,才允许将节点包括在遍历中。因此,在一个实施例中,将两个选择测试的结果进行“与(AND)”运算以提供多重测试功能。

本公开的某些示例实施例提供了一种射线追踪协处理器硬件设备,其使并行处理单元能够基于在加速结构的节点和射线中指定的专用节点包含掩膜上指定的专用掩膜,在硬件加速射线追踪期间执行节点掩膜划分测试。在一些实施例中,节点掩膜划分测试仅适用于实例节点,即,仅针对实例节点确定要包括或不包括遍历该节点。关于实例节点,本发明可使用术语实例掩膜,实例包含掩膜和实例掩膜划分测试来分别指代节点掩膜、节点包含掩膜和节点掩膜划分测试。

在示例实施例中,射线追踪协处理器硬件设备被配置为用于支持包括节点包含掩模的射线,并且还指定要在相同节点上或针对相同节点执行的另一可编程射线操作,从而提供了除了下面描述的任何射线-complet或射线-图元相交测试之外,还经过了多次针对每个射线的可编程测试的相同的节点因此可以做出更复杂的遍历选择决策。可以在射线中包含的操作码中指定其他操作。在一些实施方式中,可以如标题为“树遍历的查询特定行为修改(Query-Specific Behavioral Modification of Tree Traversal)”的美国专利申请No.16101180中所描述的那样实施基于可编程操作码的射线操作,该专利申请全文以引用方式并入本文。

示例阴影射线可视化用例

节点掩膜划分的应用程序示例是针对阴影射线,其是特定类型的射线。在某些情况下,当射线照射场景中的物体表面时,需要确定有多少光到达该点。有时可以通过从一点向光源发射阴影射线来实现。阴影射线通常从该点射向随机光源,并进行配置,以使其在到达光源的路径中碰到任何障碍物时返回,表明该点没有从该光源接收任何光。

但是,该指示仅对于不透明物体的障碍物才成立。因此,例如,当渲染汽车的内部并且期望找出有多少光从太阳进入内部时,阴影射线从内部朝向太阳发射。但是阴影射线通常会在与挡风玻璃相交时返回,从而错误地指示没有光通过挡风玻璃被接收。阴影射线表明没有太阳光接收到,因此汽车内部将完全黑暗,因为光源在外部,并且光进入汽车内部的唯一途径是通过挡风玻璃。因此,在这种情况下,通常阴影射线变得无用,并且开发人员经常依靠其他技术(例如反射射线)来确定光。

然而,通过选择仅针对阴影射线将挡风玻璃从行进路径中隐藏起来,可以实现上述情况下阴影射线的有效利用。节点遮罩允许开发人员(或系统)在拍摄阴影射线时从场景中隐藏包括挡风玻璃的节点,但对于其他射线类型(例如反射射线等),将挡风玻璃保留在场景中。这使得阴影射线能够正确地返回关于内部是否接收到来自光源的光的确定。

图2示出了场景中的汽车202,该汽车正在使用射线追踪进行渲染。汽车202的内部204的一部分在场景中是可见的。为了确定用于渲染内部204的照明,可能有必要将诸如从内部204发出的一个或多个射线(例如,阴影射线)210通过透明或半透明表面(如挡风玻璃206)朝向光源208发射。

在某些情况下,开发人员可以通过以从汽车202的内部204射出的射线210不会与挡风玻璃206相交的方式明确地排除挡风玻璃,来确定可以执行对包括汽车202的加速数据结构的遍历以获得汽车内部的所需照明。但是,与此同时,开发人员也可能希望在同一场景中渲染从挡风玻璃206反射的光的效果。例如,开发人员可能希望具有从汽车外部发出并撞击挡风玻璃的射线212,以在某个方向214上反射。

如果加速数据结构包括用于挡风玻璃206和汽车202其余部分的单独节点,则节点遮罩可用于通过指定对应于挡风玻璃206的节点的节点掩膜仅从某些射线(例如射线210)的遍历中有选择地排除挡风玻璃206,当与反射射线216的节点包含掩膜进行逻辑“与”运算时,对应于挡风玻璃206的节点的节点掩膜评估为1或为真,但与阴影射线210的节点包含掩膜进行逻辑“与”运算时,对应于挡风玻璃206的节点的节点掩膜评估为0或为假。射线212被配置为具有将与对应于挡风玻璃206的节点的节点掩膜匹配的节点包含掩膜,而射线210被配置为具有与对应于挡风玻璃206的节点的节点掩膜不匹配的节点包含掩膜。在遍历射线时,具有与在射线中设置的节点包含掩膜匹配的节点掩膜的节点(例如,节点掩膜和包含掩膜之间的逻辑运算返回1或真)时,可以包含该节点以进行进一步遍历。当节点的节点掩膜不匹配(例如,节点掩膜和包含掩膜之间的逻辑运算返回0或错误)时,则针对该射线将该节点或以该节点为根的子树从进一步遍历中剔除,因此加速了对该射线的遍历的完成,并且还实现了所需的渲染效果(例如,在上述示例中,例如在车内适当的照明)。以这种方式,挡风玻璃206将被包括在射线212的遍历中,从而实现开发人员所寻求的反射的效果,而挡风玻璃206将被从射线210的遍历中排除,从而提供了关于射线210所寻求的遍历的加速。

示例可视化用例–不同的详细程度

在某些场景中,开发人员可能还希望基于每条射线可以确定的一个或更多个其他动态条件,包括或排除某些节点(或植于某些节点的子树)。例如,对于起源于相对于汽车202的较远位置的射线,如果选择内部204的较低的几何细节水平,而不是可能需要的较高的几何细节水平的起源于距离汽车相当近的位置的射线,则遍历效率可以更高。因此,取决于射线216(例如,与用户的视点相对应的射线)是起源于远离汽车202还是接近汽车202,汽车202的几何图形细节的期望水平可以不同,并且附加可编程射线操作测试可用于动态选择具有适当细节水平的物体模型,并从该射线的遍历中排除该物体模型的所有其他细节水平。

图3A和3B示出了两个加速数据结构的示例,其中,挡风玻璃206和汽车202的其余部分都包括在用于相同场景的两个不同的几何细节水平中–较低的几何细节水平310和较高的几何细节水平312。

图3A示出了挡风玻璃206和汽车202被表示为用于低几何细节水平310和高几何细节水平312中的每一个的单独节点。边界框304、302分别在低几何细节水平310中包围挡风玻璃206和汽车202的其余部分。边界框308和306在细节较高的水平312中包围挡风玻璃206和汽车202的其余部分。尽管在图3A和3B中没有清楚地示出差异,但是在示例实施方式中,低细节几何图形水平310可以仅使用数千个三角形图元来表示物体或其一部分,而在高细节几何图形水平312中可以使用数百万个三角形图元表示同一物体或其一部分。边界框302、304、306和308连接到以节点314为根并且具有诸如节点316、318和320之类的节点作为节点320的子节点的树的其余部分。在该示例中,从顶层加速结构(TLAS)(例如包括节点314、316、318和320)的世界坐标空间(或另一个坐标空间)到挡风玻璃206和汽车202的其余部分的物体空间的变换,可以与节点302、304、306和308的每个相关联。也就是说,单独的底部加速结构(BLAS)可以与节点302、304、306和308中的每个相关联。以另一种方式描述,在图3A的示例中,节点302、304、306和308中的每个是实例节点(例如,节点指定从一个坐标空间到另一坐标空间的变换),并且在其中仅实例节点可以包括节点掩膜(相对于实例节点而言,被称为实例掩膜)的实施例中,对实例节点进行测试以用于实例掩膜划分。

图3B示出了加速数据结构的替代构造。在图3B中,挡风玻璃206的较低的几何细节水平310和与包围体304和302相对应的汽车202的其余部分连接到作为节点320的子节点的加速结构的其余部分,而包围在包围体308和306中较高的几何细节水平312则作为与节点320分离的另一个节点318的子节点被连接。在该示例中,从TLAS(例如,包括节点314、316、318)的世界坐标空间(或另一个坐标空间)变换到挡风玻璃206的物体空间和汽车202的其余部分可以与节点320和322中的每一个相关联。即,如图所示BLAS(例如,包括节点302、304的一个以及包含节点306和308的另一个)可根植于节点320和322(在这种情况下是实例节点)。

在遍历图3A的加速数据结构时,首先在于选择是否包括挡风玻璃的选择相同的节点处基于细节的几何图形等级对子树进行选择。这些也是与从高位加速结构的坐标空间到低位加速结构的物体坐标空间的射线转换相关的相同节点。在遍历图3B的加速数据结构时,可以在节点320处进行几何细节水平的初始选择,与此相关的是,发生射线从TLAS的坐标空间转换到BLAS的物体坐标空间,并且发生与节点302和304关联挡风玻璃206的选择性包含。

示例多测试实施例

图4示出了根据一些实施例的用于执行节点掩膜划分和每线可编程射线操作的组合的过程400。过程400可以由遍历协处理器738在实时射线追踪图形系统700(参见图7)中执行。根据在图10中示出的一些实施例的遍历协处理器738的示例组件。

在操作402处,遍历协处理器738从流式多处理器(SM)732接收射线查询。该射线查询包括该射线的射线信息以及加速结构或其将要由射线遍历的部分的加速结构信息。射线信息包括节点包含掩模和用于可编程射线操作的射线操作信息。示例射线查询数据结构在图15A和15B中显示。

在操作404,遍历协处理器738使用包括在接收到的射线查询中的加速结构信息来访问加速结构。加速结构可以具有一个或多个节点,这些节点的配置可以由节点掩膜测试和可编程射线操作测试使用。例如,加速结构的一个或更多个节点可以配置有节点掩膜,该节点掩膜用于在节点掩膜测试中与射线信息中指定的节点包含掩膜进行比较。一个或更多个节点可以包括可以在具有在射线信息中指定的操作码的可编程射线操作测试中使用的参数。一个或更多个节点可以配置有以下两种:一种节点掩膜,通过特定的射线或特定类型的射线有选择地确定该节点包含在遍历中(或排除在该遍历之外);以及可编程的射线操作参数,这些参数可以用于有选择地确定该节点的包含或从该射线的进一步遍历中排除。图3A所示的加速结构可以是根据处理400遍历的加速结构或其一部分。如上所述,在图3A的加速结构中,节点302、304、306和308是实例节点,并且是每个都与从另一个坐标空间(例如世界坐标空间)到物体的物体坐标空间的变换相关联,并且每个还可以包括用于节点遮罩测试的节点掩膜和用于射线操作测试的射线操作参数。在图16A和16B中示出了分别具有节点掩膜和射线操作参数的示例节点数据结构。

在操作406,用接收的射线查询中指定的射线遍历加速结构。在遍历期间,会遇到适用节点掩膜划分测试和射线操作测试的节点。在一些实施例中,加速结构中的所有节点都经受节点掩膜划分测试和可编程射线操作测试中的一个或两个,而在一些其他实施例中,仅某些节点(例如,取决于节点的类型和/或表示节点掩膜的有效性的标志)经受节点掩膜划分测试。例如,根据一些实施例,节点掩膜划分测试可以仅应用于指定从一个坐标空间到另一坐标空间的变换的实例节点。

在操作408,根据射线中指定的相应操作码(和可选参数)以及节点中指定的一个或更多个值,执行可编程射线操作测试。相对于图17描述示例可编程射线操作,以下称为“RayOp”。

如果在操作408中的射线操作测试确定要遍历该节点,则在操作410中,对该节点执行节点掩膜划分测试。结合下面的图17更详细地描述了组合的可编程射线操作测试和节点掩膜划分测试的示例实现。

如果在操作408中进行的射线操作测试或在操作410中进行的节点掩膜划分测试确定要从该射线的遍历中排除该节点,则在操作416中,该节点或更具体地讲,以该节点为根的子树从射线的进一步遍历中剔除节点。

当在操作410处的节点掩膜划分测试确定该节点不属于配置为从遍历中排除的一组节点时(例如,该测试返回值0),则在该节点为实例节点的情况下,首先在操作412中遍历该节点,然后根据与该节点相关联指定的变换对射线进行变换,然后在操作414中继续遍历以具有变换的射线的节点为根的子树。下面例如参照图12A描述实例节点和射线变换。下面结合图17进一步描述可编程射线操作和节点掩膜划分测试的组合。

图5示出了根据一些实施例的用于执行组合的节点掩膜划分和每射线可编程射线操作的过程400'。过程400'可以基于与关于图4描述的过程400相同的指令,但是示出了当用于遍历诸如图3B中示出的与图3A所示的加速结构的结构不同的加速结构时的一些差异。例如,如上所述,而在图3A中,节点302、304、306和308在单独的BLAS中,在图3B的加速结构中,具有低几何细节水平310的节点302和304在位于第一BLAS中,具有高几何细节水平312的节点306和308位于第二BLAS中。

在过程400'中,操作402-406可以与过程400中的相同。但是,与过程400相比,在过程400'中,节点320和322的射线操作测试408导致以节点322为根的子树的剔除是因为它的几何细节水平为高312而导致测试失败,并且确定继续遍历以节点320为根的子树409是由于其几何细节水平低310而满足了该测试。因此,基于节点掩膜划分测试410,在节点302(或在节点302为根的子树)中继续进行遍历,因为节点302中指定的节点掩膜与射线的节点包含掩膜匹配,并且节点304(或以节点304为根的子树)从进一步遍历中删除,因为它的节点掩膜与射线的节点包含掩膜不匹配。

节点302中的遍历的继续包括:根据与实例节点302相关联的变换,将射线转换412到物体坐标空间,然后用转换后的射线在物体坐标空间中继续遍历414。

结合图12A-B描述基于在步骤402中提供的射线信息和加速结构信息,对在遍历协处理器上执行的对加速数据结构的遍历的进一步描述。从遍历协处理器返回的射线相交信息用于渲染场景。图18示出了下面关于生成图像的示例过程来描述使用相交信息的场景渲染(例如步骤1858)。

关于图3A、3B、4和5的组合的可编程射线操作和节点掩膜划分测试的过程的描述,以及下面关于图17的描述,具体描述了实例节点的节点掩膜。然而,实施例不限于实例节点的节点掩膜划分测试。节点掩膜和节点包含掩膜也可以应用于不是加速结构中实例节点的其他节点,并且作为节点掩膜测试的结果而包含在节点中或从节点中排除可以与关于实例节点相同的方式应用。

尽管,如下面相对于图17更详细地描述的,可编程射线操作可以用于在包括在射线中的其射线操作操作码中指定掩膜,从而提供基于加速结构中各个节点的对应的掩膜或位模式包括或排除节点的能力,将可编程射线操作与使用射线和各个节点中的专用掩膜的节点掩膜划分测试相结合的附加功能提供了高度的灵活性,可用于有效地实现复杂的射线追踪结果。在上述基于适当的细节水平动态选择节点同时剔除其他细节水平中指定的相同场景几何图形的节点以提高遍历效率的示例中说明了这种提高的效率和灵活性的示例,以及对于相同的射线,动态地排除场景几何图形体的某些部分以实现所需的场景效果(即,将挡风玻璃从遍历中排除,以有效地获得汽车内部的适当照明)。这种灵活性允许通过改进遍历树的各个部分的动态剔除和选择要遍历或排除的部分来定义复杂的加速结构,而不必一定会对遍历效率产生负面影响。其他示例应用程序可以包括但不限于选择性地包括场景的视图部分或从场景的视图部分中排除,以暴露或隐藏场景中物体的复杂几何图形细节。例如,可以通过选择包括或排除为该物体定义的某些表面来动态地暴露或隐藏物体(例如引擎、建筑物内部等)的不同级别的几何图形复杂度。

一些示例实施例通过将可编程射线操作测试配置为在将节点推入遍历协处理器中的遍历堆栈之前进行,并且将节点掩膜划分测试在节点从遍历堆栈中弹出之后进行,从而以硬件有效的方式提供该组合操作。然而,实施例不限于此。

建立包围体层次结构

如上所述,加速数据结构包括递归封装越来越小的包围体细分的包围体的层次结构(包围体层次结构或BVH)。最大的包围体体积可以称为“根节点”。这种包围体积(“叶节点”)的层次结构的最小细分包含项目。这些项目可以是定义物体表面的图元(例如,诸如三角形的多边形)。或者,一个项目可能是一个包含整个世界的球体,因为它没有被添加到BVH中(想象《黑衣人》中猫的项圈魅力,其中包含微型星系整个在里面)。如果该项目包含图元,则遍历协处理器在到达相交的叶节点时,将射线针对与叶节点关联的图元测试射线,以确定射线相交的物体表面以及沿射线可见的物体表面。

建立BVH可以分为两个部分:静态和动态。在许多应用程序中,对复杂的场景进行预处理,并且根据场景的静态几何图形创建BVH。然后,使用包括动态创建和操纵的移动物体在内的交互式图形生成,BVH的另一部分(或其他链接的BVH)可以由驱动程序或在实时交互式图形系统上运行的其他软件实时构建(例如,在每个帧中)。BVH的构建不需要硬件加速(尽管在某些非限制性实施例中可以),但可以使用在流式多处理器(SM)(例如SM 732)和/或CPU(例如CPU 120)和/或其他开发系统(例如在应用程序开发期间)上运行的高度优化的软件例程来实现。

BVH加速结构构建的第一阶段获取参考几何图形的边界框。这是通过为物体中的每个几何图元执行一个包围体程序来完成的,该程序为其输入图元返回一个保守的轴对包围体(AABB)。将包围体与几何图形的相关坐标系的轴对齐,与定向包围体(OBB)、边界球或其他方法相比,可以提高实时几何图形操作(例如相交测试和坐标转换)的效率。然而,本领域技术人员将理解,本文的示例性非限制性方法也可以应用于更昂贵的边界构造,例如OBB,边界球和其他包围体技术。

已经细分的包围体(其确实包括场景中的几何图形结构的至少一部分)可以进一步递归细分-就像从苏斯博士戴帽子的猫回来了(The Cat In The Hat Comes Back)(1958)的帽子中出现的越来越少的猫系列中的每一个一样。递归细分的数量和配置将取决于要建模的3D物体的复杂性和配置以及其他因素,例如所需的分辨率、物体与视点的距离等。一个示例细分方案是所谓的8-ary细分或“八叉树”,其中每个体积都细分为八个较小的统一大小的体积,但是已知许多其他空间层次结构和细分方案,例如二叉树、四叉树、k-d树,二进制空间分区(BSP)树和包围体层次结构(BVH)树。参见,例如,USP 9582607。

在某个细分的水平下(对于BVH的不同部分可以是不同的水平),BVH的构建过程会遇到构成要建模的封装物体的几何图形。使用一棵树的类比,连续的体积细分是树干、树枝、大树枝和小树枝,并且几何图形最终在树的最顶端(即叶子)处显现出来。此时,例如本文的非限制性实施例的BVH构建过程在此阶段使用启发式或其他分析技术(在一些实施例中可能包括人工智能和/或神经网络)执行优化,以认出那些叶子节点,这些叶子节点就其所包含的几何图形而言,呈现的拟合度很差。

这个过程继续进行,直到所有包含几何图形体的包围体被充分细分以为每个包围体提供合理数量的几何图元。使用BVH的实时射线追踪器将通过比较每个图元的顶点的空间xyz坐标与射线的xyz坐标,以确定射线和该图元定义的曲面是否占据相同的空间,从而确定射线-图元的交点。射线-图元交点测试可能需要大量计算,因为可能要测试许多三角形。在许多情况下,进一步按体积细分可能会更有效,从而将任何“叶节点”中的图元数量限制为16个或更少。

将包括压缩的小树的所得压缩树(“complet”)写出到存储器中的数据结构中,以供以后由图形处理硬件/软件在例如包括实时射线追踪的实时图形处理期间使用。

图6A和6B示出了3D场景的递归细分包围体(图6A)和射线追踪器可以访问并用于硬件加速操作的对应树数据结构(图6B)。树数据结构可以存储在存储器中,并且可以基于查询按需检索。

包围体的划分可以在分层树数据结构中表示,其中大包围体由树的父节点表示,而较小的包围体由包括父节点的树的子节点表示。最小包围体表示为树中的叶节点,并标识这些最小包围体中包含的一个或更多个几何图元。

树数据结构包括以层次结构布置的多个节点。树结构的根节点N1对应于包围所有图元O1-O8的包围体N1。根节点N1可以标识包围体N1的顶点和根节点的子节点。

在图6A中,将包围体N1细分为包围体N2和N3。图6B的树结构的子节点N2和N3对应于并表示图6A所示的包围体N2和N3。树数据结构中的子节点N2和N3标识空间中各个包围体N2和N3的顶点。在该特定示例中,包围体N2和N3中的每一个被进一步细分。包围体N2细分为包含的包围体N4和N5。包围体N3细分为包含的包围体N6和N7。包围体N7包括两个包围体N8和N9。包围体N8包括三角形O7和O8,包围体N9包括叶包围体N10和N11作为其子包围体。叶包围体N10包括图元范围(例如,三角形范围)O10,以及叶包围体N11包括项目范围O9。图6B树结构的各个子节点N4、N5、N6、N8、N10和N11对应于并表示图6A在空间中的包围体N4、N5、N6、N8、N10和N11。

在此特定示例中的图6B树只有三到六层深,因此包围体N4、N5、N6、N8、N10和N11构成“叶节点”-也就是说,树中没有子节点的节点。图6A显示叶节点包围体N4、N6和N8各自包含场景中几何图形的两个三角形。例如,体积细分N4包含三角形O1和O2;体积细分N6包含试验O5和O6;体积细分N8包含三角形O7和O8。图6A还示出了叶节点包围体N5包含单个圆柱体O3,如图所示,其对于虚线所示的AABB包围体N5没有提供良好的拟合。因此,在本文的示例性非限制性实施例中,不是将较大的AABB包围体积N5用于射线包围体相交测试,而是TTU738针对多个较小的AABB包围体来测试射线,所述多个较小的AABB包围体积被布置、定位、定尺寸并朝向为更紧密地配合O3气缸。

图6B所示的树结构通过将这些叶子节点N4、N5、N6和N7与场景几何图形的图元O1-O8中的适当一些相关联来表示它们。为了访问这种场景几何图形,TTU 738遍历图6B的树数据结构到叶节点。通常,树的不同部分可以并且将具有不同的深度,并且包含不同数量的图元。与不包含几何图形体的体积细分相关联的叶节点无需在树数据结构中明确表示(即,树被“修剪”)。

根据一些实施例,以N7为根的子树可以表示一组包围体或BVH,其定义在与对应于节点N1-N3的包围体不同的坐标空间中。当包围体N7与它的父包围体N3在不同的坐标空间中时,实例节点N7'提供遍历以N7为根的子树所必需的射线转换,实例节点N7'可以将树的其余部分连接到以N7为根的子树。实例节点N7'通过定义从N1-N3的坐标空间(例如,世界空间,世界坐标空间)到N7等的坐标空间(例如,物体空间,物体坐标空间)的变换,将与节点N1-N3相对应的包围体或BVH与与节点N7相对应的包围体或BVH连接起来。

在一些实施例中,以N1为根的树或子树与作为实例节点的父节点N1'相关联。实例节点N1’可以包含或可以与用于将射线从一个坐标空间变换到另一坐标空间的变换相关联。在一些实施例中,N1’可以指定从世界空间到替代世界空间的变换,并且可以被称为“顶级实例节点”。

更详细地,请参见https://developer.nvidia.com/rtx/raytracing/dxr/DX12-Raytracing-tutorial-Part-1,它描述了加速数据结构的最高(TLAS)和最低(BLAS)水平以及使用它们创建BVH的方法。在本文的一个示例实现中,对于每个物体或物体集,可以在物体周围定义BLAS包围体-以及在移动几何图形的情况下,可以为不同的时刻定义多个包围体。该包围体在物体空间中,并且可以紧密适合物体。所产生的BLAS包含几何图形的完整定义,其以适合于有效地查找与该几何图形的射线相交方式进行阻止。

在物体空间中定义BLAS。创建BVH时,所有这些单独的物体(每个物体都在其各自的物体空间中)和关联的子树通过变换放置到世界空间中。因此,BVH为每个BLAS子树指定从物体空间到世界空间的转换。着色器使用这些变换将每个物体转换/旋转/缩放为世界空间中的3D场景。

同时,BVH定义了世界空间中的TLAS包围体。可以将TLAS视为加速数据结构之上的加速数据结构。因此,最高TLAS级别允许包围体和射线完全测试,并且在一个实施例中不需要变换,因为射线是在世界空间中指定的。然而,在本文的示例性非限制性实施例中,还可以利用多个空间位置对运动中的物体的TLAS包围体积进行时间编码,以允许硬件电路出于射线-包围体相交测试的目的计算出在射线的瞬间下的特定空间位置。

当射线追踪系统向下遍历树中的某个点并遇到实例节点时,模式从TLAS(在世界空间中)切换为BLAS(在物体空间中)。在一个实施例中,物体顶点在物体空间中被定义为BLAS包围体(其可以与TLAS包围体不同)。complet中的变换信息用于将射线从世界空间变换为物体空间,以针对BLAS子树进行测试。在一个实施例中,用于TLAS射线包围体相交测试的相同插值硬件也可以用于BLAS射线包围体相交测试–可以为顶点插值和在BLAS级别上进行的射线图元相交测试提供不同的(例如,更高的精度)硬件。

如上所述构造的加速结构可以通过在传统通用计算机上运行的基于软件的图形流水线处理而有利地使用。然而,当前公开的非限制性实施例在基于硬件的图形处理单元的上下文中有利地实现上述技术,所述基于硬件的图形处理单元包括诸如一个或更多个流式多处理器(“SM”)的高性能处理器和一个或更多个遍历协处理器或“树遍历单元”(“TTU”)-3D图形处理管道的一个或一组流式多处理器SM的子单元。以下内容描述了此类系统的整体结构和操作,此类系统包括一个TTU 738,TTU 738可加速某些过程,以支持交互式射线追踪,包括射线包围体相交测试、射线图元相交测试以及用于实时射线追踪的射线“实例”转换以及其他应用程序。

示例系统框图

图7示出了示例实时射线交互式追踪图形系统700,该示例实时射线交互式追踪图形系统700使用包括如上所述构造的加速数据结构的场景或物体的三维(3D)数据来生成图像。

系统700包括输入设备710、处理器720、图形处理单元(GPU)730、存储器740和显示器750。图7所示的系统可以采用任何形状,包括但不限于个人计算机、智能手机或其他智能设备、视频游戏系统、可穿戴虚拟或增强现实系统、基于云的计算系统、车载图形系统、片上系统(SoC)等。

处理器720可以是多核中央处理单元(CPU),该多核中央处理单元可操作为对输入设备710进行实时交互响应,其输出包括用于在显示器750上显示的图像。显示器750可以是任何种类的显示器,例如固定显示器、头戴式显示器(例如显示器眼镜或护目镜),其他类型的可穿戴显示器、手持显示器、车载显示器等。例如,处理器720可以基于从显示器接收的输入来执行应用程序输入设备710(例如,操纵杆、惯性传感器、环境光传感器等),并指示GPU730生成显示应用进度的图像以在显示器750上显示。

基于应用程序在处理器720上的执行,处理器可以发布指令以供GPU 730使用存储在存储器740中的3D数据来生成图像。GPU730包括用于加速实时图像生成的专用硬件。例如,由于GPU能够执行重复和高度并行的特殊计算任务(例如多边形扫描转换)比常规软件驱动的CPU快得多,因此GPU 730能够实时处理数千或数百万个图形基元(多边形)的信息。例如,与处理器720不同,处理器720可以具有多个核,其中多个核具有一次可以处理几个软件线程的高速缓冲存储器,GPU 730可以包括成百上千个正在并行运行的处理核或“流式多处理器”(SM)732。

在一个示例实施例中,GPU 730包括多个可编程高性能处理器,其可以被称为“流式多处理器”(“SM”)732,以及包括图形基元引擎734和光栅引擎736的基于硬件的图形管线。GPU 730的这些组件配置为使用称为“扫描转换光栅化”的技术执行实时图像渲染,以在二维显示器750上显示三维场景。在光栅化中,将3D场景的几何图形构造块(例如,点、线、三角形、四边形,网格等)映射到显示器的像素(通常通过帧缓冲存储器)。

GPU 730将3D模型的几何图形构造块(即,诸如三角形的多边形图元)转换为2D图像的像素,并为每个像素分配初始颜色值。图形管线可以通过定义或调整像素的颜色值,将阴影、透明度、纹理和/或颜色效果应用于图像的各部分。可以对最终像素值进行抗混叠、滤波并提供给显示器750以进行显示。多年来,许多软件和硬件的进步使用光栅技术以实时图形所需的帧速率(即每秒30至60帧)以在一个或更多个显示器750上以高显示分辨率(例如4096x 2160像素或更高)来改善主观图像质量。

为了使GPU 730能够以有效的方式实时地执行射线追踪,GPU提供了耦合到一个或更多个SM 732的一个或更多个“TTU”738。TTU738包括被配置为执行(或加速)射线追踪算法中常用的操作的硬件组件。TTU 738的目标是将射线追踪中的操作加速到一定程度,以使射线追踪的功能带给实时图形应用程序(例如游戏),从而实现高质量的阴影、反射和全局照明。由TTU 738产生的结果可以与在GPU 730中执行的其他与图形有关的操作一起使用或作为其替代。

更具体地,SM 732和TTU 738可以协作以将射线投射到3D模型中并确定该射线是否以及在何处与模型的几何图形相交。射线追踪直接模拟在虚拟环境或场景中传播的射线。射线相交的结果与表面纹理、观察方向和/或照明条件一起用于确定像素颜色值。由与TTU 738配合使用的SM 732进行的射线追踪允许计算机生成的图像以与真实世界的照片或视频无法区分开的方式捕获阴影、反射和折射。由于部分地由于需要追踪大量的射线,因此射线追踪技术比光栅化在计算上更加密集,因此TTU 738能够在硬件中加速该过程中某些计算量更大的方面。

给定如上所述构造的BVH,TTU738执行树搜索,其中射线访问的树中的每个节点对于每个后代分支或叶子都有包围体,并且射线仅访问其后代的分支或叶子,这些分支或叶子的相应包围体与之相交。以这种方式,TTU 738仅显式地测试少量图元以进行相交,即驻留在被射线相交的叶节点中的图元。在示例非限制性实施例中,TTU 738加速树遍历(包括射线-体测试)和射线-图元测试。作为遍历的一部分,它还可以处理至少一级实例变换,将射线从世界空间坐标转换为实例网格的坐标系。在示例性非限制性实施例中,TTU 738以MIMD方式完成所有这些操作,这意味着一旦在TTU内部就独立地处理射线。

在示例非限制性实施例中,TTU 738作为SM(流式多处理器)732的服务方(协处理器)运行。换句话说,示例非限制性实施例中的TTU 738不是独立运行,而是遵循SM 732的命令以比SM 732自己执行更高效地执行某些与计算密集的射线追踪相关的任务。在其他实施例或体系结构中,TTU 138可以具有更多或更少的自治权。

在所示的示例中,TTU 738通过SM 732指令接收命令,并将结果写回到SM寄存器文件。对于许多用例(例如,具有最多两个实例化级别的不透明三角形),TTU 738可以为射线追踪查询提供服务,而无需与SM 732进一步交互。更复杂的查询(例如,涉及经过alpha测试的三角形,除三角形以外的其他图元或两个以上的实例化级别)可能需要多次往返(尽管此处的技术通过为TTU 738提供增强的功能而无需向调用SM寻求帮助来自动执行射线-包围体交叉测试,从而为某些类型的几何图形减少了此类“往返”的需求)。除了追踪射线,TTU738还可以执行更一般的空间查询,其中AABB或两个AABB之间的挤压体积(我们称为“光束”)代替了射线。因此,尽管TTU 738特别适合于加速与射线追踪有关的任务,但是它也可以用于执行除射线追踪之外的任务。

因此,TTU 738会针对广范围的包围体自主地执行每条射线的测试,并且可以剔除不与该射线相交的任何包围体。遍历协处理器从约束场景中所有内容的根节点开始,针对较小(可能重叠)的子包围体测试每个射线,这些子包围体又反过来约束BVH的后代分支。射线跟随射线指向其他节点的包围体的子指针,直到到达BVH的叶子或末端节点(体积)为止。

一旦TTU 738遍历加速数据结构以到达与射线相交并包含几何图元的终端或“叶”节点(可以由一个或更多个包围体表示),它将执行加速的射线图元相交测试,以确定射线是否与该图元相交(并因此与该图元定义的物体表面相交)。射线图元测试可以提供有关射线相交的图元的其他信息,这些信息可用于确定着色和可视化所需的表面的材料属性。通过加速数据结构的递归遍历使遍历协处理器能够发现射线相交的所有物体图元,或者发现射线相交的最接近(从视点的角度来看)的图元(在某些情况下,这是根据沿射线的视点唯一可见的图元)。参见例如Lefrancois等人的NVIDIA Vulkan射线追踪教程(NVIDIA VulkanRay Tracing Tutorial),2019年12月,https://developer.nvidia.com/rtx/raytracing/vkray。

如上所述,TTU 138还加速了每条射线从世界空间变换到物体空间,以获得图元越来越细的包围体封装,并减少了这些图元在场景中的重复。如上所述,在场景中以不同的位置、方向和比例多次复制的物体可以在场景中表示为实例节点以及指向物体空间BVH的指针,这些实例节点将世界空间BVH中的边界框和叶节点与可以应用于世界空间射线的转换相关联以将其转换为物体坐标空间。这避免了在世界空间中多次复制物体空间BVH数据,从而节省了内存和相关的内存访问。实例变换通过将射线转换为物体空间而不是要求将几何图形或包围体层次结构转换为世界(射线)空间来提高效率,并且还与图形处理执行以可视化图元的其他常规光栅化过程兼容。

示例射线追踪过程

图8示出了可以由SM 732执行并由TTU 738加速的示例性射线追踪阴影管线800。射线追踪阴影管线800由SM 732调用射线生成810并向TTU738发出相应的射线追踪请求来开始。射线追踪请求标识投射到场景中的单个射线,并要求TTU 738搜索具有SM 732也指定的加速数据结构的交点。TTU 738遍历(图8的框820)加速数据结构以确定射线与体积细分以及加速数据结构所表示的相关三角形之间的交叉或潜在交叉。潜在的交叉可以通过在加速数据结构中找到被射线相交的包围体来识别。非相交包围体的后代不需要检查。

对于相交的包围体内的三角形,TTU 738射线图元测试块1020执行相交830处理以确定射线是否与图元相交。TTU 738将交叉信息返回给SM 732,SM 732可以响应于交叉确定执行“任何击中”阴影操作840。例如,SM 732可以对相交的图元执行(或让其他硬件执行)纹理查找,并根据适当的纹理像素值决定如何为可视化射线的像素着色。由于TTU 738可以按任意顺序返回场景中具有不同几何图形的多个相交点,因此SM 732会追踪此类结果。

图9是流程图,概述了TTU 738与SM 732协同执行的上述射线追踪操作的示例。图9操作由TTU 738与与其交互的SM 732配合进行。因此,738可以从SM 732接收射线的标识并且遍历状态,该遍历状态枚举该射线必须遍历的一个或更多个BVH中的一个或更多个节点。TTU 738确定射线与BVH数据结构的哪个包围体相交(“射线完成”测试912)。TTU 738随后还可以确定射线是否与相交的包围体中的一个或更多个图元相交以及相交了哪些三角形(“射线-图元测试”920)–或如果TTU自身执行起来很复杂SM 732也可以在软件中执行此测试。在示例性非限制性实施例中,complet指定每个complet的包围体层次结构的根或内部节点(即,体积),包围体层次结构具有其他complet的子项或每个complet单一类型的叶节点。

首先,TTU 738检查射线的遍历状态。如果TTU 738为射线保持的堆叠是空的,则遍历完成。如果栈顶上有一个条目,则遍历协处理器738向存储子系统发出请求以检索该节点。然后,遍历协处理器738执行包围体测试912以确定BVH数据结构的包围体是否被SM 732指定的特定射线相交(步骤912、914)。如果包围体测试确定包围体未与射线相交(步骤914中为“否”),则无需执行任何进一步的可视化测试,并且TTU 738可以将此结果返回给发出请求的SM 732。这是因为,如果射线错过包围体(如图1A中的包围体110所示),则射线将错过被测试的包围体内的所有其他较小的包围体以及包围体包含的任何图元。

如果由TTU 738执行的包围体测试显示包围体被射线相交(步骤914中的“是”),则TTU确定是否可以将包围体细分为较小的包围体(步骤918)。在一个示例实施例中,TTU 738本身不必执行任何细分。而是,BVH中的每个节点都有一个或更多个子项(其中每个子项是BVH中的叶子或分支)。对于每个子项,都有一个或更多个包围体和一个指向分支或叶节点的指针。当射线使用TTU 738处理节点时,它正在针对该节点的子项的包围体进行自我测试。射线只将那些击中代表性包围体的分支或叶子的堆栈条目推入其堆栈。在示例实施例中,当射线提取节点时,它不会针对该节点的包围体进行测试,而是针对该节点的子节点的包围体进行测试。TTU 738按由射线配置确定的顺序将其包围体被射线撞击的节点推到射线的遍历堆栈(例如,图13中的遍历堆栈1302)上。例如,可以按节点在内存中出现的顺序,或它们沿着射线的长度出现的顺序或其他某种顺序将节点推到遍历堆栈上。如果存在包围体的进一步细分(步骤918中的“是”),则访问包围体的那些进一步细分,并且对每个所得细分包围体执行包围体测试,以确定哪些细分包围体是被射线相交而哪些不相交。在该递归过程中,一些包围体可以通过测试914来消除,而其他包围体可以导致通过TTU 738递归地应用步骤912-918来针对交叉来进一步和对进一步的细分进行测试。

一旦TTU 738确定由射线相交的包围体是叶节点(步骤918中的“否”),则TTU 738和/或SM 732执行图元(例如,三角形)交叉测试920以确定是否射线与相交的包围体中的图元相交,并且射线与哪些图元相交。因此,TTU 738执行相交的后代分支节点的深度优先遍历,直到到达叶节点为止。TTU 738处理叶节点。如果叶节点是图元范围,则TTU 738或SM732将它们相对于射线进行测试。如果叶节点是实例节点,则TTU 738或SM 732应用实例变换。如果叶节点是项目范围,则TTU 738将它们返回给请求的SM732。在示例非限制性实施例中,SM 732可以命令TTU 738执行不同种类的射线-图元相交测试并根据来自应用程序(或运行该应用程序的软件堆栈)的操作报告不同的结果,并由SM中继到TTU。例如,SM 732可以命令TTU 738报告相交测试揭示的最近的可见图元,或报告射线相交的所有图元,而不管它们是否是最近的可见图元。SM 732可以将这些不同的结果用于不同类型的可视化。或者,一旦TTU 738报告了射线-complet测试结果,SM 732即可自行执行射线-图元相交测试。TTU738处理完叶节点后,可能会有其他分支节点(较早推送到射线的堆栈上)进行测试。

示例非限制性TTU 738硬件实现

图10示出了TTU 738的示例简化框图,该TTU 738包括配置为执行如上所述的加速遍历操作的硬件。在一些实施例中,TTU 738可以具有支持的叶节点图元的相交测试的使用短堆栈遍历以及α图元和不支持的叶节点图元(项)的中间遍历返回,执行包围体层次的深度优先遍历。TTU 738包括确定射线是否与包围体相交的专用硬件,以及确定射线是否与树数据结构的图元相交的专用硬件。

更详细地,TTU 738包括交叉点管理块1022、射线管理块1030和堆栈管理块1040。这些块中的每个(以及图10中的所有其他块)可以构成由逻辑门、寄存器、硬件嵌入式查找表或其他组合逻辑等实现的专用硬件。

射线管理块1030负责管理关于由SM 732向射线管理块指定的射线的信息并执行与之相关的操作。堆栈管理块1040与遍历逻辑1012一起工作以管理关于BVH加速数据结构的遍历的信息并执行与遍历BVH加速数据结构有关的操作。遍历逻辑1012由射线-complet测试块1010的结果指导,该射线-complet测试块1010根据需要使用实例变换来测试射线管理块1030指示的射线与BVH表示的体积细分之间的交点。射线-complet测试块1010经由作为TTU 738的一部分的L0complet高速缓存1052从存储器740检索关于BVH的附加信息。射线-complet测试块1010的结果通知遍历逻辑1012是否需要进一步递归遍历。堆栈管理块740维护堆栈,以在遍历逻辑1012从BVH的一个级别遍历到另一级别时追踪状态信息,其中,随着遍历逻辑遍历更深的BVH以及遍历逻辑在BVH中向上遍历时将堆栈中的所有项移出,堆栈管理块1040将项目推入堆栈。堆栈管理块1040能够在SM请求的任何时间向请求SM 732提供状态信息(例如,中间或最终结果)。

交点管理块1022使用所需的实例变换来管理关于射线和图元之间的交点的信息并执行与之相关的操作。射线-图元测试块1020根据需要通过作为TTU 138一部分的L0图元高速缓存1054从存储器140中检索关于几何图形的信息。交叉管理块1022由射线-图元测试和变换块1020执行的交叉测试块的结果通知。因此,射线-图元测试和变换块120将相交结果提供给相交管理块1022,相交管理块1022向请求SM 732报告几何图形击中和相交。

堆栈管理单元1040检查遍历状态以确定需要检索什么类型的数据以及哪个数据路径(完整或图元)将消耗它。在包括一个或更多个射线complet测试块1010和一个或更多个遍历逻辑块1012的TTU 738的射线complet测试路径中确定包围体的交叉。complet指定包围体的根节点或内部节点。因此,complet可以为射线-complet测试定义一个或更多个包围体。在本文的示例实施例中,complet可以定义一个或更多个“子”包围体(无论它们是否表示叶节点),它们不一定各自具有后代,但是TTU将并行测试其与射线包围体的交叉,以确定是否需要测试与多个包围体关联的几何图元的交叉。

TTU 738的射线-complet测试路径识别射线与哪些包围体相交。与射线相交的包围体需要进一步处理,以确定与相交的包围体关联的图元是否相交。在包括一个或更多个射线-图元测试和变换块1020以及一个或更多个交叉管理块1022的射线图元测试路径中确定图元的交叉。

TTU 738从一个或更多个SM 732接收查询以执行树遍历操作。该查询可以请求射线是否与BVH数据结构中的包围体和/或图元相交。该查询可以识别射线(例如,射线的原点、方向和长度)以及BVH数据结构和遍历状态(短堆栈),其包括一个或更多个引用该射线将要访问的一个或更多个包围体层次结构中的节点条目。该查询还可以包括关于在遍历期间射线如何处理特定类型的相交的信息。可以将射线信息存储在射线管理块1030中。可以基于射线-图元测试的结果来更新所存储的射线信息(例如,射线长度)。

TTU 738可以请求从TTU 738外部的存储器中检索在查询中标识的BVH数据结构。BVH数据结构的检索部分可以缓存在TTU内738的零级(L0)高速缓存1050中,因此该信息可用于其他时间相关的TTU操作,从而减少了存储器1040的访问。射线-complet测试所需的BVH数据结构的部分可被存储在L0complet高速高速缓存1052中,并且射线-图元测试所需的BVH数据结构的部分可被存储在L0图元高速缓存1054中。

在complet高速缓存1052中获得请求的遍历步骤所需的complet的信息之后,射线-complet测试块1010确定与射线相交的包围体。在执行此测试时,可以将射线从包围体层次结构的坐标空间转换到相对于complet定义的坐标空间。针对与complet的子节点关联的包围体测试射线。在示例性非限制性实施例中,未针对complet自己的包围体测试射线,因为(1)TTU 738先前在测试引用此complet的父包围体子项时针对相似的包围狂测试了射线,并且(2)complet包围体的目的是定义一个局部坐标系,在该坐标系中子包围体可以以压缩形式表示。如果射线与任何子包围体相交,则将结果推入遍历逻辑以确定将相应的子指针推入遍历堆栈的顺序(进一步的测试可能需要遍历逻辑1012向下遍历到BVH的下一个级别)。递归地重复这些步骤,直到遇到BVH的相交叶节点为止。

射线complet测试块1010可以提供射线-complet交叉到遍历逻辑1012。使用射线-complet测试的结果,遍历逻辑1012创建要被推送到堆栈管理块1040的堆栈条目。堆栈条目可以指示内部节点(即,包括一个或更多个子节点的节点),需要通过射线-complet测试块1010针对射线交叉进行进一步测试的内部节点和/或在相交的叶节点中标识的三角形需要通过射线-图元测试和变换块1020针对射线相交进行测试。射线-complet测试块1010可以在堆栈中标识的内部节点上重复遍历,以确定射线相交的BVH中的所有叶节点。在示例性非限制性实施例中,射线-complet测试块1010执行的精确测试将由模式位、射线操作(参见下文)和击中剔除来确定,并且TTU 738可以将中间以及最终结果返回至SM732。】

射线-图元交叉测试

再次参考图11,TTU 738还具有加速相交测试的能力,该相交测试确定射线是否与特定几何图形或图元相交。对于某些情况,几何图形足够复杂(例如,由曲线或其他抽象构造所定义,而不是例如顶点所定义),以致在某些实施例中,TTU 738可能无法帮助进行射线-图元相交测试。在这种情况下,TTU 738只是将射线-complet交叉测试结果报告给SM732,而SM 732本身会执行射线-图元相交测试。在其他情况下(例如,三角形),TTU 732自身可以执行射线-三角形交叉测试,从而进一步提高了整个射线追踪过程的性能。为了完整起见,下面描述TTU 738如何执行或加速射线-图元交叉测试。

如上所述,被发现与射线相交的叶节点识别(包围)可能与射线相交或不与射线相交的图元。TTU 738的一种选择是向SM 732提供例如在相交的叶节点中识别出的几何图形的范围以进行进一步处理。例如,SM 732自身可以根据TTU 738提供的信息,确定所识别的图元是否被射线相交。为了从SM 732卸载该处理并从而使用TTU 738的硬件对其进行加速,堆栈管理块1040可以发出对射线-图元的请求,并且变换块1020对TTU的射线-complet测试块1010识别出的相交的叶节点内的图元执行射线-图元测试。在一些实施例中,SM 732可以发出对射线-图元测试的请求以测试特定范围的图元和转换块1020,而与如何识别该几何图形范围无关。

在确保请求的射线-图元测试所需的图元数据在基元高速缓存1054中可用之后,射线-图元和变换块1020可使用存储在射线管理块1030中的射线信息确定与射线相交的基元。射线-图元测试块1020向交点管理块1022提供确定为被射线相交的基元的标识。

交叉管理块1022可以将射线-图元测试的结果返回给SM732。射线-图元测试的结果可以包括相交图元的标识符,距离射线原点的交叉距离以及其他与相交基元的属性。在一些实施例中,交叉管理块1022可以基于来自射线-图元和变换块1020的先前相交结果来修改现有的射线-图元测试(例如,通过修改射线的长度)。

交叉管理块1022还可以追踪不同类型的图元。例如,不同类型的三角形包括在相交时将阻挡射线的不透明三角形,以及在相交时可能会或可能不会阻挡射线或可能需要SM进行其他处理的alpha三角形。射线是否被透明三角形遮挡可能例如取决于映射到三角形上的纹理、该纹理所占据的三角形面积以及纹理修改三角形的方式。例如,在某些实施例中,有图案的玻璃(例如,彩色玻璃)要求SM 732追踪透明的物体撞击,以便可以按射线参数顺序对其进行分类和着色,并且通常不会实际上阻挡射线。同时,alpha“修剪”功能可根据映射到图元的纹理形状来修剪图元的形状,例如,将叶子形状切成三角形。(请注意,在光栅图形中,有图案的玻璃通常称为“alpha混合”,而修剪则称为“alpha测试”)。在其他实施例中,TTU 738可以将透明击中推送到存储器中的队列以供SM 732以后处理,并通过向纹理单元发送请求来直接处理修剪后的三角形。每个三角形可包括指示符,以指示三角形的类型。相交管理块1022被配置为维持用于追踪不同类型的相交三角形的结果队列。例如,结果队列(例如,图14中的结果队列1410)可以在一个队列1412中存储一个或更多个相交的不透明三角形标识符,并且在另一队列1414中存储一个或更多个透明三角形标识符。

对于不透明的三角形,可以在TTU 738中完全确定不太复杂的几何图形的射线交叉,因为不透明的三角形的区域会阻止射线穿过三角形的表面。对于透明三角形,在某些实施例中,无法在TTU 738中完全确定射线交叉,因为TTU 738基于三角形的几何图形执行相交测试,并且可能无法访问三角形的纹理和/或纹理所占的三角形面积(在其他实施例中,可以通过图形管线的纹理映射块向TTU提供纹理信息)。为了完全确定三角形是否相交,可以将关于射线-图元和变换块1020确定要相交的透明三角形的信息发送到SM 732,以便SM全面确定该三角形是否影响沿射线的可见性。

SM 732可以确定射线是否与与透明三角形相关联的纹理相交和/或射线是否将被该纹理阻挡。在一些情况下,SM 732可以基于该确定将修改的查询发送到TTU 738(例如,如果射线被纹理阻挡则缩短射线)。在一个实施例中,TTU 738可以被配置为将确定为与射线相交的所有三角形返回给SM 732,以进行进一步处理。因为就接口和线程同步而言,将每个三角形交叉返回到SM 732进行进一步处理都是昂贵的,所以TTU 738可以配置为相交但可证明能够隐藏而不会对所得场景造成功能上的影响的隐藏三角形。例如,因为向TTU 738提供了三角形类型信息(例如,三角形是不透明的还是透明的),所以TTU 738可以使用三角形类型信息来确定沿着射线被另一个相交的不透明三角形遮挡的相交三角形,并且因此不必将其包含在结果中,因为它们不会影响沿射线的可见性。如果TTU 738知道三角形被不透明的三角形沿射线遮挡,则可以从结果中隐藏被遮挡的三角形,而不会影响所得场景的可视化。

交叉点管理块1022可以包括结果队列,该结果队列用于存储与三角形ID相关联的击中以及与射线击中三角形的点有关的信息。当确定射线与不透明三角形相交时,可以将三角形的标识和与交点距离射线原点的距离存储在结果队列中。如果确定射线与另一个不透明三角形相交,则如果相交点到射线原点的距离大于已存储在结果队列中的不透明三角形相交的距离,则可以从结果中忽略另一个相交的不透明三角形。如果相交点距射线原点的距离小于已存储在结果队列中的相交不透明三角形的距离,则另一个相交的不透明三角形可以替换结果队列中存储的不透明三角形。测试了查询的所有三角形之后,可以将在结果队列中存储的不透明三角形信息和交叉信息发送到SM732。

在一些实施例中,一旦识别出不透明三角形交叉,则相交管理块1022可以缩短存储在射线管理块1030中的射线,以使得相交的不透明三角形(沿着射线)之后的包围体(可以包括三角形)将不会被识别为与射线相交。

相交管理块1022可以将关于相交的透明三角形的信息存储在单独的队列中。所存储的关于相交的透明三角形的信息可以被发送到SM 732,以供SM判断射线是否与与三角形相关联的纹理相交和/或该纹理是否阻挡射线。SM可以基于该确定,将该确定的结果返回给TTU 738和/或修改查询(例如,如果该射线被纹理阻挡,则缩短该射线)。

如以上所讨论的,TTU 138允许快速遍历加速数据结构(例如,BVH),以确定数据结构中的哪些图元(例如,用于生成场景的三角形)被查询数据结构(例如,射线)所相交。例如,TTU 738可以确定在加速数据结构中的哪些三角形被射线相交并将结果返回给SM732。但是,就接口和线程同步而言,将每个三角形交叉处的结果返回给SM 732的成本很高。TTU738提供了一种硬件逻辑,该逻辑被配置为隐藏那些被证明能够隐藏而对最终场景没有功能影响的项目或三角形。结果返回给SM的减少和线程之间的同步步骤大大提高了遍历的整体性能。在本申请中公开的TTU 738的示例非限制性实施例提供了在没有SM 732干预的情况下在TTU 738内丢弃的一些交叉,使得更少的交叉返回到SM 732,并且SM 132不必检查所有相交的三角形或项目范围。

通过TTU 738和SM 732实例化管道实施的示例

下面描述示例实施例中的TTU 738如何执行实例化和相关联的变换。

图12A的射线追踪管线流程图的更详细的图显示了代表性用例的数据流和组件之间的交互:针对包含几何图元的场景追踪射线,并在硬件中处理实例转换。在一个示例非限制性实施例中,图12A的射线追踪管线本质上是软件定义的(在示例实施例中,这是由SM732确定的),但是广泛使用了TTU 738的硬件加速。关键组件包括SM 732(以及其余的计算管线)、TTU 738(充当SM的协处理器)以及L1高速缓存和下游存储系统,TTU从这些组件中获取BVH和三角形数据。

图12A中所示的管线示出了可以由开发系统提前执行包围体层次创建1202。还示出了在示例实施例中,作为阴影(可以包括照明和纹理),由SM 732或其他软件执行或控制的射线创建和分布1204。示例管线包括分别由TTU 738执行的“顶层”BVH树遍历1206、射线变换1214、“底层”BVH树遍历1218和射线/三角形(或其他图元)交点1226。TTU 738和SM 732之间的握手确定了TTU 738的工作方式和顺序,因此不必按所示顺序执行操作。

SM 732一次向TTU 738呈现一束或多束射线。SM 732呈现给TTU 738的每条射线都可以包括射线的几何参数、遍历状态以及射线的射线标记、模式标记和射线操作信息。在示例实施例中,射线操作(RayOp)提供或包括辅助算术和/或逻辑测试,以抑制、覆盖和/或允许交叉点的存储。遍历栈也可以由SM 732使用,以将某些状态信息传达给TTU 738,以便在遍历中使用。新的射线查询可以从显式遍历堆栈开始。但是,对于某些查询,可以提供少量的堆栈初始化器以开始给定类型的新查询,例如:从complet开始的遍历;射线与一定范围的三角形的交叉;射线与一定范围的三角形的交叉,然后从complet开始进行遍历;针对给定三角形从三角形缓冲区获取的顶点,等等。在一些实施例中,使用堆栈初始化器代替显式堆栈初始化可提高性能,因为堆栈初始化器需要较少的流处理器寄存器并减少了需要从流处理器传输到TTU的参数数量。

在示例实施例中,当查询与特定类型的包围体相交时或与特定图元类型的图元相交时,SM 732随每个查询(例如,射线)呈现的一组模式标志可以至少部分地控制TTU 738将如何处理查询。SM 732提供给TTU 738的模式标志使SM和/或应用程序能够例如通过RayOp指定辅助算术或逻辑测试以抑制、覆盖或允许存储交叉的能力。模式标志可以例如使得能够根据诸如与每个包围体和/或图元相关联的深度(或距离),与距离原点或射线的距离等(尤其是物体的距离)有关的包围体或图元的大小等方面来改变遍历行为。应用程序可以针对相交测试使用此功能来动态和/或选择性地启用/禁用物体集,而不是特定的查询集或查询组,例如,允许适用于在应用程序状态发生变化时(例如,在门打开或关闭时)使用的不同版本的模型,或提供根据射线长度选择的不同版本的模型,以实现某种形式的几何细节水平,或允许某些类别的射线中的特定物体集使某些层在特定视图中可见或不可见。

除了可以分别为射线complet交叉和射线图元交叉指定的模式标志集之外,射线数据结构还可以指定其他与射线操作(RayOp)相关的参数,例如射线标志、射线参数和RayOp测试。射线标志可以由TTU 738使用,以控制遍历行为、背面剔除和处理各种子节点类型的各个方面,取决于可选的RayOp测试的通过/失败状态。RayOp测试以增加一些复杂性为代价,为TTU 738的功能增加了灵活性。TTU 138为其正在处理的每个活动射线保留一个“射线槽”,并且可以在遍历期间将射线标志、模式标志和/或RayOp信息存储在TTU内的相应射线槽缓冲器中。

在图12A所示的示例中,TTU 738执行顶层树遍历1206和底层树遍历1218。在示例实施例中,BVH的二级遍历使能对动态场景变化进行相应的快速射线追踪。

在一些实施例中,在进入顶层树遍历时,或在顶层树遍历中,在BVH中遇到指定顶层变换的可选实例节点1205。实例节点1205(如果存在)向TTU指示以实例节点1205为根的子树与可选世界空间坐标系对齐,在实例节点1205中为可选世界空间坐标系定义了来自世界空间的变换。在同时提交的题为“利用替代性世界空间变换的射线追踪硬件加速(RayTracing Hardware Acceleration with Alternative World Space Transforms)”的美国申请16 897745中描述了这些顶级实例节点及其使用,该申请通过引用整体并入本文。

加速结构(TLAS)的顶层包含世界空间坐标中的几何图形,并且加速结构(BLAS)的底层包含物体空间坐标中的几何图形。对于TLAS遍历和BLAS遍历,TTU分别维护射线状态和堆栈状态,因为它们实际上是独立的遍历。

如上所述,SM通过在发送给TTU的射线查询中包括堆栈初始化complet,来在发起新的射线查询或重新启动射线查询时通知BVH中TTU的位置以开始射线遍历。堆栈初始化complet包含指向要遍历的子树的根的指针。

射线变换1214通过将可以在第一坐标空间(例如,世界空间)中的顶层遍历中使用的射线转换到底层遍历的BVH的不同坐标空间(例如,物体空间),提供从顶层树遍历1206到底层树遍历1218的适当过渡。在先前的文献中描述了使用两级遍历的示例BVH遍历技术,例如,参见Woop,“用于动态场景的射线追踪硬件架构(A Ray Tracing HardwareArchitecture for Dynamic Scenes)”,萨尔兰德大学,2004,但是实施例不限于此。

示例顶层树遍历

TTU 738进行的顶层树遍历1206从L1高速缓存1212接收complet,并向射线变换1214提供实例以进行变换,或向SM 732提供未击中/结束输出1213以进行最接近击中着色器1215的处理。SM(此块还可以基于非叶子节点/无击中条件来递归地操作)。在顶层树遍历1206中,下一个complet取回步骤1208从存储器和/或高速缓存层次结构中获取针对射线交叉要测试的下一个complet,并且在所获取的complet中的包围体上进行射线-包围体相交测试。

如上所述,实例节点将一个BVH连接到处于不同坐标系中的另一个BVH。当相交的包围体的子项是实例节点时,射线变换1214能够从L1高速缓存1216中检索适当的变换矩阵。TTU738使用适当的变换矩阵将射线变换为子BVH的坐标系。已经通过引用并入的申请号为14697480的美国专利申请描述了将树中的第一组节点连接到第二组节点的变换节点,其中第一组节点和第二组节点位于不同的坐标系中。示例实施例中的实例节点可以类似于美国申请号14697480中的变换节点。在图12B中所示的TTU 738的替代的非实例化模式中,TTU不执行“底”层树遍历1018,并且非实例树BVH遍历由框1208、1210例如仅使用一个堆栈来执行。TTU 738可以基于它从BVH和/或查询类型中读取的内容在图12A实例化操作和图12B非实例化操作之间切换。例如,特定的查询类型可能会限制TTU仅使用非实例化操作。在这种查询中,任何相交的实例节点都将返回给SM。

在一些非限制性实施例中,在获取下一个complet之前,对所获取的complet中的每个包围体执行步骤1210中的射线-包围体交叉测试。其他实施例可以使用其他技术,例如以深度优先的方式遍历顶层遍历BVH。已经通过引用并入的专利号为9582607美国专利描述了可以在示例实施例中使用的一个或更多个complet的结构和内容。专利号为9582607的美国专利也描述了complet的示例遍历。

当确定包围体被射线相交时,针对随后的与射线的相交测试和遍历第相交的包围体的子包围体(或对其的引用)进行追踪。在示例实施例中,一个或更多个堆栈数据结构用于追踪要随后测试与射线相交的子包围体。在一些示例实施例中,可以使用小尺寸的遍历堆栈来追踪要通过顶层树遍历1206的操作遍历的complet,和要针对交叉进行测试的图元,并且可以使用较大的局部栈数据结构用于遍历底层树遍历1218中的遍历状态。图13示出了示例遍历栈1302,其具有底层堆栈入口1304和顶层堆栈入口1306。

底层树遍历的示例

在底层树遍历1218中,下一个complet获取步骤1222在步骤1224中从内存和/或缓存层次结构1220中获取针对射线交叉要进行测试的下一个complet,并在获取的complet中的包围体上进行射线包围体交叉测试。如上所述,底层树遍历可以包括具有与在高层树遍历中遍历的包围体不同的坐标系中的包围体的complet。底层树遍历还从L1高速缓存中接收complet,并且可以基于非叶子/无击中条件在自身内部进行递归或迭代操作,并且还伴随基于丢失/结束检测的顶层树遍历1206。随着将射线转换到恢复的较低级别complet的坐标系中,可以确定射线与较低级别BVH中的包围体的交点。然后将在较低级别的树遍历中被射线相交的叶子包围体提供给射线/三角形相交1226。

底层树遍历1218的叶子输出被提供给射线/三角形交叉1226(具有L0高速缓存访问以及通过L1高速缓存1228检索三角形的能力)。L0 complet和三角形高速缓存可以是TTU138内部的小型只读高速缓存。当到达某些叶节点而没有遍历实例BVH时,射线/三角形交叉1226也可以从顶级树遍历1206接收叶输出。

在处理完图元范围内的所有图元之后,交叉口管理单元检查结果队列(例如,图14中的结果队列1410)的状态,并制作数据包以发送到堆栈管理单元和/或射线管理用于更新射线的属性和遍历状态,设置射线的下一个遍历步骤和/或将射线返回到SM 732的单元(如有必要)。如果结果队列包含在处理图元范围时发现的不透明1412或阿尔法(alpha)1414交点,则交点管理单元将结果队列中最近的不透明交点的参数长度(t)发信号给射线管理单元以记录为射线tmax从而缩短射线。为了更新遍历状态以设置射线的下一个遍历步骤,交叉管理单元会向堆栈管理单元发送信号,告知结果队列中是否存在来自图元范围的不透明交叉,结果队列中是否存在一个或多个阿尔法交叉,结果队列是否已满,是否在图元范围中找到尚未返回到SM其他阿尔法交叉,并且阿尔法交叉不存在在结果队列中和在SM消耗结果队列的内容之后要测试的射线在图元范围中的下一个阿尔法图元的索引(根据结果队列中当前图元范围,具有最高存储顺序的阿尔法图元之后的范围中的下一个图元的索引)中。

当堆栈管理单元1040从交叉管理单元1022接收到分组时,堆栈管理单元1040检查该分组以确定完成遍历步骤并开始下一个所需的下一动作。如果来自交叉点管理单元1022的分组指示在图元范围内发现了不透明的交叉,并且射线模式位指示一旦找到任何交叉点,射线将完成遍历,则堆栈管理单元1040将射线及其结果队列返回到具有指示遍历已完成(完成标志设置和/或空的顶层和底层堆栈)的遍历状态的SM。如果来自交叉管理单元1022的数据包(分组)指示结果队列中存在不透明或阿尔法交叉,并且在还没有返回到SM的图元范围的处理期间射线遇到的结果队列中不存在图元范围的剩余的阿尔法交集,则堆栈管理单元1040将射线和结果队列返回到SM,并且将其遍历状态修改为设置剔除不透明位以防止在最高阿尔法图元交叉从图元范围返回到射线结果队列中的SM之后进一步处理图元范围中的不透明图元和前进到第一阿尔法图元的图元范围起始索引。如果来自交叉口管理单元1022的分组指示当射线处理图元范围时未发现不透明或阿尔法交叉,则堆栈管理单元1040从活跃遍历堆栈弹出堆栈条目的顶部(对应于完成的图元范围)。如果来自堆栈管理单元1040的分组指示结果队列中存在不透明的交叉中的任一个,并且射线模式位不指示一旦找到任何交叉和/或结果队列中存在阿尔法交叉,则射线将完成遍历,但是在尚未返回给SM的结果队列中不存在的图元范围中未找到的剩余阿尔法交叉,堆栈管理单元1040将堆栈条目的顶部(对应于完成的图元范围)弹出活跃遍历堆栈并修改结果队列的内容,以指示结果队列中存在的所有交集都来自完成处理的图元范围。

如果活跃堆栈是底部堆栈,而底部堆栈为空,则堆栈管理单元1040将活跃堆栈设置为顶部堆栈。如果顶部堆栈是活跃堆栈,并且活跃堆栈为空,则堆栈管理单元1040将射线及其结果队列返回到具有指示遍历已完成(完成标志设置和/或为空顶层和底层堆栈)的遍历状态的SM。如果活跃栈包含一个或更多个堆栈条目,则堆栈管理单元1040检查顶部堆栈条目并开始下一遍历步骤。在共同待决的申请号为16101148的美国专利申请“保守水密射线三角形相交(Conservative Watertight Ray Triangle Intersection)”和申请号为16101196美国专利专利“处理乱序的不透明和阿尔法射线/图元交叉的方法(Method forHandling Out-of-Order Opaque and Alpha Ray/Primitive Intersections)”中描述了与射线交叉的图元和/或图元范围的测试以及将结果返回到SM 732,在本文中通过引用方式将以上两者并入本文。

用于组合射线操作和节点掩膜划分(masking)的示例数据结构

在射线在TTU中遍历BVH的过程中,射线的遍历状态在TTU中得以维持。遍历状态可以包括一个或更多个条目的堆栈,这些条目引用树结构中要针对射线进行提取和测试的包围体和/或complet。在图13中示出了根据一些实施例的遍历堆栈1302。遍历堆栈1302可以包括任何数量的堆栈条目。在一些实施例中,堆栈1302被限制为少量的条目(例如,4个条目的“短堆栈”),使得可以使TTU和SM之间的堆栈交换更有效。在图13中,示出了底部堆叠条目1304和顶部堆叠条目1306,在它们之间有一个或更多个条目。

图14示出了根据一些实施例的示例结果队列。如其他地方所述,结果队列用于TTU,将有关到目前为止检测到的交叉的信息发送到SM。在一些实施例中,结果队列1410很小,并且可以仅容纳不透明的图元交叉结果1412和/或一个或更多个阿尔法图元交叉结果1414。然而,在其他实施例中,结果队列可以容纳更多表示检测到的交叉的条目。

图15A示出了与射线1502相对应的数据结构的一些示例内容,包括节点包含掩模1532和RayOp1520。在一些示例实施例中,射线在SM 732中生成,并且射线信息通过SM中的寄存器的方式被通信至TTU 738。在其中射线数据经由存储器传递到TTU的示例实施例中,数据结构1502或其一部分可以驻留在存储器中以由TTU读取。射线数据结构1502可以包括射线标识符1504,该射线标识符可以由TTU或SM分配以唯一地标识正在TTU中同时处理的射线、射线源1506、射线方向1508、射线开始(tmin)1510和结束(tmax)1512参数。根据一些实施例,射线信息1502还可包括射线标志1514、RCT模式标志1516(也称为RCT模式位)、RTT模式标志1518(也称为RTT模式位)和一个或更多个射线操作(RayOps)规格。每个RayOps规格可以包括射线操作操作码1520和射线测试参数(例如,射线参数A和B)。这些射线数据属性如下所述。

如下所述,使用射线的RayOp操作码、模式位、参数A和B以及每个相交的complet子物体或图元指定的一个或更多个参数(例如,ChildType(子类型)、“rval”参数或“alpha”标志),对与射线相交的每个图元或子边界框执行“RayOp”测试。在示例实施例中,在以下描述的RayOp测试中使用的ChildType和rval参数是为complet中的每个子物体或整个complet指定的,并且RayOp操作码、模式位以及参数A和B是为每个射线指定的。

在图16A中示出了根据一些实施例的数据结构1622的示例可以保存与RayOp有关的信息或complet或包围体。根据一些实施例,数据结构1622可以通过软件存储在存储器中,并且TTU可以访问存储器中的数据结构和/或可以将数据结构接收到TTU内部存储器中。数据结构1622可以包括报头信息1624、一个或更多个覆盖标志1626和rval1628。报头信息可以包括与节点有关的几何信息、节点类型信息等。覆盖标志1626和rval参数1628在下面描述。图15B示出了指定节点掩膜1522(例如8位掩膜)和RayOp 1520的另一示例性射线数据结构1530。RayOp测试可以使用rval标志1628以及覆盖标志和参数1626。

节点1622的示例报头和标志内容可以包括节点掩膜1602,该节点掩膜1622被用于使用射线的节点包含掩膜1522进行节点掩膜测试。掩膜有效标志1604可以是单个位,用于指示掩膜1602字段中的值是否有效。图16B示出了另一示例节点1600(例如实例节点)的报头和标志内容。实例节点的报头和标志信息包括实例标识符。节点1600还可以包括指向相应根complet的指针。

示例组合的射线操作和节点遮罩过程

图17示出了当在射线追踪管线处理期间检测到射线-包围体相交时可以执行的组合的射线操作和节点掩膜划分处理的过程1700的流程图。例如,相对于图12A中所示的过程当在图12所示的步骤1210和/或1224中检测到射线-包围体相交时,可以执行过程1700。在图12A中(例如,在顶层遍历中和/或在底层遍历中)。可以在射线complet测试块1110中的TTU 738中执行射线包围体相交测试1210和/或1224。

当测试检索到的complet,或更具体地说,测试包括在检索到的complet中的子包围体时,可以发生在步骤1702处的交叉检测。根据示例实施例,当处理complet时,TTU可以可选地对每个子项执行RayOp测试。在一些实施例中,仅在其相应的包围体被射线相交的子项上运行RayOp测试。

因此,在步骤1704中,确定所获取的complet具有至少一个子项,并且在步骤1706中,访问并测试子包围体。子包围体可以并行测试。在一些实施例中,每个检索到的complet具有零个或一个父complet和零个或更多个complet子项以及零个或更多个叶节点子项。在一些实施例中,每个获取的complet以父指针或偏移量引用其父complet,以压缩形式对子指针进行编码,并提供每个子结构,该结构包含子包围体和RayOp测试使用的每个子数据(例如Rval,反转RayOp结果标志)和(在叶节点的情况下)用于寻址和处理叶节点块的数据(例如,项目计数,起始图元索引,叶中的块数,指示存在阿尔法图元的标志)。在一些实施例中,可以针对所有子包围体并行地执行处理步骤1708-1714。在一些其他实施例中,处理步骤1708-1714可以针对子包围体的组逐个子地并行执行,等等。

相交的父项的每个子包围体是潜在的遍历目标。在示例实施例中,实例节点是指向另一个BVH的根节点的叶节点。在确定是否要检索与遍历的各个子节点相对应的组件之前,可以基于已恢复的complet中可用的子包围体信息,对相交的父项的子节点执行RayOp测试。

在步骤1708,针对所访问的子包围体执行为射线指定的RayOp测试。如以上关于图15A所述,可以将RayOp操作码指定为从SM 732提供给TTU 738的射线数据的一部分。在示例实施例中,当在射线-complet测试块1010处检测到射线-包围体交叉时,遍历逻辑块1012可以基于射线和相交的包围体的子节点执行RayOp测试。更具体地说,使用为子包围体积指定的射线的RayOp A,B参数和RayOp rval参数,执行由为射线指定的特定RayOp操作码指定的RayOp测试。在一些实施例中,仅对本身被发现与射线相交的子包围体执行RayOp测试。例如,当RCT单元针对complet对射线进行射线测试时,还针对与射线的交叉测试每个complet的子项包围体,并针对被发现与射线相交的每个子项执行RayOp测试。在申请号为16101180、公开号为US20200051315A1、题为“树遍历的查询特定行为修改(Query-SpecificBehavioral Modification of Tree Traversal)”的美国专利申请中描述了RayOp测试,该专利申请已通过引用并入,也已转让给Nvidia公司。

示例RayOp测试可以提供相对于基于射线参数和相交节点的参数的右侧值,基于相对于特定算术或逻辑运算的射线参数测试左侧数值。RayOp测试可以是导致对/错输出的算术或逻辑计算。特定计算(例如,RayOp A和B参数、RayOp操作码和rval参数之间的特定关系)可以是可配置的,和/或可以在硬件中预先编程。在一些实施例中,每个射线可以指定对应于各自的RayOp测试的多个操作码之一。因此,RayOp测试提供了一种高度灵活的技术,通过该技术射线可以在单个或一组基础上更改TTU 738的默认射线追踪行为。

RayOp测试可以包括但不限于算术和/或逻辑运算ALWAYS,NEVER,EQUAL,NOTEQUAL,LESS,LEQUAL,GREATER,GEQUAL,TMIN_LESS,TMIN_GEQUAL,TMAX_LESS,TMAX_GEQUAL(作为操作码)中的任何一个。在一些实施例中,在射线中指定的操作码可以是任何逻辑或算术运算。

例如,如果在提供给TTU的射线信息中将射线的RayOp操作码定义为“EQUAL”,并且RayOp A和B参数分别为0x0和0xFF,并且所访问的子包围体的RayOp rval为0x1,则RayOp测试可以是“A EQUAL rval&&B”。因此,利用上面提到的用于各种参数和操作码的值,RayOp测试得出“0x00==0x1&&0xFF”。因此,(因为这是错误的)此示例中的RayOp测试必须返回错误(false)。即,在此特定示例中,针对射线和所访问的子包围体,RayOp测试失败。

在一些实施例中,子包围体还可以具有与RayOp测试相关的翻转(“inv”)参数。如果射线还具有与RayOp关联的反转参数,并且反转参数设置为TRUE(例如1),则返回的RayOp结果可能与实际RayOp测试结果相反。例如,如果ray的翻转参数设置为TRUE,则上述示例中的RayOp测试将返回TRUE。在光栅图形中,RayOps可以与模板测试(Stencil Test)相媲美,不同之处在于,即使片段未通过深度测试,模板测试仍具有允许片段写入发生的能力。在示例实施例中,RayOps不具有将错过的complet子项转换为击中的complet子项的能力,但是在其他实施例中,TTU可以允许可编程性,因此RayOp可以将未击中当做是击中的。

RayOp测试不必具有以诸如“A EQUAL rval&&B”之类的关系布置的参数和操作码。示例实施例可以具有以任何逻辑或算术关系布置的参数和操作码。例如,在一些实施例中,该关系可以是诸如“TMIN_LESS rval”或“TMIN_LESS A&rval”的形式,表示指定的关注区域与单独的节点参数或射线参数和节点参数的组合中人任一个之间的关系。示例操作码TMIN_LESS,TMIN_GEQUAL,TMAX_LESS,TMAX_GEQUAL均使RayOp测试能够基于交叉的开始或结束(例如,上述操作码中的TMIN和TMAX可能分别表示射线进入和离开相交的体的t值(例如,bbox.tmin、bbox.tmax),并包括单独的被测节点或被测节点中的任一个以及射线参数A和/或B的各个方面。例如,针对节点对rval编码有距离时,“TMIN_LESS rval”可以表示诸如“被测节点的距离是否小于感兴趣区域的起点?(is the tested node at a distanceless than the beginning of the area of interest?)”的测试。基于除了射线的开始/结束之外的射线的方面的操作码也是可能的,并且在其他实施例中可以用于RayOp。与对射线的几何特性的某个方面进行编码的操作码相反,示例操作码ALWAYS,NEVER,EQUAL,NOTEQUAL,LESS,LEQUAL,GREATER,GEQUAL使得任意指定的左侧值与任意指定的右侧值相当。因此,示例操作码ALWAYS,NEVER,EQUAL,NOTEQUAL,LESS,LEQUAL,GREATER,GEQUAL可以用于RayOp测试,该操作取决于射线或被测节点中任一个的某些几何方面,并且还可以用于与射线和被测节点之一或两者的任何几何特性无关的RayOp测试。因此,在示例性非限制性实施例中,“FLT_TMIN_LESS”,“FLT_TMIN_GEQUAL”和“FLT_TMAX_LESS”以及“FLT_TMAX_GEQUAL”RayOp测试实际上分别评估表达式bbox.tmin<A*rval+B,bbox.tmin>=A*rval+B,bbox.tmax<A*rval+B,bbox.tmax>=A*rval+B。在一个特定的非限制性实施例中,对于这些操作,rval是FP0.6.2值,并且A和B是FP1.5.10值。而且,在一些非限制性示例实施例中,由于FLT_TMIN和FLT_TMAX测试对边界体tmin和边界体tmax值进行操作,边界体tmin和边界体tmax值可以是在相交测试中计算出的几何值,因此这些RayOp可以用于几何细节水平。(例如,其中A对应于对向像平面像素的圆锥角的余弦,B对应于射线先前反弹的累积长度,rval对应于边界体的max_length)。在一些实施例中,操作码(例如,FLT_TMIN_LESS,FLT_TMAX_LESS)提供通过与射线相关联的一个几何属性缩放并且由与射线相关联的另一几何属性偏置的射线/加速数据结构相交测试期间计算出的值与至少一个节点关联的至少一个几何参数的比较。

在步骤1710中,识别与RayOp测试结果相对应的一个或更多个模式标志。每个模式标志可以例如在射线数据结构中的预定位位置中指定,并且可以包括任意数量的位。每个模式标志将RayOp测试的结果或RayOp测试的结果与被测节点的节点类型的组合映射到TTU要采取的特定操作。在一些实施例中,分别针对射线-complet测试和图元-图元测试分别用射线分别指定模式标志。因此,响应于在步骤1710处完成RayOp测试,可在为射线指定的RCT模式标志中找到可适用的模式标志。

在以上示例中,由于RayOp测试失败,因此适用的模式标记包括“ch_f模式标记”。如上所述,“ch_f”表示针对类型为complet的交叉的子项,RayOp测试失败。

在步骤1712中,识别并执行要基于所识别的模式标记和/或射线标记执行的动作。

RCT模式标志针对每个complet子类型(例如,complet,实例叶节点,项目范围叶节点,图元范围叶节点)表达TTU如何处理针对射线和那些通过或未通过RayOp测试的射线类型的子节点的子包围体的交叉。示例RCT模式标志包括“In_f”,“In_p”,“Ir_f”,“Ir_p”,“pr_f”,“pr_p”,“ch_f”和“ch_p”。

模式标志“In_f”(“modeInstanceNodeFail”)指定当针对类型实例节点(“InstanceNode”)的相交子项的RayOp测试失败时要执行的动作。支持的动作可以包括在TTU中的处理,剔除(例如,抑制实例节点被推到遍历栈上),作为节点参考返回或返回到SM。

模式标志“In_p”(“modeItemRangePass”)指定在针对类型实例节点的相交子项的RayOp测试通过后要执行的动作。支持的动作可以包括在TTU中的处理,剔除(例如,抑制实例节点被推到遍历栈上),作为节点参考返回或返回到SM。

模式标志“Ir_f”(“modeItemRangeFail”)指定在针对类型项范围(“ItemRange”)的相交子项的RayOp测试失败时要执行的动作。支持的动作可以包括返回到SM(例如,将击中的项目范围推入结果队列),剔除(例如,将击中的项目范围抑制在结果队列中)或作为节点参考返回

模式标志“Ir_p”(“modeItemRangePass”)指定在通过RayOp测试后对类型项范围的相交子项执行的动作。支持的动作可以包括返回到SM(例如,将击中范围推入结果队列),剔除(例如,抑制击中范围存储在结果队列中)或作为节点参考返回。

模式标志“pr_f”(“modePrimitiveRangeFail”)指定在针对类型图元范围(“PrimitiveRange”)的相交的子项的RayOp测试失败时要执行的动作。支持的动作可以包括在TTU中进行处理(例如,将条目推入遍历堆栈中),剔除(例如,将三角形范围堆栈条目推入遍历堆栈中),作为节点参考返回或返回到SM。

模式标志“pr_p”(“modePrimitiveRangePass”)指定在针对图元类型范围的相交子项的RayOp测试通过后要执行的动作。支持的动作可以包括在TTU中的处理(例如,将条目推入遍历堆栈中),剔除(例如,抑制将图元范围堆栈的条目推入遍历堆栈中),作为节点参考返回或返回到SM。

模式标志“ch_f”(“modeCompletFail”)指定当针对类型complet(“complet”)的相交子项的RayOp测试失败时要执行的动作。支持的动作可能包括在TTU遍历,剔除或作为节点引用返回。

模式标志“ch_p”(“modeCompletPass”)指定当针对类型complet的相交子代的RayOp测试通过时要执行的动作。支持的动作可能包括在TTU中遍历,剔除或作为节点引用返回。

在一些实施例中,除了根据RayOp测试结果选择的模式标记之外,还可以以与射线数据中指定的一个或更多个射线标志一致的方式执行所选动作。射线标志(例如射线标志1514)可以指定独立于任何特定交叉的行为。

在示例实施例中,射线标志可以指定包围体的遍历顺序,是否在返回时弹出堆栈,当射线的tmin…tmax间隔从节点的包围体内部开始时是否向SM报告节点引用,是否在相交的第一次击中时返回,前端设置,剔除设置等。

用于遍历顺序的射线标志可以指定以下任一项:以沿着射线的参数距离的顺序进行遍历,以包围体和/或图元的存储器顺序进行遍历,减小x坐标,增加x坐标,减小y坐标,增加y坐标,减小z坐标,以及增加尿z坐标等。更具体地说,遍历顺序决定了当complet子包围体被射线相交时,堆栈条目被推入遍历堆栈的顺序。特别地,当节点被相交时,由射线标记指定的遍历顺序可以由TTU使用以确定相交节点的子节点将按哪个顺序被推入遍历堆栈中。例如,对于追踪设置为在找到的第一个击中而不是针对最近的击中上返回的阴影射线很有用,在这种情况下,希望此类射线首先针对较大的图元进行测试(因此更有可能被击中)。如果以叶节点子项的存储顺序这样的方式构建BVH是最大优先,则最好为此类射线选择t顺序以上的存储顺序,因为它更有可能更快地返回到SM以及t-排序对于这种射线是无关紧要的。

出于某些原因,可能希望更改遍历顺序(t顺序)。例如,当尝试查找最接近的三角形时,通常会希望使用-顺序,以便首先测试那些可能在参数长度上出现较早的图元。如果这些图元相交,则可能不需要测试沿射线更远的图元和complet。当试图找到任何交叉时(例如,测试一个点是否在灯光的阴影下),那么人们可能并不在乎哪些特定图元被相交,并且可能想要测试最有可能首先相交的图元。在这种情况下,BVH构建器可能会在树中更早放置最大的三角形,以便储存器顺序将首先找到它们。

在t排序可能不一致的情况下,遍历的x/y/z排序可分别用于近似t排序。具体而言,光束遍历和射线遍历的t交叉可能不一致,因为查询是不同的形状。(例如,它们可能相似但不相同)。但是,x/y/z顺序分别仅基于包围体位置,并且是一致的。如果处理过程需要在光束和射线之间共享堆栈,则可以使用一致的x/y/z排序使性能接近t阶。

用于指示是否在返回时弹出遍历堆栈的射线标志(例如,“noPopOnReturn”)可以指定是否要弹出堆栈,和/或是否在不弹出堆栈的情况下返回遍历结果。在不弹出遍历堆栈的情况下返回遍历的结果可以使SM在开始新遍历之前重新运行相同的遍历或修改堆栈。

控制击中报告的射线标志(例如,“reportOnEnter”标志)可以指定TTU仅在AABB交点t大于或等于射线的tmin时报告子项击中,并且否则的话就剔除(和/或不向SM报告)。如果在射线的指定关注区域之前该交叉点(在射线进入包围体时)发生,则即使该标志相交,该标志也可以使包围体不被报告给SM。此标志的一个示例用法是进行射线行进,在找到交叉之后,将tmin推进到该交叉的起点。重新启动时,人们可能想找到下一个交叉,但通常不希望再次报告刚刚返回的交叉。通过设置reportOnEnter标志,可以避免将交叉再次返回到SM,因为重新发射的射线不会进入该体,而是从该体内部开始。

控制是否在第一次击中时终止的射线标志(例如,“terminateOnHit”)指定TTU是在遍历期间找到的射线的第一次击中返回还是继续遍历,直到它可以返回找到的参数最近击中。

指示将哪些三角形视为正面的射线标记(例如,“faceingFaceCW”)可以用于指定相交叶片的某些处理。例如,这些标记可以指定将逆时针缠绕的三角形视为正面,或者将顺时针缠绕的三角形视为正面(假定使用右手坐标系)。

可以指定控制对相交的图元进行剔除的射线标记(例如“cullMode”),以指示不进行剔除、剔除朝后的图元、剔除朝前的图元、或者禁用剔除和图元边缘测试。

遍历逻辑(例如,遍历逻辑块1012)基于RayOp测试的结果(或如果设置子项反转标志,则基于RayOp测试的结果的逆)执行由适当的模式标志枚举的动作。在上面的示例中,由于ch_f模式标志指示在它们的RayOp测试失败时将剔除子包围体,因此即使射线可能与子包围体相交,遍历逻辑也不会将堆栈条目推入到该射线的遍历堆栈中,并且相交的子包围体的默认行为是将子项推入遍历堆栈中。请注意,射线可能没有为指示如果RayOp测试失败将要剔除该子项的ch_f模式标志指定一个值,而是指示该子项将在TTU中遍历,或作为节点引用返回。

遍历逻辑的动作可以以与射线的射线标志一致的方式执行。例如,在射线标志指示特定的遍历顺序的情况下,可以按照与相应射线标志所指定的遍历顺序一致的方式,将根据RayOp测试选择进行遍历的子包围体推入遍历堆栈中。

在一些实施例中,如图17所示,对根据操作1712中的RayOp测试选择的用于继续遍历的子项(例如,未剔除子节点)进行节点掩膜划分测试。在特定示例中,当在操作1712中选择的子节点是实例节点时,在操作1714中执行节点掩膜划分测试。如上所述,节点掩膜划分测试将在要测试的节点中指定的节点掩膜与射线中指定的节点包含掩膜进行比较。。

在图15A中示出了包括节点包含掩膜1532和RayOp 1520的射线1502的示例内容。图16A中示出了节点1622的示例报头和标志内容。节点掩膜1602用于使用射线的节点包含遮罩(例如1522)进行节点掩膜划分测试。可以是单个位的掩膜有效标志1604用于指示掩膜1602字段中的值是否有效。图16B示出了另一示例节点1600(例如实例节点)的报头和标志内容。实例节点的头和标志信息包括实例标识符。节点1600还可以包括指向相应根完成的指针complet。

用于节点掩膜测试的节点掩膜1602可以被认为是参与掩膜-也就是说,节点掩膜通过其位模式指示特定射线(或特定类型的射线),其中相应的节点将参与该射线将要包含在遍历中的一组节点,或者相反,指示另一条射线或射线类型,其中相应的节点将参与其他射线或射线类型将不包含在遍历中的一组节点。可以配置射线的节点包含掩膜和节点的节点掩膜的位模式的各种组合,以实现一系列期望的结果。可能不需要每种射线针对其节点包含掩膜具有唯一的位模式,也不需要被特定类型的射线从遍历中排除的每个节点都具有相同的位模式。在具有8位节点包含掩膜和8位节点掩膜的实施例中,每个位位置对应于特定组。即,在一些实施例中,例如,意图参加组0的每个节点将位0设置为值1,并且组0中的每个射线也将位0设置为值1。尽管在以上描述中,作为“参与掩膜”的节点掩膜指示通过特定射线或射线类型参与遍历中所包括的组,将理解的是,比较节点掩膜和节点包含掩膜以确定该节点是否是或不是包括在该射线的遍历中的替代技术,可以在各种实施例中实现。例如,一些实施例可以包括节点掩膜划分测试,其包括节点掩膜和节点包含掩膜的异或,大于/小于测试等等。

由于在操作1712中,根据RayOp测试选择的子节点被推到遍历堆栈中,因此以从遍历堆栈弹出的顺序遍历选定的子节点。也就是说,对于作为实例节点的子节点,在从遍历堆栈中弹出后进行节点掩膜划分测试。

在从堆栈弹出实例节点之后,在一些实施例中,节点掩膜划分测试发生在射线图元测试和转换块1020中的处理的顶部。也就是说,在从堆栈弹出实例节点之后它被获取到L0高速缓存1050中,特别是在此示例中,被取入图元高速缓存1054,然后在执行测试之前被馈入射线图元测试和转换块1020。从射线管理单元(RMU)1030获得射线的节点包含掩膜1532。从实例节点获得节点掩膜1602。节点掩膜划分测试可以包括将节点包含掩膜1532与节点掩膜1602进行“与(AND)”运算。如果该逻辑运算的结果全为零,则不进行该变换。射线图元测试和转换块1020向交叉管理单元(IMU)1022发送代之以剔除实例变换的指示。

对于通过RTT 1020中的节点掩膜划分测试而剔除的实例变换,IMU 1022将简单地将弹出输入信号发送到栈管理单元(SMU)1040。IMU 1022可以不将底层栈初始化传递给SMU1040。在那一点上,堆栈中的实例节点条目将被消耗,并且SMU 1040将在典型的配置操作流程中处理堆栈上的下一个条目。在一些实施例中,RTT 1020被配置为每个周期执行一个转换,节点掩膜划分测试的剔除率不影响RTT中实例转换的吞吐量。

尽管在本实施例中描述的节点掩膜划分测试是逻辑与(AND)运算,但是实施例不限于此。而且,实施例不受掩膜字段的大小限制。

可以针对相交的包围体的每个子项重复步骤1704-1714。当每个子节点,或者至少发现自己与射线相交的每个子节点都执行了RayOp时,父包围体已完成其遍历步骤。也就是说,在complet仅包含根包围体及其子包围体的情况下,该complet的遍历已经完成。更一般而言,当complet包含根和不止一个级别的节点时,当complet的所有叶节点或至少所有未剔除的叶节点都经受了射线-包围体相交测试和/或RayOp测试时,complet的遍历就完成了。

上面相对于可编程操作描述了过程1700,可编程操作例如,基于射线的细节要求的水平,使用RayOp结合节点掩膜划分进行选择来选择和/或取消选择针对遍历的物体图元的特定实例。但是,根据一些实施例,可以在RayOp中指定的另一种操作是节点掩膜划分测试。由于RayOp在该子节点被放入遍历堆栈之前发生在该子节点上,因此在RayOp阶段进行剔除,因此在某些实施例中,在射线完-complet测试(RCT)块1010中,避免了与节点掩膜划分测试相关的成本以首先将子节点推入堆栈,弹出堆栈,获取入L0高速缓存,然后馈入RTT1020,然后再执行测试以确定是否取消该节点。但是,可以预期,节点和射线中用于节点掩膜划分测试的专用掩膜与可以灵活地用于按射线确定的许多不同射线操作中的任何一种的RayOp功能相结合,将提供的性能优势大大超过了RCT 1010中发生的节点掩膜划分测试的性能优势。

在上述实施例中,在节点掩膜划分测试之前在节点上执行可编程射线操作测试。然而,实施例不限于测试的任何特定顺序。

包括射线追踪的示例图像生成管线

尽管以上公开内容是在计算机图形和可视化的特定上下文中进行构架的,但是射线追踪和所公开的TTU可以用于图形和可视化之外的多种应用程序。非限制性示例包括用于逼真的声音合成的声传播、声纳系统的模拟、光学元件和系统的设计、粒子传输模拟(例如,用于医学物理学或实验性高能物理)、一般的波传播模拟、与LIDAR数据的比较用于例如机器人或车辆定位等目的。过去,OptiXTM已用于其中一些应用领域。

例如,可以以多种方式使用上述的射线追踪和其他功能。例如,除了用于使用射线追踪来渲染场景外,它们还可以与扫描转换技术结合使用,例如在对3D模型的几何构建块(即多边形基元,例如三角形)进行扫描转换的情况下用于生成用于(例如,在图7所示的显示器750上)显示的图像。

然而,同时,当用于产生用于虚拟现实、增强现实、混合现实、视频游戏、运动和静止图片生成以及其他可视化应用程序的图像时,本文的技术提供了优点。图18示出了根据实施例的用于处理图元以提供图像的图像像素值的示例流程图。如图18所示,可以响应于接收到用户输入而生成3D模型的图像(步骤1852)。用户输入可以是显示图像或图像序列的请求,例如在与应用程序(例如,游戏应用程序)交互期间执行的输入操作。响应于用户输入,系统使用常规的GPU 3D图形管线对场景的3D模型几何图元执行扫描转换和光栅化(步骤1854)。几何图元的扫描转换和光栅化可包括例如使用本领域技术人员众所周知的常规技术(例如照明、转换、纹理映射、光栅化等)来处理3D模型的图元以确定图像像素值。所生成的像素数据可以被写入帧缓冲器。

在步骤1856中,可以使用TTU硬件加速从光栅化图元上的一个或更多个点追踪一条或更多条射线。可以根据本申请中公开的一种或更多种射线追踪功能来追踪射线。基于射线追踪的结果,可以修改存储在缓冲器中的像素值(步骤1858)。在一些应用程序中,修改像素值可以例如通过例如施加更多逼真的反射和/或阴影来改善图像质量。使用存储在缓冲器中的修改的像素值来显示图像(步骤1860)。

在一个示例中,可以使用上述处理系统来实现几何图元的扫描转换和光栅化,并且可以由SM 732使用关于图10描述的TTU 738架构来实现射线追踪,以添加更多的可视化特征(例如,镜面反射,阴影等)。图18仅是非限制性示例–SM 732本身可以采用描述的TTU,而无需纹理处理或其他常规3D图形处理来产生图像,或者SM可以采用纹理处理和其他常规3D图形处理而没有所描述的TTU来产生图像。SM还可根据应用程序在软件中实现任何所需的图像生成或其他功能,以提供任何所需的可编程功能,这些功能不受纹理映射硬件、树遍历硬件或其他图形管线硬件提供的硬件加速功能的约束。

在一些实施例中,TTU 738是无状态的,意味着在查询之间的TTU中没有维护架构状态。同时,对于在SM 732上运行的软件请求继续上一查询通常很有用,这意味着相关状态应由TTU 738写入寄存器,然后传递回寄存器中的TTU(通常是原位)以继续。该状态可以采用遍历堆栈的形式,该遍历堆栈追踪BVH遍历的进度。

还可以提供少量的堆栈初始值设定项以开始给定类型的新查询,例如:

·从complet开始遍历

·射线与三角形的范围交叉

·射线与三角形的范围交叉,然后从complet开始遍历

·从给定三角形的三角形缓冲区中获取顶点

·在“从complet开始的遍历”和“射线与三角形的范围交叉”前面进行实例转换的可选支持。

顶点提取是一种简单的查询,可以用包含堆栈初始化器和其他内容的请求数据来指定。其他查询类型可能要求指定射线或光束,连同堆栈或堆栈初始化器以及描述查询详细信息的各种射线标志。射线由其三坐标原点、三坐标方向以及沿射线的t参数的最小值和最大值给出。光束还由第二原点和方向给出。

各种射线标记可用于控制遍历行为、背面剔除和各种子节点类型的处理的各个方面,其取决于可选rayOp测试的通过/失败状态。RayOps为TTU的功能增加了相当大的灵活性。在一些示例实施例中,RayOps部分引入了两个Ray Flag版本,可以基于对与射线一起传输的数据和存储在complet中的数据的指定操作来动态选择两个Ray Flag版本。要探索此类标志,了解BVH中允许使用的不同子节点类型以及TTU 738可以返回给SM的各种集中类型,这首先有帮助。示例节点类型为:

■子complet(即内部节点)

默认情况下,TTU 738通过下降到子complet来继续遍历。

■□三角形范围,对应于三角形缓冲区中的一组连续三角形

(1)默认情况下,射线所遇到的三角形范围由TTU 738本地处理,方法是测试三角形的相交并相应地缩短射线。如果遍历完成并且击中了三角形,则默认行为是将三角形ID连同相交的t值和重心坐标返回给SM 732。这是“三角形”匹配类型。

(2)默认情况下,即使遍历尚未完成,设置了阿尔法位的相交三角形也会返回到SM1840。如果软件确定三角形实际上是透明的,则返回的遍历堆栈包含继续遍历所需的状态。

(3)在某些实施例中,光束不支持三角形交叉,因此默认情况下将遇到的三角形范围作为“TriRange”击中类型返回到SM 1840,其中包括指向与该范围重叠的第一个三角形块的指针,这些参数指定了范围,以及与叶包围体的交叉的t值。

■一个项目范围,由一个索引(从用户提供的存储在complet中的“项目范围库”中得出)和一个项目计数组成。

默认情况下,项目范围作为“ItemRange”击中类型返回到SM 1840,其由例如索引、计数和与叶包围体的交叉的t值组成。

■□一个实例节点。

在一些实施例中,TTU 738可以通过将射线转换为两个实例化的BVH的坐标系来本地处理两个级别的实例化。可以在软件中处理其他级别的实例化(或其他每个级别的实例化,具体取决于策略)(或在其他实施例中,TTU 738硬件可以处理三个或更多级别的实例化)。为此提供了“InstanceNode”击中类型,由指向实例节点的指针和与包围体的交叉的值组成。在其他实施方式中,硬件可以处理两个、三个或更多级别的实例化。实例节点还可以配置有实例掩膜,该实例掩膜指示节点可以不参与任何几何图形,参与在射线中包含实例包含掩膜的每条射线的基础上可选择的一个或多于一组的几何图形。有效标志也可能可用以指示实例掩膜是有效还是无效。

除了针对于节点的击中类型之外,还提供了通用的“NodeRef”击中类型,其由指向父complet本身的指针以及指示与哪个子项相交的ID和与那个子项的包围体交叉的t值组成。

对于查询或BVH格式不正确或遍历过程中遍历遇到问题的情况,可以提供“错误”击中类型。

对于射线或光束错过场景中所有几何图形的情况,可以提供“无”击中类型。

TTU如何处理四种可能的节点类型中的每一个由一组特定于节点的模式标志确定,该标志被设置为针对给定射线的查询的一部分。上面提到的“默认”行为对应于将模式标志设置为全零的情况。

标志的替代值允许剔除给定类型的所有节点,将给定类型的节点作为NodeRef击中类型返回给SM,或者使用其对应的击中类型将三角形范围或实例节点返回给SM,而不是进行在TTU 738内天然地处理它们。

可以提供附加的模式标志,以控制阿尔法三角形的处理。

应用本文公开的一种或更多种技术产生的图像可以显示在监视器或其他显示设备上。在一些实施例中,显示设备可以直接耦合到生成或渲染图像的系统或处理器。在其他实施例中,显示设备可以例如经由网络间接地耦合到系统或处理器。此类网络的示例包括因特网、移动电信网络、WIFI网络以及任何其他有线和/或无线联网系统。当显示设备间接耦合时,由系统或处理器生成的图像可以通过网络流传输到显示设备。这种流传输允许例如在服务器上或在数据中心中执行渲染图像的视频游戏或其他应用程序,并且渲染的图像可以在与服务器或数据中心物理上分开的一个或更多个用户设备(例如计算机、视频设备、游戏控制台、智能手机、其他移动设备等)上传输和显示。因此,本文公开的技术可以应用于增强流传输的图像并增强流传输图像的服务,例如NVIDIA GeForce Now(GFN)、GoogleStadia等。

此外,应用本文公开的一种或更多种技术生成的图像可以用于训练、测试或证明用于识别现实世界中的物体和环境的深度神经网络(DNN)。这样的图像可以包括道路、工厂、建筑物、城市环境、农村环境、人类、动物以及任何其他物理物体或真实世界环境的场景。这样的图像可以用于训练、测试或认证在机器或机器人中使用的DNN,以操纵、处理或修改现实世界中的物理物体。此外,此类图像可用于训练、测试或认证在自动驾驶车辆中使用的DNN,以在现实世界中导航和移动车辆。另外,应用本文公开的一种或更多种技术生成的图像可以用于向这些机器、机器人和车辆的用户传达信息。

如同明确提出一样,以上引用的所有专利和出版物均以引用方式并入。尽管已经结合当前被认为是最实际和优选的实施例描述了本发明,但是应当理解,本发明不限于所公开的实施例,相反,本发明旨在覆盖包括在所附权利要求书的精神和范围内的修改和等同布置的各种实施例。

62页详细技术资料下载
上一篇:一种医用注射器针头装配设备
下一篇:一种低强度和高强度流动结构融合显示方法

网友询问留言

已有0条留言

还没有人留言评论。精彩留言会获得点赞!

精彩留言,会给你点赞!