一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

支持运动模糊和运动/变形几何形状的光线追踪硬件加速的制作方法

2021-12-17 19:51:00 来源:中国专利 TAG:

bidirectional path tracing at pixar)”(2016)。
22.通常,光线追踪是一种渲染方法,其中光线用于确定场景中各种元素的可见性。光线追踪是用于各种渲染算法中的图元,算法包括例如路径追踪和metropolis光传输。在示例算法中,光线追踪通过对穿过场景的光传输进行建模来模拟光的物理现象以使用光线光学计算所有全局效应(包括例如来自发亮表面的反射)。在这样的光线追踪的用法中,当光线穿过三维场景从潜在的多个光源传播到视点时,可能会尝试追踪成百上千的光线中的每一个。通常,穿过场景相对于眼睛追踪此类光线,并针对场景中所有几何形状(geometry)的数据库进行测试。可以从光到眼睛向前追踪光,或者从眼睛到光反向追踪光,或者可以追踪光线以查看从虚拟相机开始并从眼睛开始的路径是否具有清晰的视线。该测试可以确定最近的相交(以便确定从眼睛可见的东西),也可以追踪从物体表面朝向光源的光线,以确定是否有任何干涉会阻止光到空间中该点的透射。因为光线与现实中的光的光线相似,所以它们提供了许多现实效果,而这些效果是使用过去三十年来实施的基于光栅的实时3d图形技术无法实现的。由于来自场景中每个光源的每个照明光线在穿过场景中的每个对象时都经过评估,因此得到的图像看起来就像是在现实中拍摄的一样。因此,这些光线追踪方法长期以来一直在专业图形应用程序(例如设计和电影)中使用,其中在基于光栅的渲染方面它们占据了主导地位。
23.光线追踪可用于确定沿光线是否有任何东西可见(例如,测试几何图元上的阴影点与光源上的点之间的遮挡物),还可用于评估反射(例如,可能涉及执行遍历以确定沿视线的最近可见表面,以便在流处理器上运行的软件可以评估与所击中的事物相对应的材质着色功能

其反过来根据相交的对象的材料属性又可以向场景中发射一个或更多个附加光线)以确定沿光线返回向眼睛的光。在经典的whitted风格光线追踪中,光线是从视点通过像素网格射入场景的,但是其他路径遍历也是可能的。通常,对于每条光线,找到最接近的对象。然后,可以通过将光线从相交点发射到场景中的每个光源并发现它们之间是否存在任何对象来确定该相交点是被照明还是处于阴影中。不透明的对象会挡住光,而透明的对象会减弱光。可以从相交点产生其他光线。例如,如果相交表面是发亮的或镜面的,则在反射方向上产生光线。光线可以接受相交的第一个对象的颜色,然后对它的相交点进行阴影测试。递归地重复此反射过程,直到达到递归限制或后续反弹的潜在贡献降至阈值以下。光线也可以在透明固体对象的折射方向上生成,然后再次递归地进行评估。因此,光线追踪技术允许图形系统依据物理规律开发正确的反射和阴影,其并不经受扫描变换技术的限制和伪像。
24.光线追踪已经与光栅化和z

缓冲一起使用或作为其替代,用于采样场景几何形状。它也可以用作环境贴图和阴影纹理的替代方法(或与之结合使用),以产生比通过纹理化技术或其他光栅“技巧(hacks)”所能实现的更为逼真的反射、折射和阴影效果。光线追踪还可以用作基本图元,以在基于物理的渲染算法(例如路径追踪、光子映射、metropolis光传输和其他光传输算法)中精确模拟光传输。
25.光线追踪的主要挑战通常是速度。光线追踪要求图形系统为每一帧计算和分析照射在构成场景的每个表面上(并可能被其反射)的数百万条光光线中的每一条。过去,如此庞大的计算复杂性无法实时执行。
26.现代gpu 3d图形管线如此快地渲染着色的、纹理映射的表面的原因之一是它们有
效地使用了相干性。在常规的扫描变换中,假定所有内容都可以通过公共图像平面中的公共窗口查看并向下投影到单个有利点。每个三角形或其他图元通过图形管线发送,并覆盖一定数量的像素。可以针对从该三角形渲染的所有像素共享所有相关计算。因此,对应于穿过窗口的相干视线的像素的矩形图块可以对应于在同一流处理器中以锁步方式运行的线程组。假定落在三角形的边之间的所有像素都是运行相同着色器并从相同纹理获取相邻纹理像素组的相同材质。相反,在光线追踪中,光线可能在公共点(光源或虚拟相机镜头)处开始或结束,但是当它们在场景中传播并与不同的材质相交时,它们会迅速发散。例如,每条光线执行搜索以找到最接近的对象。可以执行对结果的一些高速缓存和共享,但是由于每条光线都可能击中不同的对象,因此不存在gpu传统上已经与纹理映射的、着色的三角形结合利用的那种相干性(例如,共同的优势点、窗口和图像平面没有用于光线追踪)。与其他图形方法相比,这使光线追踪在计算上更具挑战性,因此在交互基础上执行起来要困难得多。
27.在2010年,nvidia利用nvidia gpu和其他高度并行架构的高度并行性来开发optix
tm
光线追踪引擎。参见parker等人的“optix:通用光线追踪引擎”(图形上的acm事务(acm transactions on graphics),第29卷,第4期,第66条,2010年7月)。除了改进api(应用程序编程接口)之外,optix
tm
提供的一项进步是改进了用于找到光线与场景几何形状之间的交点的加速数据结构。这种加速数据结构通常是光线追踪遍历算法使用的有效地搜索可能与给定光线相交的图元的空间或对象层次结构。optix
tm
提供了应用程序可以从中选择的许多不同的加速结构类型。节点图中的每个加速结构可以是不同的类型,从而可以将高质量的静态结构与动态更新的结构组合在一起。
28.计算机图形渲染中的运动模糊
29.用于光线追踪的optix api包括对称为“运动模糊”的可视化效果的支持。一般而言,光线生成程序负责根据在场景中追踪到的光线结果在输出图像中定义像素。有时将其视为类似于相机是有用的。但是,在现实世界中,捕获逼真的(photographic)图像不是瞬间的;相反,它是通过将图像平面(例如传感器或胶卷)曝光并在有限的时间段(在相机的快门打开的同时)对入射光进行积分来创建的。如摄影师所知,相对于快门打开持续时间快速运动的对象将在照片、电影或视频中显示为条纹。这种条纹效果称为运动模糊。某些示例请参见图1a

图1c。
30.如果使用计算机图形从虚拟世界中的虚拟摄像机进行渲染,则不需要模拟现实世界中实际相机的快门时间。例如,虚拟运动模拟的开发人员可以选择模拟非常高的虚拟帧率以避免运动模糊。在这种情况下,观看者可能想要最清晰的图像,以便他们可以根据自己看到的内容迅速采取行动。
31.但是,为了创建“逼真的”图像(看起来像实际照片、视频和电影的图像),虚拟相机模型应模拟运动模糊的条纹,如果在现实世界中由真实的实际相机捕获,则会出现运动模糊。例如,当使用计算机图形来渲染电影时,即使屏幕上的所有内容显然是虚拟的而不是物理的,许多人也希望电影看起来像是用真实的物理电影相机快照的。观看者通常希望在每帧中都看到一些运动拖影(smearing),即使使用虚拟相机创建图像时也是如此,因为这是真实相机会产生的效果。运动模糊也是有助于观看者感知运动的视觉提示。在这种高质量的图形环境中,图像帧中的几乎每个像素都可能单独需要某种运动模糊,以便得到生产者意图创建的景象。
32.过去已经开发了许多用于模拟运动模糊的技术。参见例如:cook等人,“分布式光线追踪(distributed ray tracing)”,siggraph的会议记录,第165

174页(1984);lauterbach等人,“rtdeform:使用bvh进行动态场景的交互式光线追踪(rtdeform:interactive ray tracing of dynamic scenes using bvhs)”,交互式光线追踪(interactive ray tracing)(irt06)(2006);christensen等人,“对电影“汽车”的光线追踪(ray tracing for the movie

cars’)”,交互式光线追踪irt06,第1

6页(2006年9月);wald等人,“使用动态包围体层次结构进行光线追踪可变形场景(ray tracing deformable scenes using dynamic bounding volume hierarchies)”,图形上的acm事务(acm transactions on graphics),第26卷,第1期(2007);hou等人,“具有散焦和运动模糊的微多边形光线追踪(micropolygon ray tracing with defocus and motion blur)”,acm siggraph,第64页:1

64:10页(2010);navarro等人,“运动模糊渲染:最新技术(motion blur rendering:state of the art)”计算图形论坛(comput.graph.forum)(2011年第30卷第1期);grunschloss等人,“msbvh:用于光线追踪的运动模糊的有效加速数据结构(msbvh:an efficient acceleration data structure for ray traced motion blur)”,《高性能图形》,hpg’11(2011);shkurko等人,“运动模糊的时间间隔光线追踪”,可视化和计算机图形学上的ieee事务(ieee transactions on visualization and computer graphics)(2017年)。这些技术中的一些依靠图像后处理,而另一些则使用光线追踪。基于硬件的光线追踪为有效地模拟运动模糊创造了机会。
33.用于模拟运动模糊的分布式光线追踪
34.光线追踪提供了一种强大的方法来模拟计算机图形中的运动模糊。一种通常用于运动模糊的常用技术(称为“分布式光线追踪”)已用于在时间上和空间上分布光线。特别地,可以通过对场景中的运动进行建模、在不同时间发射光线以及针对相交进行测试来模拟场景中的运动模糊。在投射每条光线之前,将对象平移或旋转到该帧的正确位置。然后将光线追踪结果取平均。运动最多的对象在渲染图像中将具有最大的模糊。为了避免混叠伪影,不是针对每条光线采样单个值,而是获取多个样本并一起取平均值。通过场景的光线的随机分布过采样减少了诸如频闪之类的混叠伪影。参见例如上文引用的cook等人的文章。
35.上面提到的现有的optix api提供了使用这种分布式光线追踪实现运动模糊的方法。首先,光线生成程序能够定义模拟相机快门的开始时间和持续时间,并在快门持续时间内的随机时间处进行采样。其次,在给定随机采样时间的情况下,图元相交程序可以通过存储多个位置并在它们之间进行插值来定义动画图元。从optix 5.0版开始,程序员可以为“变换”和“几何形状”节点指定运动数据。optix自动建立了遵守该运动的加速数据结构。还有一个名为“rttrace”的函数,其在optix 5.0版中进行了扩展,以采用光线的可选时间参数(argument)。遍历场景时,optix在此指定时间自动评估变换和几何运动。然后,时间值可用于用户程序以进行相交和着色。尽管optix不允许外推,但它具有运动范围上的边界模式的概念,这一概念可以针对起点和终点分别设置为消失或钳制。参见例如:https://raytracing

docs.nvidia.com/optix/guide/index.html#motion_blur_math#motion

blur。
36.使用诸如optix api之类的东西来完成运动模糊的暴力(brute force)技术是对每像素的n个交点按照程序进行采样,将所有值存储在累积缓冲区中,然后随机选择针对每
个像素要使用哪些采样。尽管这种布置在图形处理器有很长的时间来处理每个帧的非实时渲染中很好用,但是这种处理当前必须在软件中完成,并且目前在计算上非常费力,无法容纳在任何接近实时图形系统的部件中。
37.类似地,包括其运动模糊能力的optix tm
可编程光线追踪管线提供了显着的进步,但是其自己通常仍然无法在相对便宜的用于复杂3d场景的计算平台上对用户输入提供实时交互响应。nvidia一直在开发用于光线追踪的硬件加速功能。参见,例如,us 9582607、us 9569559、us 20160070820、us 20160070767;以及以上引用的其他美国专利和专利申请。迫切需要使用这样的硬件功能来加速运动模糊,并且过去的技术在某种程度上已经模拟了硬件中的某些类型的运动模糊,例如由于相机运动而引起的运动模糊。然而,过去的高性能图形硬件通常由于与相机运动相反(或除了相机运动之外)的运动几何形状而不能显着加速运动模糊。取而代之的是,在许多光线追踪器中,用于运动模糊可视化的所有遍历都倾向于通过软件路径进行,因此比硬件加速时要慢得多。
38.因此,对于加速对运动/变形几何形状的可见性测试以及以其他方式增强计算机图形系统中运动模糊效果的生成,可能并需要进一步的改进。
附图说明
39.专利或申请文件包含至少一个附图。将根据要求和必要的付费,提供带有附图的本专利或专利申请公开的副本。
40.图1a

1c示出了示例非限制性运动模糊效果。
41.图2a

2c示出了示例简化的光线追踪测试,以确定光线是否通过包含几何形状的包围体以及光线是否与包围体内的几何形状相交。
42.图3a示出了用于构造合适的包围体层次结构的示例过程。
43.图3b和图3c示出了示例包围体层次结构表示。
44.图4示出了在时间间隔内运动的包围体的示例插值。
45.图4a示出了示例非限制性包围体插值硬件。
46.图5示出了在时间间隔内运动的几何形状的示例插值。
47.图5a示出了示例几何形状插值硬件。
48.图6示出了示例非限制性光线追踪图形系统。
49.图7是示例非限制性光线追踪图形管线的流程图。
50.图8是基于示例非限制性硬件的光线追踪操作的流程图。
51.图9示出了包括树遍历单元(ttu)的简化的示例非限制性遍历协处理器。
52.图10是示例ttu处理的流程图。
53.图11示出了图9的示例ttu架构,其中添加了对时间插值/运动模糊的支持。
54.图12是示例模式字段的示意图。
55.图13a、图13b是示例complet存储格式的示意图。
56.图14a、图14b是示例complet子字段的示意图。
57.图15a、图15b是示例长指针数据字段的示意图。
58.图16是示例数据字段的示意图。
59.图17a

17e是示例运动模糊图元存储格式的示意图。
60.图18a

18c是示例实例节点存储格式的示意图。
61.图19a

19e是示例静态和运动实例节点存储格式的示意图。
62.图20是示例光线指令存储格式的示意图。
63.图21是示例附加光线指令存储格式的示意图。
64.图22是示例堆栈条目存储格式的示意图。
65.图23是关于光线的示例包围体插值过程的示意图。
66.图24示出了示例非限制性插值伪代码。
67.图25a和图25b示出了更详细的光线追踪管线。
68.图26是示例过程的流程图,该示例过程用于生成具有由运动/变形几何形状引起的硬件加速运动模糊的图像。
具体实施方式
69.当几何形状是静态的(不运动或不变形)并且仅(虚拟)相机的位置和/或方向在整个帧过程中改变,模拟移动拍摄(pan)或其他运动相机的效果时,在现代计算机图形系统中进行硬件加速运动模糊相对容易。例如,可以采用现有的硬件(例如nvidia的turing架构),仅仅通过在每个帧的过程中适当地改变光线的起点和方向以模拟运动相机,来加速某些分布式光线追踪过程。例如,可以为每条光线拾取一时间戳,然后在没有任何其他硬件支持的情况下进行正常处理。
70.但是在真实或虚拟世界中,运动模糊可以来自以下三个独立来源中的任何一个或全部:
71.●
运动相机,
72.●
运动对象(计算机图形环境中的动态变换)
73.●
变形对象/几何形状。
74.例如,采用动态变换,没有内部运动的对象(例如茶壶或其他静态对象)在场景中运动。作为动态变换的示例,考虑在虚拟游戏桌上滚动虚拟骰子,如图1a所示。当骰子滚动时,虚拟空间中骰子的对象实例的变换正在改变,以将虚拟对象的顶点重新放置在虚拟空间中,但是对象顶点相对于彼此保持固定。可以使用基于时间戳的变换来捕获此类运动。但是,要使用硬件加速遍历,通常必须静态地增加包围体的大小,以包括所有时间戳上基础几何形状的全部运动范围。这会产生比其他情况所必须的大得多的包围体

导致更多的错误击中,因为任何时间戳上的光线都会击中包围体(而不仅仅是所需特定时间戳上的光线)。
75.变形的几何形状进一步增加了复杂性,因为对象相对于自身具有运动,并且虚拟几何形状的顶点相对于彼此改变其位置。例如,考虑一个化身(角色)对象在奔跑时移动手臂或腿,或者如图1b所示奔腾的马。在人类赛跑者或奔腾的马的情况下,几何形状正在改变虚拟空间中的位置(平移、旋转),并且还在改变相对于自身的位置(平移、缩放、旋转)。存在其他情况,其中整个对象既不平移,也不旋转或缩放,而对象的某些部分相对于其他部分变形(考虑对固定弹簧进行压缩和解压缩或人的面部表情)。
76.实际上,在真实世界中,运动模糊同时全部反映所有三种类型的运动(运动的相机、运动的对象和变形的对象)非常普遍。如果你曾经看过电视或电影中的赛马,就已经看过了。图1b示出了一个示例,其中相机在马沿着轨道疾驰时平移跟随马移动拍摄。当相机移
动拍摄(旋转或在某些情况下沿轨道平移)以保持对奔马的近距离观察时,由于相机的相对运动以及这些背景对象的独立动态运动,马后面的背景中的人群或其他对象(例如身穿制服的水手)变得模糊。同时,即使相机的移动拍摄完美地消除了相机与马和骑师之间的相对运动,随着马伸展和收缩其腿以及骑师在马上向下弯曲,马和骑师的部分也总是会变形。因此,马和骑师的不同部分经受不同程度和方向的运动模糊或条纹。
77.当虚拟图像和真实图像被组合到例如电影中时,这种复杂的运动模糊效果变得更加重要,这些电影例如在常规拍摄的真实环境中或在增强现实和/或混合现实(其中虚拟图像和真实图像在同一视图中组合在一起)中提供动画化身(animated avatar)或其他虚拟对象。例如,图1c示出了由真实电影相机拍摄的城市街道,其中虚拟超级英雄化身在街道上悬挂在绳子或细丝上。相机的运动和在街上行驶的汽车的运动导致场景中的所有真实对象都显示为条纹。如果虚拟化身没有运动模糊,则虚拟化身作为真实场景的一部分的错觉将不能令人信服。相反,期望将虚拟化身和其他虚拟对象(例如,悬挂有虚拟化身的绳索或细丝)的模拟运动模糊与真实电影相机检测到的真实运动模糊进行匹配,以产生虚拟化身和虚拟对象是由真实场景中的真实相机拍摄的幻觉。类似的考虑也适用于实时增强现实和/或混合现实,其中观看者在google、智能手机或某些其他显示器上观看视频相机捕获的真实世界的图像,并且计算机图形系统沉浸地叠加或注入虚拟对象到真实场景中。
78.当渲染这样的图像的任何给定像素时,可以存在所有三种类型的运动(相机、对象动态变换和对象变形)。如果希望模拟不仅来自相机运动的运动模糊,还模拟来自对象运动的运动模糊,那么常规的高性能硬件关于加速可能无法提供很多,相反,可能有必要退回到软件中,具有相关联的性能损失。
79.用于运动几何形状的硬件加速
80.本文的示例性非限制性技术增加了硬件支持,以用于加速应用于运动/变形几何形状的运动模糊,以及使用较小的包围体进行动态变换。
81.在一个实施例中,加速数据结构中的每个动态对象用时间和空间信息进行编码,并且每条光线也用时间和空间信息进行编码。硬件包括基于时间信息解析(例如,插值)空间信息的电路。这项技术增加了在运动中加速几何图形的相交测试的能力,通过将遍历保持在硬件的内部和减少了因膨胀的静态包围体足够大以容纳运动的几何形状而引起的误报率,从而使性能大大提高。
82.示例非限制性实施例因此提供了支持运动模糊可视化效果的硬件加速过程。在一个实施例中,用指定光线光子何时穿过场景的定时信息来编码每条光线,并且用指定在不同时间几何形状的多个位置的空间信息来编码表示运动的几何形状的加速数据结构中的每个压缩的treelet(complet)。运动的几何形状可以是平移、旋转、放大或缩小以及变形中的任何一个或全部(在本文的上下文中,“运动的几何形状”是指这些中的任何一个或全部)。硬件在光线的定时处插入运动几何形状的位置,以确定光线光子的瞬间运动的几何形状在空间中存在的位置,并将光线的空间信息与运动的几何形状的插值位置进行比较,以确定在光线的定时处光线是否与运动的几何形状相交。
83.在一个实施例中,每个运动complet用开始时间和结束时间进行编码,在这些时间处代表性的几何形状存在于场景中。另外,每个运动complet还用该运动complet表示的几何形状的每个顶点的开始和结束空间位置进行编码。在示例非限制性实施例中,硬件在开
始和结束空间位置之间进行插值,以计算光线的定时或瞬间处几何形状的空间位置。硬件针对光线

图元相交测试,对光线位置测试了几何形状的计算出的插值空间位置。
84.在一个实施例中,硬件执行的插值是线性插值。在一个实施例中,硬件可以基于多项式、贝塞尔曲线等沿着曲线执行其他类型的插值。在一个实施例中,如果需要的话,硬件可以将插值任务转移到基于软件的处理器,以为其他插值类型提供额外的灵活性。即使当硬件要求基于软件的处理器执行插值计算时,硬件也可以保持对相交测试过程的程序控制,从而加速分布式光线追踪。
85.在一个实施例中,运动complet指定包围体的开始和结束空间位置,并且硬件在光线的定时处在包围体空间位置的开始和结束之间进行插值,以执行光线

包围体相交测试。
86.进一步的示例非限制性添加和改进包括:
87.‑
对特定时间点的几何图形的快速、低精度、保守的插值,包括包围盒、三角形(或任何图元)和实例变换
88.‑
并行评估
89.‑
存储的时间间隔的终点
90.‑
针对不同的算法选择,加速硬件中的任何部分或返回到基于协作的软件的处理器(例如,流式多处理器)的可编程决定。
91.查看本文中的本非限制性技术的一种方式是,通过将在运动中的像素与不在运动中的像素区别对待,该技术使在运动中的像素与不在运动中的像素走得一样快。(在这种情况下,“在运动中的像素”是指其颜色值取决于在模拟的相机快门时间内对运动的几何形状进行精确地光线追踪的像素。)此功能相对于现有的硬件实现有显着改进,现有的硬件实现倾向于处理所有像素(在运动中的像素和不在运动中的像素)。与不具有能够对几何形状进行插值的硬件的一些现有方法不同,本非限制性方法能够对硬件中的运动的和/或变形的几何形状进行插值,而无需基于软件的处理器对执行插值进行干预。
92.示例非限制性实施例捕获加速数据结构内的运动范围,从而使得能够跨加速数据结构表示的时间间隔进行采样。另外,被配置为接收光线

图元相交测试请求的硬件还被配置为在几何形状和/或包围体的指定时间间隔内执行线性或其他插值。这种插值得益于使用时间戳进行编码以确定光线与运动和/或变形的几何形状之间的空间相关性。包括在包围体之间进行插值的插值器的硬件实时光线追踪设计可以利用此类硬件功能来实现运动模糊效果,并添加在几何形状(例如顶点)的位置之间的硬件中进行插值的插值器。
93.在示例非限制性实施例中,每个光线请求被时间编码以指定时间点。如果给定加速数据结构正在捕获的时间间隔在参数上介于0和1之间(其可以表示任何所需的时间间隔,但在某些实施例中可以表示帧时间),则与光线关联的时间值将指定光线代表的光子在整个场景中运动的时间段。
94.本技术的使用不限于运动模糊。其他示例用例可能与运动模糊效果无关。例如,本文所公开的硬件功能在某些动画情况下可能是有用的,在这些情况下,希望跨多个帧时间对对象运动进行插值。作为示例,假设希望显示通过一片草地的风运动。开发人员可能不希望承担这样的复杂性,即提供许多不同的bvh来代表在风吹拂的所有不同位置上的许多草叶。取而代之的是,开发人员可以使用本文的示例非限制性技术来在不同帧时间上在草叶的位置之间动态地进行插值,以提供动画效果。换句话说,本文的示例非限制性硬件技术可
以用于关键帧动画,而无需为每个不同的关键帧重建整个场景bvh。如果需要,可以将此类关键帧动画与运动模糊结合使用。
95.下面的讨论开始于说明用于支持运动模糊的示例加速数据结构。接下来,描述了通过基于硬件的插值来硬件加速运动模糊的示例实现。然后描述了示例树遍历硬件体系结构,该结构提供了与运动模糊相关的插值和可视化测试的基于硬件的加速。
96.支持动态对象的运动模糊的示例包围体层次结构
97.大多数光线追踪器的基本任务是针对场景中的所有图元(在一个实施例中通常为三角形)测试光线,并报告最接近的击中(根据沿光线测量的距离)或仅报告所遇到的第一个(不一定是最接近的)击中,具体取决于用例。朴素贝叶斯算法将是o(n)暴力搜索。但是,由于任意复杂度的3d场景中有大量的图元,因此对于光线追踪器而言,测试场景中的每个几何图元与给定光线的相交通常是无效或不可行的。
98.通过预处理场景几何形状并预先构建合适的加速数据结构,可以将平均情况的复杂度降低到o(log n)。加速数据结构(例如包围体层次结构或bvh)允许快速确定哪些包围体可以忽略,哪些包围体可以包含相交的几何图元,哪些相交的几何图元对于可视化很重要,而哪些则不重要。使用简单的体(例如盒子)包含更复杂的对象可提供计算和内存效率,这有助于使光线追踪实时进行。
99.图2a

2c示出了在包括几何形状网格320的包围体208的背景下的光线追踪相交测试。图2a示出了在虚拟空间中包括包围体310和315的光线302。为了确定光线302是否与在网格320中的几何形状相交,可以直接针对光线302测试每个几何图元(例如三角形)。但是,为了加速该过程(因为对象可能包含成千上万的几何图元),首先针对包围体310和315测试光线302。如果光线302不与包围体相交,则它不与包围体内部的任何几何形状相交,并且出于该光线的目的,可以忽略该包围体内部的所有几何形状。因为在图2a中,光线302错过了包围体310,所以不需要针对相交测试该包围体内的网格320的任何几何形状。虽然包围体315被光线302相交,但是包围体315不包含任何几何形状,因此不需要进一步的测试。
100.另一方面,如果诸如图2b所示的光线304之类的光线与包含几何形状的包围体310相交,则该光线可能会或可能不会与包围体内部的几何形状相交,因此需要对几何形状本身执行进一步的测试以找到可能的相交。因为图2b和图2c中的光线304、306与包含几何形状的包围体310相交,所以需要执行进一步的测试以确定包围体内部是否有任何(和哪些)图元被相交。在图2b中,进一步测试与图元的相交将表明,即使光线304穿过包围体310,它也不会与包围体所包围的任何几何形状相交(或者,如上所述,包围体310可以进一步按体积细分,以便可以使用包围体相交测试来揭示光线不与任何几何形状相交,或更具体地,光线可以与哪些几何图元相交)。
101.图2c示出了光线与包围体310相交并且包含光线306与其相交的几何形状的情况。为了执行实时光线追踪,相交测试器测试相交的包围体310内的每个几何图元,以确定光线是否与该几何图元相交
102.示例包围体层次结构
103.现代光线追踪器最常使用的加速数据结构是包围体层次结构(bvh),其包括嵌套的轴向对齐的包围盒(aabb)。bvh的叶节点包含要测试相交的图元(例如三角形)。bvh通常由图形或树结构数据表示来表示。在光线追踪中,当使用这样的加速数据结构时,找到光线
的最接近(或阴影,任何)相交的时间通常是n个对象的o阶(log n)。例如,通常用于现代光线追踪加速数据结构的该类型的aabb包围体层次结构(bvh)通常具有o(log n)搜索行为。
104.bvh加速数据结构以将有助于帮助快速确定可能与特定光线相交的对象的那个部分并快速拒绝光线不会与之相交的场景的大部分的方式来表示和/或引用对象或场景的3d模型。bvh数据结构表示具有包围体的场景或对象,并将包围体细分为越来越小的包围体,这些包围体终止于包含几何图元的叶节点。包围体是分层的,这意味着最上层将其下的层包围起来,该下层将其下的层包围起来,依此类推。在一个实施例中,叶节点可以潜在地与包围体层次结构中的其他叶节点重叠。
105.在包括nvidia rt cores在内的许多示例实现方式中,图2a

2c中所示的包围体使用轴对齐的包围盒(“aabb”),该包围盒可以紧凑地存储并易于针对光线相交进行测试。如果光线与几何形状的包围盒相交,则也将测试基础几何形状。但是,如果光线不与几何形状的包围盒相交,则不需要测试该基础几何形状。如图2a

2c所示,创建了aabb的层次结构以提高单个aabb包围盒测试的剔除效果。这样可以进行有效遍历并快速缩小感兴趣的几何形状。
106.构建包括动态对象的包围体层次结构以支持由硬件的运动模糊加速
107.如上所述,加速数据结构包括递归地封装越来越小的包围体细分的包围体的层次结构(包围体层次结构或bvh)。最大的体(volumetric)包围体可以称为“根节点”。这种包围体(“叶节点”)的层次结构的最小细分包含项。这些项可以是定义对象表面的图元(例如,诸如三角形之类的多边形)。或者,项(item)可能是包含世界的整个新级别(作为项存在)的球体,因为它没有被添加到bvh中(想象《黑衣人》中猫的魔力项圈,其内部包含整个微型星系)。如果该项包含图元,则遍历协处理器在到达相交的叶节点时,将光线针对与叶节点关联的图元测试光线,以确定哪些对象表面与光线相交以及沿光线哪些对象表面可见。
108.建立bvh可以在两个部分发生:静态和动态,其中动态部分可能有助于运动混合效应。在许多应用程序中,对复杂的场景进行预处理,并且基于场景的静态几何形状创建bvh。然后,使用包括动态创建和操纵的运动对象在内的交互式图形生成,bvh的另一部分(或其他链接的bvh)可以由驱动程序或在实时交互式图形系统上运行的其他软件实时构建(例如,在每个帧中)。bvh的构建不需要硬件加速(尽管在某些非限制性实施例中可以),但可以使用在sm132和/或cpu 120和/或其他开发系统(例如在应用程序开发期间)上运行的高度优化的软件例程来实现。
109.bvh加速结构构建的第一阶段获取参考几何形状(图3a的204)的包围盒。这是通过针对对象中的每个几何图元执行包围盒程序来实现的,该包围盒程序为其输入图元返回保守的轴对齐的包围盒(aabb)。与例如定向包围盒(obb)、包围球或其他方法相比,将包围盒与几何形状的相关坐标系的轴对齐可以为实时几何形状操作(例如相交测试和坐标变换)提供增加的效率。然而,本领域技术人员将理解,本文的示例非限制性方法也可以应用于更昂贵的包围构造,例如obb、边界球和其他包围体技术。
110.已经细分的包围体(其确实包括场景中的几何形状的至少一部分)可以进一步递归地细分

就像从苏斯博士戴帽子的猫回来了(the cat in the hat comes back)(1958)的帽子中出现的越来越少的猫系列中的每一个一样。递归细分的数量和配置将取决于要建模的3d对象的复杂性和配置以及其他因素,例如所需的分辨率、对象与视点的距离等。一个
示例细分方案是所谓的8

ary细分或“八叉树”,其中每个体都细分为八个较小的统一大小的体,但是已知许多其他空间层次结构和细分方案,例如二叉树、四叉树、k

d树,二进制空间分区(bsp)树和包围体层次结构(bvh)树。参见,例如,usp 9582607。
111.在某个细分的级别下(对于bvh的不同部分可以是不同的级别),bvh的构建过程会遇到构成要建模的封装对象的几何形状。使用一棵树的类比,连续的体细分是树干、树枝、大树枝和小树枝,并且几何形状最终在树的最顶端(即叶子)处显现出来。例如本文的示例非限制性实施例的bvh构建过程在此阶段使用启发式或其他分析技术(在一些实施例中可包括人工智能和/或神经网络)执行优化,以认出那些叶子节点,这些叶子节点就其所包含的几何形状而言,呈现的拟合度很差。示例实施例可以应用这样的优化(例如,在共同待决的、共同转让的申请号为16/897,764的美国专利中描述的所谓的“多盒”技术)。
112.为了支持运动模糊,在关键点处定义了几何形状,如上所述,是轴向对齐的包围盒(aabb)或三角形。这些关键点存储在bvh/加速结构(as)中,以使运动中的每个aabb包围体或三角形在时间上至少具有两个样本。示例非限制性实施例确定和/或学习(例如,通过开发者声明、机器学习等)由bvh表示的几何形状是否正在运动(图3a的框206)。如果几何形状正在运动(判别块206的“是”出口),则bvh构造过程将构造运动压缩的treelet(complet),其包括附加的时间

位置信息,硬件以后可将该附加的时间

位置信息用于临时对包围体插值(请参见图4)和如下(图3a的框208)所述的几何形状(参见图5)位置。
113.在示例实施例中,bvh将一些对象表示为动态对象,而将其他对象表示为静态对象。在一个实施例中,出于紧凑的目的,bvh以不同的方式表示动态和静态对象。例如,可以使用单个组的空间信息(包围体位置和顶点)来表示静态对象,而可以使用多个组的空间信息(例如不同时刻的包围体位置和顶点)来表示动态对象。这使场景的静态部分的操作能够以正常或典型的方式进行,而无需插值,同时将附加的硬件加速和新的过程应用于场景的动态部分。
114.这个过程继续进行,直到包含几何形状的所有包围体被充分细分以为每个包围体提供合理数量的几何图元(图3a的210)。使用bvh的实时光线追踪器将通过比较每个图元的顶点的空间xyz坐标与光线的xyz坐标,以确定光线和该图元定义的表面是否占据相同的空间,从而确定光线

图元的相交。光线

图元相交测试可能需要大量计算,因为可能要测试许多三角形。在许多情况下,进一步按体细分可能会更有效,从而将任何“叶节点”中的图元数量限制为16个或更少。
115.将包括压缩的treelet的所得压缩树写出到存储器中的数据结构中,以供以后由图形处理硬件/软件在例如包括实时光线追踪的实时图形处理期间使用(图3a的212)。
116.图3b和图3c示出了3d场景的递归细分的包围体(图3b)和光线追踪器可以访问并用于硬件加速操作的相应树数据结构(图3c)。树数据结构可以存储在存储器中,并且可以基于查询按需检索。
117.包围体的划分可以在层次树数据结构中表示,其中大包围体由树的父节点表示,而较小的包围体由包括父节点的树的子节点表示。最小包围体表示为树中的叶节点,并标识这些最小包围体中包含的一个或更多个几何图元。
118.树数据结构包括以层次结构布置的多个节点。树结构的根节点n1对应于包围所有图元o1

o8的包围体n1。根节点n1可以标识包围体n1的顶点和根节点的子节点。
119.在图3b中,将包围体n1细分为包围体n2和n3。图3c的树结构的子节点n2和n3对应于并表示图3b所示的包围体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。图3c树结构的各个子节点n4、n5、n6、n8、n10和n11对应于并表示图3b在空间中的包围体n4、n5、n6、n8、n10和n11。
120.在此特定示例中图3c的树只有三到六层(level)深,因此包围体n4、n5、n6、n8、n10和n11构成“叶节点
”‑
即树中没有子节点的节点。图3b示出了叶节点包围体n4、n6和n8,其各自包含场景中几何形状的两个三角形。例如,体细分n4包含三角形o1和o2;体细分n6包含试验(trial)o5和o6;体细分n8包含三角形o7和o8。图3b还示出了叶节点包围体n5包含单个圆柱体o3,其对于虚线所示的aabb包围体n5没有提供良好的拟合。因此,在本文的示例非限制性实施例中,不是将较大的aabb包围体n5用于光线

包围体相交测试,而是系统针对多个较小的aabb包围体来测试光线,所述多个较小的aabb包围体被布置、定位、定尺寸并定向为更紧密地配合圆柱体o3。
121.图3c所示的树结构通过将这些叶节点n4、n5、n6和n7与场景几何形状的图元o1

o8中的适当一些相关联来表示它们。为了访问这种场景几何形状,系统向下遍历图3c的树数据结构到叶节点。通常,树的不同部分可以并且将具有不同的深度,并且包含不同数量的图元。与不包含几何形状的体细分相关联的叶节点无需在树数据结构中明确表示(即,树被“修剪”)。
122.根据一些实施例,以n7为根的子树可以表示一组包围体或bvh,其在与对应于节点n1

n3的包围体不同的坐标空间中定义。当包围体n7与它的父包围体n3在不同的坐标空间中时,实例节点n7'提供遍历以n7为根的子树所必需的光线变换,实例节点n7'可以将树的其余部分连接到以n7为根的子树。实例节点n7'通过定义从n1

n3的坐标空间(例如,世界空间)到n7等的坐标空间(例如,对象空间)的变换,将与节点n1

n3相对应的包围体或bvh与和节点n7相对应的包围体或bvh连接起来。
123.更详细地,请参见https://developer.nvidia.com/rtx/raytracing/dxr/dx12

raytracing

tutorial

part

1,它描述了顶层加速数据结构(tlas)和底层加速数据结构(blas)以及使用它们创建bvh的方法。在本文的一个示例实现中,对于每个对象或对象集,可以在对象周围定义blas包围体

以及在运动几何形状的情况下,可以为不同的时刻定义多个包围体。该包围体在对象空间中,并且可以紧密适合对象。所产生的blas包含几何形状的完整定义,其以适合于有效地找到与该几何形状的光线相交方式进行组织。
124.在对象空间中定义blas。在创建bvh时,所有这些个体对象(每个对象都在其各自的对象空间中)和关联的子treelet使用变换放置到世界空间中。因此,bvh为每个blas子树指定从对象空间到世界空间的变换。着色器使用这些变换将每个对象平移/旋转/缩放到世界空间中的3d场景中。在本文的实施例中,ttu中的硬件是实际执行或对变换进行加速的那些。
125.同时,bvh定义了世界空间中的tlas包围体。可以将tlas视为加速数据结构之上的
加速数据结构。因此,顶部的tlas层实现包围体和光线

complet测试,并且在一个实施例中不需要变换,因为光线是在世界空间中指定的。然而,在本文的示例非限制性实施例中,还可以利用多个空间位置对运动中的对象的tlas包围体进行时间编码,以允许硬件电路出于光线

包围体相交测试的目的计算出在光线的瞬间下的特定空间位置。
126.当光线追踪系统向下遍历树中的某个点并遇到实例节点时,模式从tlas(在世界空间中)切换为blas(在对象空间中)。在一个实施例中,对象顶点在对象空间中被定义为blas包围体(其可以与tlas包围体不同)。complet中的变换信息用于将光线从世界空间变换到对象空间,以针对blas子树进行测试。在一个实施例中,用于tlas光线

包围体相交测试的相同插值硬件也可以用于blas光线

包围体相交测试,并且可以为顶点插值和在blas层上进行的光线

图元相交测试提供不同的(例如,更高精度的)硬件。
127.加速数据结构支持示例非限制性基于硬件的运动模糊加速
128.为了支持运动模糊,在关键点处定义了几何形状,如上所述,是轴向对齐的包围盒(aabb)还是三角形。这些关键点存储在bvh/加速结构(as)中,以使运动中的每个aabb包围体或三角形在时间上至少具有两个样本。
129.硬件使用该信息通过在两个运动关键点之间进行插值来将该几何形状放置在与光线相对应的特定时间点。该插值可以是线性、球形、归一化线性或其他类型。在示例实施方式中,出于面积原因,加速的几何运动支持限于轴对齐的包围盒(aabb)和三角形的线性插值。但是,可以将任何其他插值(例如,slerp/球形线性插值或nlerp/归一化线性插值)可选地卸载到软件控制的协作处理器。插值类型也可以在单个加速结构(as)中混合在一起。
130.过去,随机性用于解决可能引起频闪效应的时间混叠。但是,更新要执行的每个样本的bvh会产生开销。相反,本技术和示例支持bvh捕获所有几何形状的帧期间的运动范围,并将其放入单个bvh中,然后在同一单个bvh内的那些运动范围内采样时间间隔。这避免了过去可能需要的作为采样过程一部分重复更新bvh的开销。当然,本文的技术还可以与bvh更新结合使用,以提供任何所需的效果和兼容性。
131.示例非限制性实时硬件插值
132.图4示出了针对轴向对准的包围盒的线性插值,以及图5示出了针对三角形图元的线性插值。
133.在此特定实例中,图4的包围体的线性插值包括访问对齐的包围盒(aabb)。图4进一步示出了包围盒在时间0处的低点和高点,以及同一包围盒在时间1处的低点和高点。在示例非限制性实施例中,硬件在这些低点值和高点值之间执行线性插值,以在入射光线指定的时间“ts”(时间戳)值处提供包围盒的低点和高点。
134.因此,非限制性硬件的示例将几何形状移动到光线表示的时间点。硬件可以使用简单插值来执行此操作。
135.图4a示出了在硬件中执行的示例计算,以提供线性插值(例如,使用8位硬件加法器电路、8位乘24位硬件乘法器电路、32位硬件移位寄存器和舍入电路、和另一个8位硬件加法器电路),但许多其他实现也是可能的。在该特定示例中,“hi”和“lo”是3
×
8位整数,并且“ts”可以是全精度(例如32位浮点)值(其他实施例可使用24位unorm或其他格式)。乘法可能低至8
×
8(取决于性能)。可以仅对最高9位执行移位以减小面积,并且对于unorm则不需要。所示的“round”针对“lo”为向下,针对“hi”为向上。应该注意的是,可以复制该硬件以为
3d虚拟空间的所有三个(xyz)维提供并行计算。或者可以重复使用3次以节省空间,但会降低性能。
136.通过进一步的解释,在一个示例非限制性实施例中,包围盒以较低的精度存储,而高精度的包围盒用于由complet表示的压缩树的整个集合。在所示的示例实现中,插值在变换为更高的精度之前以较低的精度执行,以简化计算并节省芯片上的空间。在硬件中实施这种低精度数学运算会产生面积大大减小的电路,并降低了功耗。因此,可以以较低的精度执行光线

包围盒相交测试以节省硬件复杂性。然而,在示例非限制性实施例中,以更高的精度执行光线

图元相交测试,以便更确定地确定光线是否在空间和时间上均与图元相交。
137.在所示的示例中,硬件首先在光线穿过场景时计算包围盒的空间位置(在此实现中,由光线时间戳指示)。在示例非限制性实施方式中,硬件在包围盒的低精度0和1端点之间使用低精度数学进行插值,以便确定在由光线表示的时刻下包围盒的位置。然后,在一个非限制性示例中,以不同的更高精度执行实际的相交测试以确定光线是否与包围盒相交。在这样的实现中,包围盒在complet中以低精度压缩格式表示,并且硬件将包围盒的位置变换为更高的精度,以执行光线

包围盒相交测试。
138.在一个示例非限制性实施例中,在将较低精度的包围盒坐标变换为较高精度之前,以低精度执行图4a所示的包围盒插值,以降低硬件复杂度。然后,在某些实现中,硬件可以继续进行变换,以将插值的包围盒坐标变换为更高的精度,以用于光线到包围盒的相交测试。因此,图4a所示的示例计算使用低精度(例如8位)分量来执行插值,然后将结果变换为更高的精度以执行光线

包围盒相交。
139.因为示例非限制性实现使用所示的低精度插值过程,所以可能希望使包围体稍微更保守以确保不错过任何相交。可以通过所示的舍入(向下舍入到低(round down for low)、向上舍入到高(round up for high))来执行,以考虑较低精度的插值计算。这样的舍入保证了无论光线何时进入,都要确保针对相交进行测试的包围盒当时包括相关的几何形状。如果插值做错了,则图元的角可能会伸出由低精度插值产生的数学生成的包围体。为避免该问题,所示运动方向的计算向下舍入到低值,向上舍入到高值。这样可以确保通过插值计算得出的包围体保持保守,并确保包围该几何形状。应当注意,如果对象沿与图4所示方向相反的方向运动,则舍入应该是相反的(即,向上舍入到高、向下舍入到低)以提供必要的包围保证。再次,可以复制图4的功能和图4a的硬件,以并行计算其他维度,以在虚拟空间的所有三个维度中提供并发相交测试。
140.在另一示例实施方式中,单个包围体可用于包含图元的整个运动范围,因此无需基于光线时间在包围体之间进行插值的任何需要。在这样的实现中,三角形图元穿过空间的扫描的图4表示可以表示为单个扫描

体图元(在这种情况下为3d棱镜)。换句话说,包围体将用于在运动几何形状从时间0到时间1运动通过场景时对运动几何形状扫过的所有体进行初始编码。在此类实现中,可以针对扫描的图元的体测试光线相交,然后使用另一种机制整理出时间因素。例如,一种可能的方式将是确定光线与伸出的图元相交的位置,并将此信息用于基于时间的相交测试。包围体计算的这种简化是以测试更多光线

图元相交为代价的,但是某些实现出于其他目的可能需要这样的结果。
141.图5示出了示例图元(在这种情况下为三角形),该图元在时间0处存在于场景中的某个位置,并在时间1处移至场景中的不同位置。所示的示例示出了,在全精度下表示所有
三个顶点。因此,在此示例中,由硬件电路执行的全精度计算用于在光线指定的时间处对图元的三个顶点的位置进行插值。图5a示出了该硬件电路,其包括全精度加法器电路“fadd”和全精度乘法和加法电路(“ffma”)。如图所示,可以为y和z维度复制此硬件电路,以在所有三个维度中提供并发并行插值(或在其他实现中,可以通过对x、y和z插值计算中的每一个重复使用硬件电路序列来节省面积,但是性能下降)。
142.虽然图5a中所示的插值是线性的,但在其他实现中,可能希望具有更复杂的插值,例如基于多项式,其更好地捕获空间中图元的运动。例如,在某些实施方式中,可能希望在诸如贝塞尔曲线、二次方或空间中的任何其他路径之类的曲线周围进行插值。为了增加能力并提供更复杂的插值,硬件计算可能需要更复杂,此外,对象表示可以扩展为不仅包括图元的每个顶点在时间间隔的起点和终点处的位置,还包括在每个起点和终点处运动路径的斜率。同时,图4所示的包围体插值应足够保守,以确保在图元沿着非线性、更复杂的路径运动时将运动的图元包围起来。
143.在一个实施例中,提供的包围盒测试是保守的,而对象相交测试被计算为是精确的。这是因为在一个实施例中,与光线相交的包围体测试仅需要保证当光线实际上与所包围的图元相交时测试结果将为正(但当光线不与包围的图元相交时也可能并通常为正,而不会对可视化产生不利影响),但是光线

图元相交测试必须准确,因为这是用于可视化的测试结果。
144.尽管图4和图5仅示出了平移,但是本领域的技术人员将理解,应当认识到能够被更一般地解释为包括旋转和/或缩放和/或变换。因此,所描述的示例非限制性过程可以用于平移和/或改变大小和/或旋转和/或变形(即,任何类型的运动)的几何形状。
145.不管几何形状如何变换(即平移、旋转、变形和/或缩放),都可以使用相同的插值来确定在光线的那个瞬间几何形状的位置。在变形的情况下,顶点可以沿任何方向独立运动,因此图4和图5足够概括以包含刚体运动和几何变形。硬件对每个顶点(在示例实现中并行地)线性地进行插值以适应所有此类可能性。这将产生经插值的图元,该经插值的图元存在于在光线的那个瞬间指定的最终顶点位置。
146.使用本文的基于硬件的技术提供了灵活性,以实时地或接近实时地为每个像素选择性地发射光线。因此,示例非限制性实施例可以基于随机或伪随机时间表发射光线以发现相交,使用固定间隔时间表将不会检测到该相交。即使在每像素固定间隔样本的数目增加到每帧数千个的情况下,由于像素采样之间的相关性,结果可能还是混叠的。避免这种情况的一种好方法是对每个像素使用较少数量的随机(时间上)相交测试,以便跨不同像素的采样时间之间不存在相关性。对于不同的光线类型,也可以选择不同的采样时间。尽管在一个实施例中,随机采样可以用于解决时间混叠,但是这里的技术不限于随机采样。在其他实现中,可以使用非随机的其他类型的采样。空间中的必然结果是在像素内的不同位置进行采样。众所周知,这减少了混叠。尽管这样的方法对于空间抗混叠效果很好,但是尝试执行时间过程以减少时间混叠往往会产生频闪效果。因此,减少时间混叠时的随机性比减少空间混叠时的随机性更重要。
147.样本的数量以及因此用于在时间上减少混叠的光线的数量与降噪有关。要获得完全无噪声的图像,可能需要大量的样本。因此,通常在最终视觉效果的质量和处理时间之间进行权衡,因为非常低的噪声结果可能需要非常大量的样本,并且需要更长的处理时间。也
可以估计像素和/或其邻居的方差以确定噪声量,并且出于仅在需要的那些图像区域上降低噪声的目的而自适应地添加附加样本/光线。
148.因为这种运动模糊处理的计算量很大,所以在过去,如果要产生这样的运动模糊,就必须放弃实时图形硬件的实时速度优势。过去,这导致开发人员针对至少某种类型的运动模糊退回到基于软件的方法,比实时方法慢得多。相反,本文的技术能够通过以在基于硬件的树遍历单元内处理光线并将其与几何形状相交的方式支持动态变换和对几何形状变形,从而在硬件上保持该工作。
149.在示例非限制性实施例中,硬件可以并行地对多个包围体执行插值,以提高有效处理速度。在一些示例限制中,针对硬件自己不能够执行的更复杂的处理,硬件可以在处理期间的任何时候将插值任务转移回基于软件的协作处理器(如果需要的话)。作为示例,代替在硬件中执行图元/几何形状插值,硬件可以将该任务转移回基于软件的处理器以执行插值。在一些示例实施例中,例如,为了节省面积,硬件可以能够或被配置为仅执行简单的插值,例如线性插值。如果特定的几何形状需要更复杂的插值算法,则可以将此类插值任务转移回基于软件的处理器,以提高灵活性。硬件复杂性和速度之间存在权衡;尽管通常需要花费更多时间将诸如插值之类的任务转移回基于软件的协作处理器,但是基于软件的处理器可以在执行哪些操作方面提供高度的灵活性。另一方面,在其他实施方式中,可能希望在硬件级别同时提供线性和某些形式的非线性插值或其他计算,以便硬件可以执行计算而无需将任务转移回到基于软件的过程。在某些实现中,线性插值可以覆盖大多数用例,并在硬件复杂性和总体性能之间提供有价值的权衡,但是可以考虑其他设计决策。
150.在示例非限制性实施例中,仅需要生成一次bvh,因为bvh会考虑它在给定的虚拟快门帧间隔内代表的所有对象的运动。然而,该技术不限于表示快门帧间隔内的所有对象。例如,在某些实现中可能希望使用bvh来使用较短的基于运动的时间间隔临时表示对象,并在常见的运动模糊分析中组合多个bvh表示的结果。因此,示例非限制性实施例提供了在开发者需要的任何时间长度上都被参数化的硬件。在许多常见应用程序中,从0

1开始的此类参数可能表示虚拟相机快门间隔的长度,但是其他用途和应用也是可能的。作为一个示例,可以使用更短的时间间隔为线性插值以外的专用插值输入提供更多的相交。
151.有利的非限制性示例实施方式可以包括实时和接近实时的图形生成。提供空间和时间抗混叠的一些用例可能需要,例如,近似于每个像素大约400个样本。提交本专利时已有的硬件可能无法实时提供这种快速采样。但是,随着硬件设计的发展并变得越来越快,不久就可以实时为高分辨率图像的每个像素采样足够的值,从而为空间和时间抗混叠提供足够数量的采样。同时,本文描述的技术在接近实时或其他非实时应用程序(例如电影制作)中非常有用,以大大减少生成场景的每个图像所需的时间,从而减少总体渲染时间。仍然有可能将本文中的技术与后处理滤波器组合以提供附加和/或不同的运动模糊效果,这并不依赖于用于产生基础图像的光线相交的相交采样。
152.自适应采样是另一种有用的技术,其可以用于对相较于需要更少采样的像素需要更多采样的像素(例如,像素下的运动越快,则针对该像素使用的样本越多)进行采样。但是,总是存在一个潜在的情况,即对象在一帧内完全在整个图像场上运动。因此,除非系统约束使得图像质量降低是可接受的和/或可以根据需要降低帧速率,否则仅使用自适应采样可能难以实现一致的性能。但这取决于特定的实现方式和相关的约束。
153.在一个示例非限制性实施例中,除了光线的时间戳的设置之外,没有用于关闭光线的运动模糊的单独机构。将所有运动范围定义为包含范围[0.0,1.0]。超出该范围(即,负数或大于1)的光线时间戳将丢失任何和所有运动模糊内容,尽管仍然会击中静态内容。在该范围的末端,可以确保精确地为0.0或1.0的值仅选择分别在时间间隔的开始或结束处指定的aabb或三角形。注意,负0.0的值被认为超出了范围。
[0154]
示例系统框图
[0155]
下面描述了可以与本技术一起使用的整体示例非限制性实时光线追踪系统。特别地,如上所述构造的加速结构可以通过在传统通用计算机上运行的基于软件的图形流水线处理而有利地使用。当前公开的非限制性实施例在基于硬件的图形处理单元的上下文中有利地实现上述技术,所述基于硬件的图形处理单元包括诸如一个或更多个流式多处理器(“sm”)的高性能处理器和一个或更多个遍历协处理器或“树遍历单元”(“ttu”)

3d图形处理管线的一个或一组流式多处理器sm的子单元。以下内容描述了诸如包括ttu 138的系统的整体结构和操作,ttu 138可加速支持交互式光线追踪的某些过程,其包括光线

包围体相交测试、光线

图元相交测试以及用于实时光线追踪的光线“实例”变换以及其他应用程序。
[0156]
图6示出了示例实时光线交互式追踪图形系统100,其使用包括如上所述构造的加速数据结构的场景或对象的三维(3d)数据来生成图像。
[0157]
系统100包括输入设备110、处理器120、图形处理单元(gpu)130、存储器140和显示器150。图6所示的系统可以采用任何形状因子,包括但不限于个人计算机、智能手机或其他智能设备、视频游戏系统、可穿戴虚拟或增强现实系统、基于云的计算系统、车载图形系统、片上系统(soc)等。
[0158]
处理器120可以是多核中央处理单元(cpu),该多核中央处理单元可操作为,作为对输入设备110的实时交互响应执行应用程序,其输出包括用于在显示器150上显示的图像。显示器150可以是任何种类的显示器,例如固定显示器、头戴式显示器(例如显示器眼镜或护目镜),其他类型的可穿戴显示器、手持显示器、车载显示器等。例如,处理器120可以基于从输入设备110接收的输入来执行应用程序(例如,操纵杆、惯性传感器、环境光传感器等),并指示gpu 130生成显示应用程序进展的图像以在显示器150上显示。
[0159]
基于应用程序在处理器120上的执行,处理器可以发布指令以供gpu 130使用存储在存储器140中的3d数据来生成图像。gpu130包括用于加速实时图像生成的专用硬件。例如,由于gpu执行重复和高度并行的特殊计算任务(例如多边形扫描变换)的能力比常规软件驱动的cpu快得多,因此gpu 130能够实时处理数千或数百万个图形图元(多边形)的信息。例如,与处理器120不同,处理器120可以具有多个核,其中该核具有一次可以处理几个软件线程的许多高速缓存存储器,gpu 130可以包括成百上千个正在并行运行的处理核或“流式多处理器”(sm)132。
[0160]
在一个示例实施例中,gpu 130包括多个可编程高性能处理器,其可以被称为“流式多处理器”(“sm”)132,以及包括图形图元引擎134和光栅引擎136的基于硬件的图形管线。gpu 130的这些组件被配置为使用称为“扫描变换光栅化”的技术执行实时图像渲染,以在二维显示器150上显示三维场景。在光栅化中,将3d场景的几何形状构建块(例如,点、线、三角形、四边形、网格等)映射到显示器的像素(通常经由帧缓冲存储器)。
[0161]
gpu 130将3d模型的几何形状构建块(即,诸如三角形之类的多边形图元)变换为2d图像的像素,并为每个像素分配初始颜色值。图形管线可以通过定义或调整像素的颜色值,将阴影、透明度、纹理和/或颜色效果应用于图像的各部分。可以对最终像素值进行抗混叠、滤波并提供给显示器150以进行显示。多年来,许多软件和硬件的进步已经使用光栅化技术以实时图形所需的帧率(即每秒30至60帧)以在一个或多个显示器150上的高显示分辨率(例如4096
×
2160像素或更高)改善了主观图像质量。
[0162]
为了使gpu 130能够以有效的方式实时地执行光线追踪,gpu提供了耦合到一个或更多个sm 132的一个或更多个“ttu”138。ttu138包括被配置为执行(或加速)光线追踪算法中常用的操作的硬件组件。ttu138的目标是将光线追踪中使用的操作加速到一定程度,该程度将光线追踪的功能带给实时图形应用程序(例如游戏),从而实现高质量的阴影、反射和全局照明。由ttu138产生的结果可以与在gpu130中执行的其他与图形有关的操作一起使用或作为其替代而使用。
[0163]
更具体地,sm132和ttu138可以协作以将光线投射到3d模型中,并确定该光线是否以及在何处与模型的几何形状相交。光线追踪直接模拟在虚拟环境或场景中行进的光线。光线相交的结果与表面纹理、观察方向和/或照明条件一起用于确定像素颜色值。由与ttu 138配合使用的sm 132进行的光线追踪允许计算机生成的图像以与真实世界的照片或视频无法区分开的方式捕获阴影、反射和折射。由于部分地由于需要追踪大量的光线,因此光线追踪技术比光栅化在计算上更加密集,因此ttu 138能够在硬件中加速该过程中某些计算量更大的方面。
[0164]
给定如上所述构造的bvh,ttu 138执行树搜索,其中光线访问的树中的每个节点针对每个后代分支或叶子都有包围体,并且光线仅访问相应包围体与之相交的后代的分支或叶子。以这种方式,ttu 138仅显式地测试少量图元的相交,即驻留在被光线相交的叶节点中的图元。在示例非限制性实施例中,ttu 138加速树遍历(包括光线

体测试)和光线

图元测试。作为遍历的一部分,它还可以处理至少一级实例变换,将光线从世界空间坐标变换为实例网格的坐标系。在示例非限制性实施例中,ttu 138以mimd方式完成所有这些操作,这意味着一旦在ttu内部就独立地处理光线。
[0165]
在示例非限制性实施例中,ttu 138作为sm(流式多处理器)132的服务方(协处理器)运行。换句话说,示例非限制性实施例中的ttu 138不是独立运行,而是遵循sm 132的命令,以比sm 132自己执行更高效地执行某些与计算密集的光线追踪相关的任务。在其他实施例或体系结构中,ttu 138可以具有更多或更少的自治权。
[0166]
在所示的示例中,ttu 138通过sm 132指令接收命令,并将结果写回到sm寄存器文件。对于许多用例(例如,具有最多一个实例化级别的不透明三角形),ttu 138可以为光线追踪查询提供服务,而无需与sm 132进一步交互。更复杂的查询(例如,涉及经过alpha测试的三角形,除三角形以外的其他图元或多个实例化级别)可能需要多次往返(尽管本文的技术通过为ttu 138提供增强的能力以自动执行光线

包围体相交测试而无需向调用sm寻求帮助,从而为某些类型的几何形状减少了此类“往返”的需求)。除了追踪光线,ttu 138还能够执行更一般的空间查询,其中aabb或两个aabb之间的伸出的体(我们称为“光束”)代替了光线。因此,尽管ttu 138特别适合于加速与光线追踪有关的任务,但是它也可以用于执行除光线追踪之外的任务。
[0167]
因此,ttu 138会针对广范围的包围体自主地执行对每条光线的测试,并且可以剔除不与该光线相交的任何包围体。遍历协处理器从包围(bound)场景中所有内容的根节点开始,针对较小(可能重叠)的子包围体测试每条光线,这些子包围体又反过来包围bvh的后代分支。光线跟随光线所击中的包围体的子指针到其他节点,直到到达bvh的叶节点或末端节点(体)为止。
[0168]
一旦ttu 138遍历加速数据结构以到达与光线相交并包含几何图元的终端或“叶”节点(可以由一个或更多个包围体表示),它将执行加速的光线

图元相交测试,以确定光线是否与该图元相交(并因此与该图元定义的对象表面相交)。光线

图元测试可以提供有关与光线相交的图元的其他信息,这些信息可用于确定着色和可视化所需的表面的材料属性。通过加速数据结构的递归遍历使遍历协处理器能够发现与光线相交的所有对象图元,或者发现与光线相交的最接近(从视点的角度来看)的图元(在某些情况下,这是从沿光线的视点唯一可见的图元)。参见例如lefrancois等人的nvidia vulkan光线追踪教程(nvidia vulkan ray tracing tutorial),2019年12月,https://developer.nvidia.com/rtx/raytracing/vkray
[0169]
如上所述,ttu 138还加速了每条光线从世界空间到对象空间的变换,以获得图元的越来越精细的包围盒封装,并减少了这些图元在场景中的重复。如上所述,在场景中以不同的位置、方向和比例多次复制的对象可以在场景中表示为实例节点以及指向对象空间bvh的指针,这些实例节点将世界空间bvh中的包围盒和叶节点与可以应用于世界空间光线的变换相关联以将其变换到对象坐标空间。这避免了在世界空间中多次复制对象空间bvh数据,从而节省了内存和相关的内存访问。实例变换通过将光线变换到对象空间而不是要求将几何形状或包围体层次结构变换到世界(光线)空间来提高效率,并且还与图形处理执行以可视化图元的附加常规光栅化过程兼容。
[0170]
示例光线追踪过程
[0171]
图7示出了可以由sm 132执行并由ttu 138加速的示例性光线追踪着色管线900。光线追踪着色管线900由sm 132调用光线生成910并向ttu 138发出相应的光线追踪请求来开始。光线追踪请求识别投射到场景中的单条光线,并要求ttu 138搜索具有sm 132也指定的加速数据结构的相交。ttu 138遍历(图7的框920)加速数据结构以确定光线与体细分以及加速数据结构所表示的相关三角形之间的相交或潜在相交。潜在的相交可以通过在加速数据结构中找到与光线相交的包围体来识别。非相交包围体的后代不需要检查。
[0172]
对于相交的包围体内的三角形,ttu 138光线

图元测试块720执行相交930过程以确定光线是否与图元相交。ttu 138将相交信息返回给sm 132,sm 132可以响应于相交确定执行“任何击中”着色操作940。例如,sm 132可以对相交的图元执行(或让其他硬件执行)纹理查找,并基于适当的纹理像素的值决定如何为可视化光线的像素着色。由于ttu 138可以按任意顺序返回与场景中的不同几何形状的多个相交点,因此sm 132会追踪此类结果。
[0173]
图8是流程图,其概述了ttu 138如上所述与sm 132协同执行的示例光线追踪操作。图8的操作由ttu 138与和其交互的sm 132配合进行。因此,ttu 138可以从sm 132接收对光线的识别并且遍历状态,该遍历状态枚举该光线必须遍历的一个或更多个bvh中的一个或更多个节点。ttu 138确定光线与bvh数据结构的哪个包围体相交(“光线complet”测试512)。ttu 138随后还可以确定光线是否与相交的包围体中的一个或更多个图元相交以及
相交了哪些三角形(“光线

图元测试”520)

或如果ttu自身执行起来很复杂,sm 132也可以用软件执行此测试。在示例非限制性实施例中,complet指定包围体层次结构的根或内部节点(即,体),包围盒层次结构具有为其他complet的子项或每个complet单一类型的叶节点。
[0174]
首先,ttu 138检查光线的遍历状态。如果ttu 138为光线维持的堆叠是空的,则遍历完成。如果栈顶上有条目,则遍历协处理器138向存储子系统发出请求以检索该节点。然后,遍历协处理器138执行包围盒测试512以确定bvh数据结构的包围体是否与sm 132指定的特定光线相交(步骤512、514)。如果包围盒测试确定包围体不与光线相交(步骤514中为“否”),则无需执行任何进一步的可视化测试,并且ttu 138可以将此结果返回给发出请求的sm 132。这是因为,如果光线错过包围体(如图2a中的包围体310所示),则光线将错过被测试的包围体内的所有其他较小的包围体以及该包围体包含的任何图元。
[0175]
如果由ttu 138执行的包围盒测试显示包围体与光线相交(在步骤514中为“是”),则ttu确定是否可以将包围体细分为较小的包围体(步骤518)。在一个示例实施例中,ttu 138本身不必执行任何细分。而是,bvh中的每个节点都有一个或更多个子项(其中每个子项是bvh中的叶或分支)。对于每个子项,都有一个或更多个包围体和指向分支或叶节点的指针。当光线使用ttu 138处理节点时,它正在针对该节点的子项的包围体进行自我测试。光线只将那些其代表性包围体被击中的分支或叶子的堆栈条目推入其堆栈。在示例实施例中,当光线获取节点时,它不会针对该节点的包围体进行测试,而是针对该节点的子节点的包围体进行测试。ttu 138按由光线配置确定的顺序将其包围体被光线击中的节点推到光线的遍历堆栈上。例如,可以按节点在内存中出现的顺序,或它们沿着光线的长度出现的顺序或其他某种顺序将节点推到遍历堆栈上。如果存在包围体的进一步细分(在步骤518中为“是”),则访问包围体的那些进一步细分,并且对每个所得到的细分的包围体执行包围盒测试,以确定哪些细分的包围体与光线相交而哪些不与光线相交。在该递归过程中,一些包围体可以通过测试514来消除,而其他包围体可以导致通过ttu 138递归地应用步骤512

518来对进一步的细分进行相交测试。
[0176]
一旦ttu 138确定与光线相交的包围体是叶节点(步骤518中为“否”),则ttu 138和/或sm 132执行图元(例如,三角形)相交测试520以确定光线是否与相交的包围体中的图元相交,以及光线与哪些图元相交。因此,ttu 138执行相交的后代分支节点的深度优先遍历,直到到达叶节点为止。ttu 138处理叶节点。如果叶节点是图元范围,则ttu 138或sm 132将它们相对于光线进行测试。如果叶节点是实例节点,则ttu 138或sm 132应用实例变换。如果叶节点是项范围,则ttu 138将它们返回给请求的sm 132。在示例非限制性实施例中,sm 132可以命令ttu 138执行不同种类的光线

图元相交测试并根据来自应用程序(或在其上运行该应用程序的软件栈)的操作报告不同的结果,并由sm中继到ttu。例如,sm 132可以命令ttu 138报告相交测试揭示的最近的可见图元,或报告与光线相交的所有图元,而不管它们是否是最近的可见图元。sm 132可以将这些不同的结果用于不同类型的可视化。或者,一旦ttu 138已经报告了光线

complet测试结果,sm 132即可自行执行光线

图元相交测试。ttu 138处理完叶节点后,可能会有其他分支节点(较早推送到光线的堆栈上的分支节点)要测试。
[0177]
示例非限制性ttu 138硬件实现
[0178]
图9示出了ttu 138的示例简化框图,该ttu 138包括配置为执行如上所述的加速
遍历操作的硬件。在一些实施例中,ttu 138可以使用采用支持的叶节点图元的相交测试的短堆栈遍历以及阿尔法图元和不支持的叶节点图元(项)的中间遍历返回,执行包围体层次结构的深度优先遍历。ttu 138包括确定光线是否与包围体相交的专用硬件,以及确定光线是否与树数据结构的图元相交的专用硬件。在所示的示例中,在光线

complet测试盒710中执行图4、图4a所示的用于光线

包围盒测试的线性插值。在示例非限制性实施例中,在图5、图5a中示出的针对图元的插值可以在在光线

三角形测试盒(rtt)720中执行。
[0179]
更详细地,ttu 138包括相交管理块722、光线管理块730和堆栈管理块740。这些块中的每一个(以及图9中的所有其他块)可以构成由逻辑门、寄存器、硬件嵌入式查找表或其他组合逻辑等实现的专用硬件。
[0180]
光线管理块730负责管理关于由sm 132向光线管理块指定的光线的信息并执行与之相关的操作。堆栈管理块740与遍历逻辑712一起工作以管理关于bvh加速数据结构的遍历的信息并执行与之有关的操作。遍历逻辑712由光线

complet测试块710的结果指导,该光线

complet测试块710根据需要使用实例变换来测试光线管理块730指示的光线与bvh表示的体细分之间的相交。光线

complet测试块710经由作为ttu 138的一部分的l0complet高速缓存752从存储器140检索关于bvh的附加信息。光线

complet测试块710的结果通知遍历逻辑712是否需要进一步的递归遍历。堆栈管理块740维护堆栈,以在遍历逻辑712从bvh的一层遍历到另一层时追踪状态信息,其中随着遍历逻辑遍历到更深的bvh,堆栈管理块740将项推入堆栈,以及随着遍历逻辑在bvh中向上遍历,将项从堆栈中弹出。堆栈管理块740能够在sm请求的任何时间向请求sm 132提供状态信息(例如,中间或最终结果)。
[0181]
相交管理块722使用所需的实例变换来管理关于光线和图元之间的交点的信息并执行与之相关的操作。光线

图元测试块720根据需要通过作为ttu138一部分的l0图元高速缓存754从存储器140中检索关于几何形状的信息。向相交管理块722通知光线

图元测试和变换块720执行的相交测试的结果。因此,光线

图元测试和变换块720将相交结果提供给相交管理块722,相交管理块722向请求sm 132报告几何形状击中和相交。
[0182]
堆栈管理单元740检查遍历状态以确定需要检索什么类型的数据以及哪个数据路径(complet或图元)将消耗它。在包括一个或更多个光线

complet测试块710和一个或更多个遍历逻辑块712的ttu 138的光线

complet测试路径中确定包围体的相交。complet指定包围体的根节点或内部节点。因此,complet可以为光线

complet测试定义一个或更多个包围体。在本文的示例实施例中,complet可以定义多个“子”包围体(无论它们是否表示叶节点),它们不一定每个都具有后代,但是ttu将并行测试其与光线

包围体的相交,以确定是否需要测试与多个包围体关联的几何图元的相交。
[0183]
ttu 138的光线

complet测试路径识别光线与哪些包围体相交。与光线相交的包围体需要进一步处理,以确定与相交的包围体关联的图元是否相交。在包括一个或更多个光线

图元测试和变换块720以及一个或更多个相交管理块722的光线

图元测试路径中确定图元的相交。
[0184]
ttu 138从一个或更多个sm 132接收执行树遍历操作的查询。该查询可以请求光线是否与bvh数据结构中的包围体和/或图元相交。该查询可以识别光线(例如,光线的原点、方向和长度)以及bvh数据结构和遍历状态(短堆栈),其包括引用该光线将要访问的一个或更多个包围体层次结构中的节点的一个或更多个条目。该查询还可以包括关于在遍历
期间光线如何处理特定类型的相交的信息。可以将光线信息存储在光线管理块730中。可以基于光线

图元测试的结果来更新所存储的光线信息(例如,光线长度)。
[0185]
ttu 138可以请求从ttu 138外部的存储器中检索在查询中标识的bvh数据结构。bvh数据结构的检索出的部分可以高速缓存在ttu内138的零级(l0)高速缓存750中,因此该信息可用于其他时间相关的ttu操作,从而减少了存储器140的访问。光线

complet测试所需的bvh数据结构的部分可被存储在l0complet高速缓存752中,并且光线

图元测试所需的bvh数据结构的部分可被存储在l0图元高速缓存754中。
[0186]
在complet高速缓存752中获得请求的遍历步骤所需的complet信息之后,光线

complet测试块710确定与光线相交的包围体。在执行此测试时,可以将光线从包围体层次结构的坐标空间变换到相对于complet定义的坐标空间。针对与complet的子节点关联的包围盒测试光线。在示例非限制性实施例中,未针对complet自己的包围盒测试光线,因为(1)ttu 138先前在测试引用此complet的父包围盒子项时针对相似的包围盒测试了光线,并且(2)complet包围盒的目的是定义一局部坐标系,在该局部坐标系中子包围盒可以以压缩形式表示。如果光线与任何子包围盒相交,则将结果推入遍历逻辑以确定将相应的子指针推入遍历堆栈的顺序(进一步的测试可能需要遍历逻辑712向下遍历到bvh的下一层)。递归地重复这些步骤,直到遇到bvh的相交叶节点为止。
[0187]
光线

complet测试块710可以向遍历逻辑712提供光线

complet相交。使用光线

complet测试的结果,遍历逻辑712创建要被推送到堆栈管理块740的堆栈条目。堆栈条目可以指示内部节点(即,包括一个或更多个子节点的节点),需要由光线

complet测试块710针对光线相交进行进一步测试的内部节点和/或在相交的叶节点中标识的三角形,需要由光线

图元测试和变换块720针对光线相交测试该相交的叶节点。光线

complet测试块710可以在堆栈中标识的内部节点上重复遍历,以确定与光线相交的bvh中的所有叶节点。在示例非限制性实施例中,光线

complet测试块710执行的精确测试将由模式位、光线操作(参见下文)和击中剔除来确定,并且ttu 138可以将中间以及最终结果返回至sm 132。
[0188]
光线

图元相交测试
[0189]
再次参考图9,ttu 138还具有加速相交测试的能力,该相交测试确定光线是否与特定几何形状或图元相交。对于某些情况,几何形状足够复杂(例如,与例如顶点相比,由曲线或其他抽象构造所定义),以致在某些实施例中,ttu 138可能无法帮助进行光线

图元相交测试。在这种情况下,ttu 138只是将光线

complet相交测试结果报告给sm 132,而sm 132本身会执行光线

图元相交测试。在其他情况下(例如,三角形),ttu138自身可以执行光线

三角形相交测试,从而进一步提高了整个光线追踪过程的性能。下面描述ttu 138如何执行或加速光线

图元相交测试。
[0190]
如上所解释的,所找到的与光线相交的叶节点识别(包围)可能与光线相交或不与光线相交的图元。ttu 138的一种选择是向sm 132提供例如在相交的叶节点中识别出的一系列几何形状以进行进一步处理。例如,sm 132自身可以基于ttu 138作为ttu遍历bvh的结果而提供的信息,确定所识别出的图元是否与光线相交。为了从sm 132卸载该处理并从而使用ttu 138的硬件对其进行加速,堆栈管理块740可以发出对光线

图元的请求,并且变换块720对ttu的光线

complet测试块710识别出的相交的叶节点内的图元执行光线

图元测试。在一些实施例中,sm 132可以发出对光线

图元测试的请求以测试特定范围的图元和变
换块720,而与如何识别该几何形状范围无关。
[0191]
在确保请求的光线

图元测试所需的图元数据在图元高速缓存754中可用之后,光线

图元和变换块720可使用存储在光线管理块730中的光线信息确定与光线相交的图元。光线

图元测试块720向相交管理块722提供确定为与光线相交的图元的识别。
[0192]
相交管理块722可以将光线

图元测试的结果返回给sm 132。光线

图元测试的结果可以包括相交图元的标识符,交点距离光线原点的距离以及其他与相交图元的属性有关的信息。在一些实施例中,相交管理块722可以基于来自光线

图元和变换块720的先前相交结果来修改现有的光线

图元测试(例如,通过修改光线的长度)。
[0193]
相交管理块722还可以追踪不同类型的图元。例如,不同类型的三角形包括在相交时将阻挡光线的不透明三角形,以及在相交时可能会或可能不会阻挡光线或可能需要sm进行其他处理的alpha三角形。光线是否被透明三角形阻挡可能例如取决于映射到三角形上的纹理、该纹理所占据的三角形面积以及纹理修改三角形的方式。例如,在某些实施例中,透明度(例如,染色的玻璃)要求sm 132追踪透明的对象击中,以便可以按光线参数顺序对其进行分类和着色,并且通常不会实际上阻挡光线。同时,alpha“修剪”允许基于映射到图元的纹理形状来修剪图元的形状,例如,将叶子形状切成三角形。(请注意,在光栅图形中,透明度(transparency)通常称为“alpha混合”,而修剪则称为“alpha测试”)。在其他实施例中,ttu 138可以将透明击中推送到存储器中的队列以供sm 132以后处理,并通过向纹理单元发送请求来直接处理修剪后的三角形。每个三角形可包括指示符,以指示三角形的类型。相交管理块722被配置为维持用于追踪不同类型的相交三角形的结果队列。例如,结果队列可以在一个队列中存储一个或更多个相交的不透明三角形标识符,并且在另一队列中存储一个或更多个透明三角形标识符。
[0194]
对于不透明的三角形,可以在ttu 138中完全确定针对不太复杂的几何形状的光线相交,因为不透明的三角形的区域会阻挡光线穿过三角形的表面。对于透明三角形,在某些实施例中,无法在ttu 138中完全确定光线相交,因为ttu 138基于三角形的几何形状执行相交测试,并且可能无法访问三角形的纹理和/或纹理所占据的三角形面积(在其他实施例中,可以通过图形管线的纹理映射块向ttu提供纹理信息)。为了完全确定三角形是否相交,可以将关于光线

图元和变换块720确定为相交的透明三角形的信息发送到sm 132,以便sm全面确定该三角形是否影响沿光线的可见性。
[0195]
sm 132可以确定光线是否与和透明三角形相关联的纹理相交和/或光线是否将被该纹理阻挡。在一些情况下,sm 132可以基于该确定将修改的查询发送到ttu 138(例如,如果光线被纹理阻挡则缩短光线)。在一个实施例中,ttu 138可以被配置为将确定为与光线相交的所有三角形返回给sm 132,以进行进一步处理。因为就接口和线程同步而言,将每个三角形相交返回到sm 132进行进一步处理都是昂贵的,所以ttu 138可以配置为隐藏相交但可证明能够被隐藏而不会对所得场景造成功能上的影响的三角形。例如,因为向ttu 138提供了三角形类型信息(例如,三角形是不透明的还是透明的),所以ttu 138可以使用三角形类型信息来确定沿着光线被另一个相交的不透明三角形遮挡的相交三角形,并且因此不必将其包含在结果中,因为它们不会影响沿光线的可见性。如果ttu 138知道三角形被不透明的三角形沿光线遮挡,则可以从结果中隐藏被遮挡的三角形,而不会影响所得场景的可视化。
[0196]
相交管理块722可以包括结果队列,该结果队列用于存储与三角形id相关联的击中以及与光线击中三角形的点有关的信息。当确定光线与不透明三角形相交时,可以将三角形的身份和交点与光线原点的距离存储在结果队列中。如果确定光线与另一个不透明三角形相交,则如果交点到光线原点的距离大于已存储在结果队列中的相交的不透明三角形的距离,则可以从结果中忽略该另一个相交的不透明三角形。如果交点距光线原点的距离小于已存储在结果队列中的相交的不透明三角形的距离,则另一个相交的不透明三角形可以替换结果队列中存储的不透明三角形。测试了查询的所有三角形之后,可以将在结果队列中存储的不透明三角形信息和相交信息发送到sm 132。
[0197]
在一些实施例中,一旦识别出不透明三角形交点,则相交管理块722可以缩短存储在光线管理块730中的光线,以使得相交的不透明三角形(沿着光线)后面的包围体(其可以包括三角形)将不会被识别为与光线相交。
[0198]
相交管理块722可以将关于相交的透明三角形的信息存储在单独的队列中。所存储的关于相交的透明三角形的信息可以被发送到sm 132,以供sm确定光线是否与和三角形相关联的纹理相交和/或该纹理是否阻挡光线。sm可以基于该确定,将该确定的结果返回给ttu 138和/或修改查询(例如,如果该光线被纹理阻挡,则缩短该光线)。
[0199]
如上所讨论的,ttu 138允许快速遍历加速数据结构(例如,bvh),以确定数据结构中的哪些图元(例如,用于生成场景的三角形)与查询数据结构(例如,光线)相交。例如,ttu 138可以确定加速数据结构中的哪些三角形与光线相交并将结果返回给sm 132。但是,就接口和线程同步而言,将每个三角形相交的结果返回给sm 132的成本很高。ttu 138提供了一种硬件逻辑,该硬件逻辑被配置为隐藏那些被证明能够被隐藏而对所得场景没有功能性影响的项或三角形。结果返回给sm的减少和线程之间的同步步骤大大提高了遍历的整体性能。在本技术中公开的ttu 138的示例非限制性实施例提供了在没有sm 132干预的情况下在ttu 138内丢弃一些相交,使得更少的相交返回到sm 132,并且sm 132不必检查所有相交的三角形或项范围。
[0200]
示例非限制性数据结构
[0201]
以下描述了在一些实施例中用于支持运动模糊的新的或增强的光线追踪数据结构。
[0202]
示例非限制性运动complet:
[0203]
在示例非限制性实施例中,新的压缩的treelet表示/格式用于指定存在treelet表示的几何形状的开始时间和结束时间。这些开始时间和结束时间用于插值。不在运动中的加速数据结构可以使用更多的压缩格式,这些压缩格式不包括时间编码和其他几何形状位置信息。例如,完全静态的对象不需要用开始和结束位置信息表示。另一方面,运动中的对象可以包括此附加信息,以允许在几何形状有效的时间间隔内进行插值,但代价是压缩减少(这比要求两个完全不同的加速数据结构更好,尤其是在硬件一次只能访问一个加速数据结构的情况下)。
[0204]
在示例非限制性实施例中,仅具有运动的几何形状需要用新的complet格式捕获。可以使用更多压缩的complet格式表示所有静态几何形状,并且可以在同一bvh中对静态和运动下的几何形状complet进行混合和匹配。在这种情况下,静态几何形状将被带有任何时间戳的光线击中。在这种情况下,时间戳实际上变为无操作(nop)。
[0205]
在示例非限制性实施例中,complet可以表示仅在complet适用于的一部分持续时间内存在于场景中的几何形状,然后几何形状在另一部分时间间隔内消失或以其他方式不存在。例如,当加速数据结构支持实例化时,每个实例可以具有其自己的持续时间,并且不同的实例可以具有不同的持续时间/间隔。
[0206]
更详细地,在示例非限制性实施例中,对编码aabb的压缩treelet(complet)格式进行更新以指示运动。图12示出了具有“format”字段的新complet格式,该字段有选择地启用运动模糊。例如,如果“format”=1或“format”=3,则启用运动模糊(format=3可以指定同时启用运动模糊和多盒),如果“format”=0,则不启用运动模糊。在一个示例非限制性实施例中,运动内容可以与允许多盒运动的多盒内容正交(usp no.16897764)。类似地,在一个实施例中,本文所述的运动插值支持具有共享边缘的三角形(参见usp no.16901023),并且三角形对相交效率也可以对运动插值有效。特别地,例如,使用这种技术,共享顶点的运动插值避免了成对的第二三角形中相同顶点的冗余计算。
[0207]
在一个示例实施例中,当complet格式为1或3时,则创建概念运动对子项。图13a的complet是当前的标准,图13b的complet是运动格式。图13b格式包括运动子项1002(0)、1002(10),每个运动子项组合了来自偶数和奇数非运动子项的字段,其中数据和rval仅对偶数盒有效,而无效/有效仅基于在偶数盒上。参见图14a、图14b,启用后,两个相邻的子项将用作运动模糊对。例如,child0代表时间戳为0.0处的包围盒,child1代表时间戳为1.0处的包围盒。这样,子项的有效最大数量从12个减少到6个。当为complet启用运动模糊时,所有子项均被视为运动模糊。叶子没有区别。
[0208]
更详细地,加速数据结构的示例非限制性实施例中的运动表示在指定的参数化时间间隔内将传统complet格式的两个子包围盒分配给包围盒的开始和结束位置表示。在所示的示例中,图13a的传统格式的子项一可以表示包围盒的开始位置,而传统格式的子项二可以代表同一包围盒的结束位置。图13a示出了与图13b的运动complet内的运动子项的内容相比,complet内的非运动子项的内容的示例。
[0209]
在一个示例非限制性实施例中,实际时间间隔可以存储在所有子项上的未使用位置中。该替代实施方式可能在硬件中引起一些额外的复杂性,但是在某些实施方式中可能有用以提供额外的灵活性(即,为complet中的每个单独子项提供定时编码)。例如,这样的实现可以使用除0和1以外的时间间隔参数,并对该间隔内的任意开始和结束时间进行参数化。如果使用这种实现方式,则可以使用附加的硬件计算来将存储在complet中的信息映射到插值的结果中。
[0210]
如果使用长指针数据(longptrdata),则在一个实施例中,即使只有子项11中的字段用于长指针,图13b所示的所有运动子项10也是无效的。即,运动长指针数据字段可以具有与运动子项相同的大小。参见图15a(传统长指针数据),15b(运动长指针数据)。
[0211]
假定对于该blas中所有几何形状的每个端点,任何底层加速结构(“blas”)都具有单个设置。变换机制决定将时间戳正确地钳位为0.0和/或1.0(钳位模式)还是允许其超出该范围以消失。这样的钳位可以在硬件和/或软件中完成。在一个示例当前实施方式中,该工作是在软件中基于协作软件的处理器上完成的,但是可以在未来版本的硬件中完成。
[0212]
在一些非限制性实施例中,新的“强制返回至处理器(force

return

to

processor)”位、标志或指示符被添加到实例节点complet的数据字段。在设置了该位、标志
或指示符后,如果模式在其他方面为“在硬件中处理(process

in

hardware)”,则实例节点将强制为“返回至处理器(return

to

processor)”模式。这种行为不仅限于运动complet;该位、标志或指示符可用于需要在基于软件的处理器中处理的任何变换,包括例如运动变换、具有运动范围变化的静态变换、甚至其他用途,例如扩展可见性测试。同时,可以将变换后的光线直接写回到硬件中,并且遍历可以从底层堆栈开始,而无需在处理器上进行变换。这消除了对底回到顶迁移的需要,而不必回到处理器。
[0213]
因此,在每实例节点子项指定的complet中的位可用于在相交时强制返回处理器。参见图16,“frts”。这使每个单独的变换都可以标记为运动变换,而不必使用ray ops。如果实例变换可以使用现有的变换机制完成,则即使基础或先前的内容是运动,它仍可以在硬件上运行。这也允许tlas、blas和变换(transform)与运动和静态的任何交叉乘积。例如,通过运动变换将运动tlas变换为运动blas,通过静态变换将运动tlas变换为运动blas,通过运动变换将静态tlas变换为静态blas,或者通过运动变换将静态tlas变换为运动blas等。
[0214]
图16示出了具有“强制返回”选项的示例complet数据字段,该选项可以强制硬件将中间结果返回给基于软件的协作处理器以进行进一步处理。在一个示例实现中,为每个实例节点添加了图16的“frts”(强制返回到sm)字段。此强制返回值指定是否需要将特定实例节点返回到基于软件的协作处理器以作为光线操作的结果进行进一步处理。所示示例提供了一种额外的独立机制,该机制允许bvh设计人员指定该特定对象实例具有需要在软件而非硬件中处理的变换,从而迫使从基于硬件的处理器返回到基于软件的处理器以进行进一步处理。
[0215]
例如,在一个非限制性实施方式中,可以为ttu提供足够的能力以执行用于使几何形状变形的变换,但是为了节省实际空间,不为ttu提供对某些类型的平移几何形状进行变换的能力(或反之亦然)。在这种情况下,可以构造bvh,以在硬件执行光线

图元相交测试之前,强制硬件将几何形状返回给协作处理器以进行几何形状的变换。
[0216]
迫使返回到基于软件的处理器的另一个潜在原因是时间间隔是否正在改变。在一个非限制性示例中,顶层的加速数据结构应当捕获帧的整个0至1时间间隔。但是,加速数据结构内的子树只能捕获整个时间间隔的子间隔,而备用子树可以用于捕获或表示不同的子间隔。例如,对象可能仅在由加速数据结构表示的整个时间间隔的一部分内运动,并且可能是静态的,或者对于该间隔的其他部分可能不存在。因此,可能需要在顶层时间参数和较低层时间子参数之间建立映射。这种映射可以由基于软件的处理器灵活方便地执行,以减轻硬件的过度复杂性。
[0217]
示例非限制性运动三角形块表示:
[0218]
图17a

17e示出了一个示例非限制性实现是如何指定几何图元的。所示的特定格式可以专门用于运动模糊图元,例如运动模糊三角形。示例非限制性实施例引入了用于运动模糊三角形的新的三角形块压缩格式。图17a

17e所示的格式几乎与传统的压缩三角形格式相同,但有显着差异,包括:
[0219]
(1)引入了新的格式模式“2:motion blur tri”(图17b,“mode(模式)”字段),
[0220]
(2)每个运动模糊三角形具有6个顶点索引v[0,1,2].[start,end],这意味着顶点索引部分中每三角形x位,而不是仅y位(或第一个三角形2位)(见图17e),以及
[0221]
(3)三角形0不再具有隐式顶点索引。
[0222]
示例非限制性实例节点表示:
[0223]
尽管在一些示例实施例中,硬件将不处理运动变换,但是其可以处理运动变换实例节点,以便初始化除了变换后的光线原点和方向以外的所有节点。为了支持这一点,可以将与静态变换实例节点交错的运动变换实例节点构造为具有相同的报头信息。为了允许在静态变换实例节点和运动变换实例节点之间进行区分,示例非限制性实施例引入了例如“1”的新报头格式“ext”字段值(参见图18a)。
[0224]
参见图18a

18c,其示出了通过引入图18a的“ext”字段和相关联的行为对实例节点格式进行的示例非限制性改变。另外,图18b的布局可以包括指定扩展报头的新“format”字段值(当格式字段值为例如“1”时,则使用扩展报头),图18c的扩展报头字段可以指定用户格式。
[0225]
在一个实施例中,图18c的扩展报头位于其他字段的较低位,例如rootcompletptr。这些较低位在传统实现中已被“视为零”,因此我们可以安全地将它们重用于扩展报头。所有这些较低位都被保留用于扩展报头。最低某数目(例如2)的位被定义为“userformat”,并被保留供软件使用。硬件将不会使用或触摸这些位。但是软件可以使用它们来区分实例节点的类型以及该实例节点返回到基于软件的处理器时需要发生的情况。
[0226]
在一个示例实现中,“userformat”为0可以指示实例节点格式大于某大小(例如64b),并且在其他64b块中具有附加报头信息。设置为1可指示单个(例如64b)节点,该节点具有存储在其他位置的附加信息,该其他位置需要基于实例索引进行查找。设置为2可指示该变换需要扩展的可见性检查。同样,这些是示例用法;该软件可以不用设置并且以无论何种它所需要的方式使用这些特定位。
[0227]
实例节点
[0228]
图19a

19e示出了可以使用的示例实例节点布局。在一个示例实现中,图19a的静态实例节点可以是硬件编码的,并且可以以无论何种需要的方式自由地定义第一部分之外的任何东西。这些仅作为可以完成的非详尽示例提供。
[0229]
一个示例实施方式以提供与静态实例节点相同的信息和处理(参见图19a)但具有指定存在什么扩展名的附加扩展位(参见图19b的顶行“ext”字段)的方式构造运动实例节点下的规范。因此,可以使用最高(静态)位来处理硬件内部的变换,因此,实现无需进行数学运算即可将光线从世界空间变换到对象空间,但需要执行指向底层的加速数据结构中的新的根complet的机制,然后在硬件中遍历。在一些实施例中,硬件有可能使用“强制返回到sm”机制将“执行此实例节点”的请求交还给基于软件的协作处理器,以便处理器(sm)可以在实例节点上执行变换并将结果交还给硬件,以允许硬件继续运行,就好像实例节点已在硬件上变换一样。备选地,示例非限制性实施方式可以执行组合的静态和基于运动的变换以混合和匹配基于运动的和静态的场景。因此,扩展名允许软件指定实例完成的操作以及数据的含义。硬件具有灵活性,以灵活地指定实例节点表示的长度,因此图19b

19e实例节点格式可以根据需要具有不同的长度。硬件可能会像表示的底部部分不存在一样进行处理,且只对顶部的数据进行操作;或者它可以像仅存在除顶行以外的所有内容一样进行处理;或者它可以处理顶部和扩展部分两者。因此,在示例非限制性实现中可以构造数据以适应多种用途和硬件视图或窗口。此外,相同的数据因此对于不同的实体(例如,基于硬件的处理器和基于软件的处理器)可能意味着不同的事物。
[0230]
图19b的实例节点格式1028的顶行因此示出了在一个示例非限制性实施例中使用的扩展的“ext”报头。在硬件加速的线性运动变换的情况下,实例节点块在运动范围的任一端都包含该变换。对于图19b中所示的运动实例节点,使用了两种变换

一种用于时间间隔的开始(“begin.inv

:”),一种用于时间间隔的结束(“end.inv
…”
)。在所示的示例中,将变换指定为逆变换,将其反转(invert)以执行所需的变换。如果硬件正在执行运动变换,则可以使用这样的实现。硬件将在变换之间进行线性插值,即在时间戳处矩阵的各组分之间进行线性插值,将线性插值的矩阵反转,然后将反转后的插值的矩阵应用于光线。在一些硬件实施例中,可以将这样的插值任务返回给sm以进行处理,以便节省硬件面积/复杂性。在其他示例硬件设计中,矩阵之间的插值可以由基于硬件的计算器支持。
[0231]
图19c所示的示例格式包括静态实例节点规范和运动实例节点规范的组合。此“64b静态实例节点 128b运动扩展”示例可用于促进所有几何体/光线的运动开/关之间的切换。通过这种布局,可以内联(inline)静态变换,因此清除tlas中所有实例节点叶complet中的强制返回到sm位允许ttu将实例节点作为静态变换处理,而不是返回到sm用于实例运动变换。如果只有>64b的实例节点需要强制返回到sm,则恢复该更改只是tlas叶complet的另一步,针对大小大于1的所有实例节点将强制返回到sm位翻转为1。这样可以避免对带有静态变换的单独bvh的需求,也无需使用单独的构建来创建它们。但是,代价是在常规运动变换查询期间使用了额外的空间。
[0232]
在所示的图19d、图19e的示例中,可以在实例节点中对时间开始值和时间结束值进行编码,并用于在顶层应用数据结构(tlas)和底层应用数据结构(blas)的不同时间间隔之间进行平移。这为实例节点子树之间的不同运动时间间隔提供了灵活性。例如,出于光线

包围体相交测试的目的,tlas子树可以为其所有子树提供总体时间间隔,而可以为不同的各个子间隔时间范围定义不同的blas运动子树。
[0233]
在上述示例中,complet和三角形块表示在时间0和时间1处的三角形的位置,以表示在帧时间间隔的开始和结束时三角形的位置。对于下一帧,由于三角形继续运动,因此需要更新加速数据结构。换句话说,更新的bvh现在将指定对应于下一个连续帧时间间隔的两个新时间段0和1。但是,将注意到当前时间帧的结束(时间1)是下一个连续帧时间间隔(时间0)的开始。为了提高效率,一个示例非限制性实现包括每三角形和/或complet的附加位,该附加位允许数据表示交换两个时间间隔规范的含义,以分别表示时间间隔的开始和结束或时间间隔的结束和开始。通过简单地指定交换,从而使前一帧的结束几何位置信息现在成为下一帧的几何位置的开始,从而提高了更新加速数据结构的效率,这意味着数据结构更新仅需要写入新信息并重复使用以前的信息。这允许bvh更新结构在某些实现中仅更新指定运动几何体的开始和结束位置的两组顶点之一。因此,这种硬件特征将允许硬件以从一帧到下一帧交替的方式解释加速数据结构complet和三角形格式的两个端点,从而避免了为每一帧重写整个complet和三角形块的需要。
[0234]
示例非限制性查询设置:
[0235]
在非限制性实施例中,光线标志被扩展为包括时间戳。参见图20,其示出了在一个示例非限制性实施例中如何将用于运动模糊的时间戳与光线指令1042一起传递给硬件。由于针对加速数据结构的顶层tlas和底层blas可以传递不同的时间戳,因此与光线关联的时间戳值与加速数据结构中的对象表示有关。(见图21)
[0236]
在一个实施例中,光线标志2(rayflag2)也被扩展为包括时间戳。光线原点2(rayorigin2)和光线方向2(raydirection2)现在也可以由ttu st设置以用于实例化的光线遍历(光线类型7)。以前,这些都是通过rtt中执行的变换的输出间接设置的。在一个实施例中,它们将仍然由rtt中执行的静态变换来设置,除非该变换另有指示。
[0237]
示例非限制性实例节点堆栈条目:
[0238]
图22示出了短堆栈的示例实现,以定义接下来要执行的操作。在所示示例中,实例节点值已被修改以指定是否已对底部光线进行了变换,并且变换不应更新底部光线的原点和方向。此添加用于适应在基于软件的协作处理器上执行变换本身的情况,而管理整个操作以确定相交的机制仍由硬件加速。因此,一旦执行相交操作而不会打扰协作处理器,这些值将允许从硬件内部的加速数据结构的底层(blas)迁移到顶层(tlas)。这将往返于协作处理器的往返次数减少了一次,从而提高了效率。因此,在示例实现中,自顶至底的操作可以要求来自协作处理器的干预以执行变换,而自底至顶的返回(其不需要变换)可以完全由硬件来执行。
[0239]
在一个实施例中,当底部光线由基于软件的处理器直接初始化时,实例节点堆栈条目应设置“b=bottom

ray transformed”位。在将堆栈还原(stack restore)传递到硬件之前,由基于软件的处理器来设置此位。即,在一个示例实施例中,硬件仅读取该位而不设置它。该位指示底部光线的原点、方向和时间戳已经初始化,并且变换不应覆盖这些字段。
[0240]
在一个实施例中,当实例节点被返回到基于软件的处理器并且该节点用于进行底部光线初始化时,在一些示例非限制性实施例中,在还原到硬件过程之前,基于软件的处理器负责修改实例节点堆栈条目。返回时,将设置“s=return to processor”位,并清除“b=bottom

ray transformed”位。还原时,反之亦然,清除's'并且设置'b'。然后,将在硬件中处理该变换,但底部光线的原点、方向和时间戳不会被覆盖。
[0241]
硬件加速添加
[0242]
简要地,在一些实施例中,运动模糊使用每光线时间戳来定位该特定光线的时间间隔内的几何形状。在一些实施例中,时间戳是全精度(例如32位浮点)值。在一些实施例中,时间戳是经由光线标志指定的,并存储在光线管理单元(rmu)730中。当正在使用那些数据路径时,该时间戳与遗留光线数据一起传递给光线三角测试单元(rtt)720或光线complet测试单元(rct)710。关于增加了对实时运动模糊的硬件支持的ttu 138的子单元布局,请参见图11。每个添加项将在下面更详细地描述。
[0243]
示例非限制性光线管理单元(rmu)730功能贡献:
[0244]
图11示出了在一个示例非限制性实施例中,光线管理单元(rmu)730存储新的光线时间戳。它针对所有操作将此时间戳提供给rct 710和rtt720。为了简化在rct 710和rtt 720中的检查,在一个实施例中,rmu 730将在初始光线标志写入时检测超出范围的时间戳,取而代之的是针对在范围之外的那些时间戳存储负0.0。所有后续检查仅需检查时间戳的符号位,即可确定是否存在相交前强制错过。rmu 730明确支持写入底部光线字段(见上文)。在采用初始化的底部光线的变换更新中,rmu 730不会写入底部光线的原点、光线方向和时间戳,但仍会照常写入所有其他字段。
[0245]
示例非限制性光线complet测试(rct)710功能贡献:
[0246]
如上所述,complet格式将指定是否启用运动模糊。运动模糊可以与多包围盒结合
使用。在一个实施例中,运动complet总是将相邻的子项配对(即,0/1、2/3、4/5、6/7、8/9,a/b)。此后,多包围盒将应用于原始通道,使得例如,运动模糊 4盒的多包围盒具有0/1和2/3作为运动模糊的多包围盒对。由于运动complet已经配对,因此对于多包围盒/子项,只有大于2的2的倍数才有意义。因此,将多包围盒计数(multiboxcount)为0或1(即2或3个包围盒/子项)的运动模糊 多包围盒的complet视为complet格式错误。
[0247]
在一个实施例中,在任何原始测试之前,在rct 710管线的顶部,在两个包围盒之间进行线性插值。以这种方式,rct 710的其余部分保持不变并被使用,就好像最初只填充了偶数子项一样。例如,上面的child0和child1创建了线性插值的子项,对于其余的rct 710,该子项被视为child0,而child1变为无效(即zlo=0xff,zhi=0x00,ylo=yhi=xlo=xhi=0x00)。参见图4、图4a。仅由于压缩存储,此数学运算的精度低于fp32精度。可以使用全精度。有关伪代码中的实际数学运算,请参见图24,用于在硬件中执行插值的伪代码示例。在一个示例实施例中,这种伪代码由适当的逻辑和计算电路(例如乘法器、加法器等)来实现。如上所述,可以利用硬件的相应复杂性来适应不同种类的插值。
[0248]
在一个实施例中,在插值之前不检查反转的包围盒。如果两个子项都被反转,则生成的插值包围盒仍将是反转的。如果只有一个子项被反转,则所得的插值包围盒可能是也可能不是反转的。反转的包围盒不能被击中。但是子项的实际有效性仅基于偶数子项。
[0249]
如果时间戳为负数(即,超出rmu强制的0.0到1.0运动范围),则跳过插值,并且不会击中complet中的任何包围盒。
[0250]
在如上所讨论的一个实施例中,ttu不加速运动变换。如果在rct 710中插入了运动变换,则选项为:(1)返回到sm,(2)剔除,或(3)作为节点参考(node ref)返回。在一个实施例中,为此没有引入单独的每光线模式位。相反,光线依赖于现有的实例节点模式位(in_f和in_p)。但是,为complet中的每个实例节点添加了新的“force

return

to

sm”位。为该子项设置时,“ttu中的进程”的in_f或in_p设置将被解释为“返回到sm”。该机制不仅限于运动complet,也可以与传统的静态complet一起使用。
[0251]
force

return

to

sm位的一些附加点:
[0252]

ray ops仍然可以用于剔除,作为节点参考返回,甚至返回至sm。只是ttu中的进程(process

in

ttu)被迫返回到sm。
[0253]

在一个实施例中,没有可编程的覆盖。如果将变换标记为返回至sm,则任何光线都不会在ttu中对其进行处理。
[0254]

我们在已经使用但实际上未使用的字段中再利用位。即,这已经向下发送到rct/tl,因此不增加管线开销。
[0255]

运动变换比静态变换需要更多的信息。它们不能使用指定的相同实例节点格式。但是,当将静态变换和运动变换混合在同一个complet中时,该运动变换应具有交错的实例节点,该实例节点适合其他静态变换实例节点,以便可以根据complet叶指针的机制来返回它。大小字段确实支持多尺寸实例节点,因此运动实例节点也可以与静态实例节点交错。
[0256]
作为编程说明,在所有情况下,都可以调整时间间隔任一端的包围盒的大小,以确保插值的aabb将保守地在该间隔的所有点处包围运动几何形状。当存在如图23所示的非线性运动时,这特别有用,该运动示出了从时间间隔的开始到结束沿弯曲路径的包围体。
[0257]
示例非限制性光线三角测试(rtt)720的功能贡献:
[0258]
在一个实施例中,当将三角形块指定为运动模糊时,对指定图元的顶点进行线性插值。与rct 710不同,rtt 720插值使用全精度(例如,fp32)来对顶点插值,因为在一个实施例中,光线

几何形状相交测试是精确的。线性插值如以上结合图5和图5a所述。该图中的v[0,1,2].0和v[0,1,2].1分别是运动模糊三角形块中的v[0,1,2].start和v[0,1,2].end。
[0259]
如果时间戳为负数(即,在rmu 730强制执行的0.0到1.0运动范围之外),则跳过插值,并且三角形不相交。
[0260]
在一个实施例中,不对顶点的配对进行检查或预处理。图5、图5a的示例图示出了正好线性的运动,但是由于顶点是独立插值的,因此插值的三角形有可能旋转,变为零面积或翻转方向。
[0261]
在一个实施例中,rtt 720实现使用两个传递(two

pass)方法,其中第一传递在顶点或中心/半径之间线性插值,然后第二传递针对经插值的图元执行典型的相交测试。也可以采用更多的数学单元完成单个传递,但是面积成本更高。
[0262]
在一个实施例中,rtt 720并行处理顶点。出于“水密性”的原因,所有顶点均以相同的方式进行插值,而与所使用的通道无关。如果不是,则使用相同顶点但使这些顶点沿着不同顶点处理通道的相邻三角形可能会在不同插值点处因为相同的时间戳而看到这些顶点,从而在网格中引入孔并创建关联的伪像。
[0263]
在一个实施例中,rtt 720单元还负责处理实例变换。当使用在sm 132上插值的运动变换时,底部光线初始化的位用于防止ttu 138覆盖已经完成的变换。在一个实施例中,当用底部光线初始化的位设置处理实例变换时,不使用该变换的数学输出,而是将其设置为0。无论是否设置,底部光线初始化的位都与变换后的光线一起发送,使其最终进入rmu 730,以便rmu可以如上所述进行操作。
[0264]
在架构的一个示例非限制性版本中,没有直接在硬件中处理运动的实例变换。然而,其他实施方式可以直接加速运动变换。线性运动实例变换包括在关键点对变换矩阵的组成部分进行线性插值,对经插值的矩阵进行求逆,然后将该变换矩阵应用于光线的原点和方向。
[0265]
当需要将运动变换返回给基于软件的协作处理器时,示例非限制性实施例添加支持措施以使该性能更高。例如,这样的支持措施可以包括每个实例节点子项强制返回处理器位,以及将已经变换的底部光线写入硬件的能力。
[0266]
当处理格式为1的实例节点时,根complet指针(rootcompletptr)的较低位仍可以像以前一样被视为0。
[0267]
在一个实施例中,对运动三角形支持三角形获取。如果存在,将使用通过rayflags写入指定的时间戳。在一个实施例中,以下行为成立:
[0268]

如果时间戳==0.0f或如果未指定时间戳,则将起始三角形的顶点返回而无需插值。
[0269]

如果时间戳==1.0f,则将结束三角形的顶点返回而无需插值。
[0270]

如果时间戳>0.0f且<1.0f,则将插值的顶点返回。
[0271]

如果索引是>num个运动三角形或时间戳是<0.0f,>1.0f或

0.0f,那么对于顶点、id和alpha,返回将全为零,就像针对非运动/静态三角形的无效索引。在这种情况下,没有错误报告。
[0272]
如果获取将静态三角形块作为目标,则时间戳将被完全忽略,并且获取将被视为正常静态三角形获取。因此,三角形获取允许将三角形从由硬件使用来用于遍历的压缩三角形块中拉出。通过提供时间戳以及允许插值或键选择的获取查询,可以支持运动三角形。不需要时间戳,如果没有时间戳,则将返回范围开头的三角形的顶点。
[0273]
相交管理单元(imu)722的功能贡献:
[0274]
在一个实施例中,imu 722沿着底部

光线初始化的位传递到rmu 730,使得rmu可以写入正确的字段。
[0275]
堆栈管理单元(smu)740的功能贡献:
[0276]
在一个实施例中,当由sm 132直接初始化底部光线时,实例节点堆栈条目应具有“b=底部光线初始化(bottom

ray initialized)”位设置。如所描述的,在一个实施例中,在将堆栈还原传递到ttu 138中之前由sm 132设置该位。smu740仅读取该位而不设置它。在一个实施例中,通过trisched和l0tc在用于变换请求的元数据中一起发送该位,其中如上所述,该位将最终由rtt 720、imu 722和rmu 730使用。
[0277]
示例显式运动范围:
[0278]
在一个实施例中,隐式包含范围[0.0,1.0]是实现的简化。每complet运动范围也是可以通过将开始和结束时间戳存储在complet和三角形块中来实现的选项。然后,这些操作会将给定的时间戳转化为该任意运动范围,而不是[0.0,1.0]。这只需要一点数学,以及相关的硬件复杂性和空间。
[0279]
由ttu 138和sm 132实例化管线实现的示例
[0280]
下面描述示例实施例中的ttu 138如何执行实例化和相关联的变换。
[0281]
图25a的光线追踪管线流程图的更详细的图示出了代表性用例的组件之间的数据流和交互:针对包含几何图元的场景追踪光线,并在硬件中处理实例变换。在一个示例非限制性实施例中,图25a的光线追踪管线本质上是软件定义的(在示例实施例中,这意味着其由sm 132确定),但是广泛使用了由ttu 138的硬件加速。关键组件包括sm 132(以及其余的计算管线)、ttu 138(其充当sm的协处理器)以及l1高速缓存和下游存储器系统,ttu从这些组件中获取bvh和三角形数据。
[0282]
图25a中所示的管线示出了可以由开发系统提前执行包围体层次结构创建1002。还示出了在示例实施例中,作为着色(可以包括照明和纹理),由sm 132或其他软件执行或控制的光线创建和分布1004。示例管线包括分别由ttu 138执行的“顶层”bvh树遍历1006、光线变换1014、“底层”bvh树遍历1018和光线/三角形(或其他图元)相交1026。不必按所示顺序执行这些操作,如ttu 138和sm 132之间的握手确定了ttu 138的工作方式和顺序。
[0283]
sm 132一次向ttu 138呈现一条或更多条光线。sm 132呈现给ttu 138用于遍历的每条光线都可以包括光线的几何参数、遍历状态以及光线的光线标志、模式标志和光线操作信息。在示例实施例中,光线操作(rayop)提供或包括辅助算术和/或逻辑测试,以抑制、覆盖和/或允许相交的存储。遍历堆栈也可以由sm 132使用,以将某些状态信息传送给ttu 138,以便在遍历中使用。新的光线查询可以从显式遍历堆栈开始。但是,对于某些查询,可以提供少量的堆栈初始化器以开始给定类型的新查询,例如:从complet开始的遍历;光线与一定范围的三角形的相交;光线与一定范围的三角形的相交,然后从complet开始进行遍历;针对给定三角形从三角形缓冲区获取的顶点,等等。在一些实施例中,使用堆栈初始化
器代替显式堆栈初始化可提高性能,因为堆栈初始化器需要较少的流处理器寄存器并减少了需要从流处理器传输到ttu的参数数量。
[0284]
在示例实施例中,当查询与特定类型的包围体相交时或与特定图元类型的图元相交时,sm 132随每个查询(例如,光线)呈现的一组模式标志可以至少部分地控制ttu 138将如何处理查询。sm 132提供给ttu 138的模式标志使sm和/或应用程序具有例如通过rayop指定辅助算术或逻辑测试以抑制、覆盖或允许存储相交的能力。模式标志可以例如使得能够根据诸如与每个包围体和/或图元相关联的深度(或距离),与距离原点或光线的距离等(尤其是对象的距离)有关的包围体或图元的大小等方面来改变遍历行为。应用程序可以使用此能力来针对相交测试与特定的查询集或查询组动态地和/或选择性地启用/禁用对象集,例如,以允许在应用程序状态发生变化时(例如,在门打开或关闭时)使用不同版本的模型,或提供根据光线长度选择的不同版本的模型,以实现某种形式的几何细节水平,或允许某些类别的光线中的特定对象集使某些层在特定视图中可见或不可见。
[0285]
除了可以分别为光线

complet相交和光线

图元相交指定的模式标志集之外,光线数据结构还可以指定其他与光线操作(rayop)测试相关的参数,例如光线标志、光线参数和rayop测试。光线标志可以由ttu 138使用,以控制遍历行为、背面剔除和处理各种子节点类型的各个方面,取决于可选的rayop测试的通过/失败状态。rayop测试以增加一些复杂性为代价,为ttu 138的能力增加了灵活性。ttu 138为其正在处理的每个活动光线保留“光线槽”,并且可以在遍历期间将光线标志、模式标志和/或rayop信息存储在ttu内的相应光线槽缓冲器中。
[0286]
在图25a所示的示例中,ttu 138执行顶层树遍历1006和底层树遍历1018。在示例实施例中,bvh的两层遍历使能对动态场景变化进行快速光线追踪响应。
[0287]
光线变换1014通过将可以在第一坐标空间(例如,世界空间)中的顶层遍历中使用的光线变换到底层遍历的bvh的不同坐标空间(例如,对象空间),提供从顶层树遍历1006到底层树遍历1018的适当迁移。在先前的文献中描述了使用两层遍历的示例bvh遍历技术,例如,参见woop,“用于动态场景的光线追踪硬件架构(a ray tracing hardware architecture for dynamic scenes)”,萨尔兰德大学,2004,但是实施例不限于此。
[0288]
示例顶层树遍历
[0289]
ttu 138进行的顶层树遍历1006从l1高速缓存1012接收complet,并向光线变换1014提供实例以进行变换,或向sm 132提供未命中(miss)/结束输出1013以用于由sm进行最接近击中着色器1015处理(此块还可以基于非叶节点/未击中条件来递归地操作)。在顶层树遍历1006中,下一个complet取回步骤1008从存储器和/或高速缓存层次结构中获取针对步骤1010中的光线相交要测试的下一个complet,并且在所获取的complet中的包围体上进行光线

包围体相交测试。
[0290]
如上所述,实例节点将一个bvh连接到处于不同坐标系中的另一个bvh。当相交的包围体的子项是实例节点时,光线变换1014能够从l1高速缓存1016中检索适当的变换矩阵。ttu 138使用适当的变换矩阵将光线变换到子bvh的坐标系。已经通过引用并入的申请号为14/697,480的美国专利申请描述了将树中的第一组节点连接到第二组节点的变换节点,其中第一组节点和第二组节点位于不同的坐标系中。示例实施例中的实例节点可以类似于美国申请号为14/697,480中的变换节点。替代地,在图25b中所示的ttu 138的非实例
化模式中,ttu不执行“底”层树遍历1018,并且非实例化的树bvh遍历由框1008、1010例如仅使用一个堆栈来执行。ttu 138可以基于它从bvh和/或查询类型中读取的内容在图25a的实例化操作和图25b的非实例化操作之间切换。例如,特定的查询类型可能会限制ttu仅使用非实例化操作。在这种查询中,任何相交的实例节点都将返回给sm。
[0291]
在一些非限制性实施例中,在获取下一个complet之前,对所获取的complet中的每个包围体执行步骤1010中的光线

包围体相交测试。其他实施例可以使用其他技术,例如以深度优先的方式遍历顶层遍历bvh。已经通过引用并入的专利号为9,582,607的美国专利描述了可以在示例实施例中使用的一个或更多个complet的结构和内容。专利号为9,582,607的美国专利也描述了complet的示例遍历。
[0292]
当确定包围体与光线相交时,针对随后的与光线的相交测试和遍历,对相交的包围体的子包围体(或对其的引用)进行追踪。在示例实施例中,一个或更多个堆栈数据结构用于追踪随后要测试与光线的相交的子包围体。在一些示例实施例中,可以使用小尺寸的遍历堆栈来追踪要通过顶层树遍历1006的操作遍历的complet,和要针对相交进行测试的图元,并且可以使用较大的局部栈数据结构来追踪底层树遍历1018中的遍历状态。
[0293]
示例底层树遍历
[0294]
在底层树遍历1018中,下一个complet获取步骤1022在步骤1024中从内存和/或高速缓存层次结构1020中获取要针对光线相交进行测试的下一个complet,并在获取的complet中的包围体上进行光线

包围体相交测试。如上所述,底层树遍历可以包括具有与在较上层树遍历中遍历的包围体处于不同的坐标系中的包围体的complet。底层树遍历还从l1高速缓存中接收complet,并且可以基于非叶/无击中条件在自身内部递归地或迭代地进行操作,并且还伴随基于未命中/结束检测的顶层树遍历1006。随着将光线变换到检索到的较低层complet的坐标系中,可以确定光线与较低层bvh中的包围体的相交。然后将在较低层的树遍历中找到的与光线相交的叶包围体提供给光线/三角形相交1026。
[0295]
底层树遍历1018的叶输出被提供给光线/三角形相交1026(其具有l0高速缓存访问以及通过l1高速缓存1028检索三角形的能力)。l0 complet和三角形高速缓存可以是ttu 138内部的小型只读高速缓存。当到达某些叶节点而没有遍历实例化的bvh时,光线/三角形相交1026也可以从顶层树遍历1006接收叶输出。
[0296]
在已经处理完图元范围内的所有图元之后,相交管理单元检查结果队列的状态,并制作数据包以发送到堆栈管理单元和/或光线管理单元,用于更新光线的属性和遍历状态,设置光线的下一个遍历步骤和/或将光线返回到sm132(如有必要的话)。如果结果队列包含在处理图元范围期间找到的不透明或阿尔法(alpha)相交,则相交管理单元将结果队列中最近的不透明相交的参数长度(t)发信号给光线管理单元,以记录为光线tmax从而缩短光线。为了更新遍历状态以设置光线的下一个遍历步骤,相交管理单元会向堆栈管理单元发送信号,告知结果队列中是否存在来自图元范围的不透明相交,结果队列中是否存在一个或多个alpha相交,结果队列是否已满,是否在图元范围中找到了尚未返回到sm并且不存在于结果队列中的其他alpha相交,以及在sm消耗结果队列的内容之后要针对光线进行测试的图元范围中的下一个alpha图元的索引(根据结果队列中当前图元范围,具有最高存储器顺序的alpha图元之后的范围中的下一个图元的索引)。
[0297]
当堆栈管理单元740从相交管理单元722接收到分组时,堆栈管理单元740检查该
分组以确定完成遍历步骤并开始下一个所需的下一动作。如果来自相交管理单元722的分组指示在图元范围内发现了不透明的相交,并且光线模式位指示一旦找到了任何相交,光线将完成一次遍历,则堆栈管理单元740将光线及其结果队列返回到sm,其中遍历状态指示遍历已完成(完成标志设置和/或空的顶层和底层堆栈)。如果来自相交管理单元722的分组(packet)指示结果队列中存在不透明或alpha相交,以及在还没有返回到sm的图元范围的处理期间结果队列中不存在光线遇到的图元范围中的剩余的alpha相交,则堆栈管理单元740将光线和结果队列返回到sm,其中遍历状态被修改为设置剔除不透明位,以防止在来自图元范围的最高alpha图元相交在光线的结果队列中返回到sm之后进一步处理图元范围中的不透明图元和前进到第一alpha图元的图元范围起始索引。如果来自相交管理单元722的分组指示当光线处理图元范围时未发现不透明或alpha相交,则堆栈管理单元740从活动遍历堆栈中弹出顶部堆栈条目(对应于完成的图元范围)。如果来自堆栈管理单元740的分组指示结果队列中存在不透明的相交和光线模式位不指示一旦已经找到任何相交和/或结果队列中存在alpha相交则光线将完成遍历中的任一个,但是在尚未返回给sm的结果队列中不存在的图元范围中未找到剩余alpha相交,则堆栈管理单元740将顶部的堆栈条目(对应于完成的图元范围)弹出活动遍历堆栈并修改结果队列的内容,以指示结果队列中存在的所有相交都来自完成处理的图元范围。
[0298]
如果活动堆栈是底部堆栈,而底部堆栈为空,则堆栈管理单元740将活动堆栈设置为顶部堆栈。如果顶部堆栈是活动堆栈,并且活动堆栈为空,则堆栈管理单元740将光线及其结果队列返回到sm,其中遍历状态指示遍历已完成(完成标志设置和/或空的顶层和底层堆栈)。如果活动堆栈包含一个或更多个堆栈条目,则堆栈管理单元740检查顶部堆栈条目并开始下一遍历步骤。在共同待决的申请号为16/101,148的美国专利申请“保守水密光线三角形相交(conservative watertight ray triangle intersection)”和申请号为16/101,196的美国专利申请“处理乱序的不透明和alpha光线/图元相交的方法(method for handling out

of

order opaque and alpha ray/primitive intersections)”中描述了与光线相交的图元和/或图元范围的测试以及将结果返回到sm 132,在本文中通过引用方式将以上两者并入本文。
[0299]
包括光线追踪的示例图像生成管线
[0300]
尽管以上公开内容是在计算机图形和可视化的特定上下文中进行构架的,但是光线追踪和所公开的ttu可以用于图形和可视化之外的多种应用程序。非限制性示例包括用于逼真的声音合成的声传播、声呐系统的模拟、光学元件和系统的设计、粒子传输模拟(例如,用于医学物理学或实验性高能物理)、一般的波传播模拟、与lidar数据的比较,用于例如机器人或车辆定位等目的。过去,optix
tm
已用于其中一些应用领域。
[0301]
例如,可以以多种方式使用上述的光线追踪和其他功能。例如,除了用于使用光线追踪来渲染场景外,它们还可以与扫描变换技术结合使用,例如在对3d模型的几何构建块(即多边形图元,例如三角形)进行扫描转化的情况下,用于生成用于(例如,在图6所示的显示器150上)显示的图像。
[0302]
然而,同时,当用于产生用于虚拟现实、增强现实、混合现实、视频游戏、运动和静止图片生成以及其他可视化应用程序的图像时,本文的技术提供了优点。图26示出了根据实施例的用于处理图元以提供图像的图像像素值的示例流程图。如图26所示,可以响应于
接收到用户输入而生成3d模型的图像(步骤1652)。用户输入可以是显示图像或图像序列的请求,例如在与应用程序(例如,游戏应用程序)交互期间执行的输入操作。响应于用户输入,系统使用常规的gpu 3d图形管线对场景的3d模型几何图元执行扫描转化和光栅化(步骤1654)。几何图元的扫描转化和光栅化可包括例如使用本领域技术人员众所周知的常规技术(例如照明、变换、纹理映射、光栅化等)来处理3d模型的图元以确定图像像素值。所生成的像素数据可以被写入帧缓冲区。
[0303]
在步骤1656中,可以使用ttu硬件加速从光栅化图元上的一个或更多个点开始追踪一条或更多条光线。可以根据本技术中公开的一种或更多种光线追踪功能来追踪光线,例如,通过使用ttu硬件加速基于时间信息对运动中的对象的空间信息进行插值,从而在整个帧时间上随机分布光线并追踪来自光栅化图元上的点的光线以实现运动模糊(框1656)。这种光线追踪可以与其他光线追踪效果(例如阴影、反射等)进行组合。基于光线追踪的结果,可以修改存储在缓冲区中的像素值(步骤1658)。在一些应用程序中,修改像素值可以例如通过例如施加更多逼真的反射和/或阴影来改善图像质量。使用存储在缓冲区中的经修改的像素值来显示图像(步骤1660)。
[0304]
在一个示例中,可以使用上述处理系统来实现几何图元的扫描转化和光栅化,并且可以由sm 132使用关于图9描述的ttu架构来实现光线追踪,以添加更多的可视化特征(例如,镜面反射,阴影等)。图26仅是非限制性示例

sm 132本身可以采用描述的ttu,而无需纹理处理或其他常规3d图形处理来产生图像,或者sm可以采用纹理处理和其他常规3d图形处理而无需所描述的ttu来产生图像。sm还可根据应用程序在软件中实现任何所需的图像生成或其他功能,以提供任何所需的可编程功能,这些功能不受纹理映射硬件、树遍历硬件或其他图形管线硬件提供的硬件加速功能的约束。
[0305]
在一些实施例中,ttu 138是无状态的,意味着在查询之间的ttu中没有维护架构状态。同时,对于在sm1840上运行的软件来说,请求继续上一查询通常很有用,这意味着相关状态应由ttu 138写入寄存器,然后传递回寄存器中的ttu(通常是原位)以继续。该状态可以采用遍历堆栈的形式,该遍历堆栈追踪bvh遍历的进度。
[0306]
还可以提供少量的堆栈初始化器以开始给定类型的新查询,例如:
[0307]

从complet开始遍历
[0308]

光线与一系列三角形相交
[0309]

光线与一系列三角形相交,然后从complet开始遍历
[0310]

从给定三角形的三角形缓冲区中获取顶点
[0311]

在“从complet开始的遍历”和“光线与一系列三角形相交”前面进行实例变换的可选支持。
[0312]
顶点获取是一种简单的查询,其可以用包含堆栈初始化器和其他内容的请求数据来指定。其他查询类型可能要求光线或光束的说明,以及堆栈或堆栈初始化器和描述查询详细信息的各种光线标志。光线由其三坐标原点、三坐标方向以及沿光线的t参数的最小值和最大值给出。光束还由第二原点和方向给出。
[0313]
各种光线标记可用于控制遍历行为、背面剔除和各种子节点类型的处理的各个方面,其取决于可选rayop测试的通过/失败状态。rayops为ttu的功能增加了相当大的灵活性。在一些示例实施例中,rayops部分引入了两个光线标志版本,其可以基于对与光线一起
传输的数据和存储在complet中的数据的指定操作来动态地选择两个光线标志版本。要探索此类标志,了解bvh中允许使用的不同子节点类型以及ttu 138可以返回给sm的各种击中类型,这首先有帮助。示例节点类型为:
[0314]

子complet(即内部节点)
[0315]
默认情况下,ttu 138通过下降到子complet来继续遍历。
[0316]

三角形范围,对应于三角形缓冲区中的一组连续三角形
[0317]
(1)默认情况下,光线所遇到的三角形范围由ttu 138本地处理,方法是测试三角形的相交并相应地缩短光线。如果遍历完成并且击中了三角形,则默认行为是将三角形id连同相交的t值和重心坐标返回给sm1840。这是“三角形”击中类型。
[0318]
(2)默认情况下,即使遍历尚未完成,设置了alpha位的相交的三角形也会返回到sm 1840。如果软件确定三角形实际上是透明的,则返回的遍历堆栈包含继续遍历所需的状态。
[0319]
(3)在某些实施例中,光束不支持三角形相交,因此默认情况下将遇到的三角形范围作为“trirange”击中类型返回到sm 1840,其包括指向与该范围重叠的第一个三角形块的指针,这些参数指定了该范围,以及与叶包围盒的相交的t值。
[0320]

项范围,其由索引(从用户提供的存储在complet中的“项范围库”中得出)和项计数组成。
[0321]
默认情况下,项范围作为“itemrange”击中类型返回到sm 1840,其由例如索引、计数和与叶包围盒的相交的t值组成。
[0322]

实例节点。
[0323]
在一些实施例中,ttu 138可以通过将光线变换到实例bvh的坐标系来本地处理一个级别的实例化。可以在软件中处理其他级别的实例化(或其他每个级别的实例化,具体取决于策略)(或在其他实施例中,ttu 138硬件可以处理两个、三个或更多级别的实例化)。为此提供了“instancenode”击中类型,其由指向实例节点的指针和与叶包围盒的相交的t值组成。在其他实施方式中,硬件可以处理两个、三个或更多级别的实例化。
[0324]
除了特定于节点的击中类型之外,还提供了通用的“noderef”击中类型,其由指向父complet本身的指针以及指示与哪个子项相交的id和与那个子项的包围盒相交的t值组成。
[0325]
对于查询或bvh格式不正确地形成或遍历过程中遍历遇到问题的情况,可以提供“error(错误)”击中类型。
[0326]
对于光线或光束未命中(miss)场景中所有几何形状的情况,可以提供“none(无)”击中类型。
[0327]
ttu如何处理四种可能的节点类型中的每一个由一组特定于节点的模式标志确定,该模式标志被设置为针对给定光线的查询的一部分。上面提到的“默认”行为对应于将模式标志设置为全零的情况。
[0328]
标志的替代值允许剔除给定类型的所有节点,将给定类型的节点作为noderef击中类型返回给sm,或者使用其对应的击中类型将三角形范围或实例节点返回给sm,而不是在ttu 138内本地地处理它们。
[0329]
可以提供附加的模式标志,以控制alpha三角形的处理。
[0330]
尽管以上示例涉及和/或描述了顶点集和/或包围体的位置之间的插值,但是可以采用除插值以外的合适技术来确定几何形状和/或包围盒的开始位置和结束位置之间的中间位置。类似地,尽管示例实施例已经使用诸如图4中的包围体插值技术和诸如图5中的几何体顶点插值技术进行了描述,但是其他实施例可以在不对几何形状顶点进行插值的情况下对包围体位置进行插值,或者在不对包围体进行插值的情况下对几何形状顶点进行插值。作为示例,在一些实施方式中可能期望使用不同的包围体相交测试,例如基于扫描体的那些,并且仅将插值用于图元相交测试。类似地,在一些实施例中,可能希望使用包围体的插值来进行包围体相交测试而不对基础图元进行插值。
[0331]
应用本文公开的一种或更多种技术生成的图像可以显示在监视器或其他显示设备上。在一些实施例中,显示设备可以直接耦合到生成或渲染图像的系统或处理器。在其他实施例中,显示设备可以例如经由网络间接地耦合到系统或处理器。此类网络的示例包括因特网、运动电信网络、wifi网络以及任何其他有线和/或无线联网系统。当显示设备间接耦合时,由系统或处理器生成的图像可以通过网络流传输到显示设备。这种流传输允许例如在服务器上或在数据中心中执行渲染图像的例如视频游戏或其他应用程序,并且渲染的图像可以被传送到与服务器或数据中心物理上分离的一个或更多个用户设备(例如计算机、视频游戏控制台、智能手机、其他移动设备等)上并在其上显示。因此,本文公开的技术可以应用于增强流传输的图像并增强流传输图像的服务,例如nvidia geforce now(gfn)、google stadia等。
[0332]
此外,应用本文公开的一种或更多种技术生成的图像可以用于训练、测试或证明用于识别现实世界中的对象和环境的深度神经网络(dnn)。这样的图像可以包括道路、工厂、建筑物、城市环境、农村环境、人类、动物以及任何其他物理对象或真实世界环境的场景。这样的图像可以用于训练、测试或认证在机器或机器人中使用的dnn,以操纵、处理或修改现实世界中的物理对象。此外,此类图像可用于训练、测试或认证在自主车辆中使用的dnn,以在现实世界中导航和移动车辆。另外,应用本文公开的一种或更多种技术生成的图像可以用于向这些机器、机器人和车辆的用户传达信息。
[0333]
如同明确提出一样,以上引用的所有专利和出版物均以引用方式并入。
[0334]
尽管已经结合当前被认为是最实际和优选的实施例描述了本发明,但是应当理解,本发明不限于所公开的实施例,相反,本发明旨在覆盖包括在所附权利要求书的精神和范围内的各种修改和等同布置。
再多了解一些

本文用于企业家、创业者技术爱好者查询,结果仅供参考。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献