用于光线跟踪系统的分层加速结构的制作方法

文档序号:28207180发布日期:2021-12-28 19:03阅读:90来源:国知局
用于光线跟踪系统的分层加速结构的制作方法

1.本公开涉及用于光线跟踪系统中的分层加速结构。


背景技术:

2.光线跟踪是一种计算渲染技术,其用于通过从渲染场景图像的视点在场景中跟踪光路(“光线”)来渲染场景的图像。光线可以被建模为源自该视点,并通过渲染空间的像素进入场景。源自所述视点的光线被称为“一次光线”。当光线横越场景时,其可能与场景内的一个或多个物体相交。可对光线和其相交的物体之间的相交建模以创建逼真的视觉效果。例如,响应于确定光线与物体相交,可以针对相交执行着色器程序(即,计算机代码的一部分)。程序员可以编写着色器程序以定义系统如何对相交(该相交例如可能导致向场景中发射一个或多个额外光线(称为“二次光线”)作出反应,例如,以表示光线从相交物体的反射或光线通过物体的折射(例如,如果物体是透明或半透明的)。作为另一示例,着色器程序可以使一个或多个光线发射到场景中,以用于确定物体是否处于交点处的阴影中。执行着色器程序(和处理任何相关的二次光线)的结果可以是计算光线穿过的像素的渲染值(例如,颜色值)。以此方式,可以确定表示场景的图像的渲染值。
3.为了减少需要执行的相交测试的次数,光线跟踪系统可以生成加速结构,其中加速结构的每个节点代表场景内的区域。加速结构通常是分层的(例如,具有树结构),使得其包括多个级别的节点,其中靠近加速结构的顶部的节点(即,接近根的节点)代表场景中相对大的区域(例如,根节点可以代表整个场景),靠近加速结构的底部的节点(即,接近叶的节点)代表场景中相对小的区域。分层加速结构可被称为“层次体系”。加速结构的叶节点代表场景中界定一个或多个物体的区域。加速结构在不同示例中可具有不同结构,略举数例,例如栅格结构、八叉树结构、空间分割结构(例如k

d树)或包围体积层次体系。节点可以表示场景中的合适形状或区域(其在本文中可以被称为“盒”)。例如,节点可以表示场景中的轴对齐包围盒(aabb)。
4.可以使用加速结构以递归方式对光线执行相交测试。首先,测试光线是否与加速结构的根节点相交。如果发现光线与父节点(例如,根节点)表示的区域相交,则测试可以进行到该父节点的子节点。相比之下,如果发现光线不与父节点相交,则可以避免对该父节点的子节点的相交测试,从而节省计算工作量。如果发现光线与叶节点相交,那么可针对由叶节点表示的区域内的物体对其进行测试,从而确定光线与哪个(些)物体相交。如果发现光线有超过一个交点,那么可以识别与光线原点最接近的交点(即,光线在场景中遇到的第一次相交),并确定光线在识别的最接近交点处与物体相交。使用加速结构(而非直接利用场景中的所有物体测试光线)减少了需要执行的相交测试的次数,并简化了相交测试。相交测试是更简单的,因为加速结构的节点代表基本形状(例如,轴对齐包围盒或球),与更复杂的物体形状相比,相交测试更简单,例如,按照取向并未预先确定的三角形图元定义基本形状。
5.图1示出了包括光线跟踪单元102和存储器104的光线跟踪系统100。光线跟踪单元
102包括处理模块106、相交测试模块108和处理逻辑110。在操作中,光线跟踪单元102接收定义3d场景内的物体的几何数据。光线跟踪单元102还接收渲染场景图像所来自的视点的指示。处理模块106被配置成基于几何数据生成加速结构,并且将加速结构发送至存储器104以存储于其中。在加速结构已被存储在存储器104中之后,相交测试模块108可以从存储器104检索加速结构的节点以针对所检索的节点执行光线相交测试。相交测试的结果指示光线与场景中的哪一个物体相交,并且结果还可以指示在所述物体上该光线与所述物体相交的位置,并且还可以指示沿着光线发生相交的距离。将相交测试的结果提供到处理逻辑110。处理逻辑110被配置成处理相交测试的结果以确定表示3d场景的图像的渲染值。由处理逻辑110确定的渲染值可以传回到存储器104以存储在其中,以表示3d场景的图像。


技术实现要素:

6.提供本发明内容是为了介绍在以下详细描述中进一步描述的一些概念。本发明内容不旨在标识所要求保护的主题的关键特征或必要特征,也不旨在用于限制所要求保护的主题的范围。
7.提供了一种在用于渲染场景图像的光线跟踪系统中执行相交测试的计算机实施的方法,其中所述光线跟踪系统包括相交测试模块,所述相交测试模块包括被配置成测试光线与场景中的区域的相交的多个测试块,所述方法包括:
8.接收表示分层加速结构的一部分的数据,其中,所述分层加速结构包括节点,每个节点表示场景中的区域,其中,所述节点被链接以形成所述分层加速结构,其中,所述分层加速结构的所述部分表示所述分层加速结构内的子树;
9.接收待测试与由所述子树的特定节点表示的区域的相交的一个或多个光线的指示,其中所述子树包括所述特定节点的后裔;
10.基于所述光线跟踪系统中的条件确定是否要跳过测试所述一个或多个光线与所述子树的特定节点表示的区域的相交;以及
11.根据所述确定,使用所述相交测试模块的所述测试块中的一个或多个,测试所述一个或多个光线的相交,其中,所述测试所述一个或多个光线的相交包括:
12.如果所述确定是要跳过测试所述一个或多个光线与所述子树的特定节点表示的区域的相交,则测试所述一个或多个光线与所述子树中特定层级的所述特定节点的后裔表示的区域的相交,从而跳过测试所述一个或多个光线与所述子树的特定节点表示的区域的相交。
13.接收的数据可以包括定义分层加速结构的所述部分中的节点的区域的数据。
14.所述测试一个或多个光线的相交还可以包括:
15.如果所述确定是不跳过测试所述一个或多个光线与所述子树的特定节点表示的区域的相交,则测试所述一个或多个光线与所述子树的特定节点表示的区域的相交。
16.子树中特定层级的特定节点的后裔可以是子树中特定节点的子代。子树中特定层级的特定节点的后裔可以是子树中特定节点的孙代。
17.由分层加速结构的节点表示的区域可以是场景中的轴对齐包围盒。
18.所述特定节点可以是隐含表示的节点,其中定义由隐含表示的节点表示的区域的数据未被明确地包括为表示所述子树的所述接收数据的一部分,但可以从所述接收的数据
推断。
19.所述方法还可以包括:
20.如果所述确定是不跳过测试一个或多个光线与所述子树的特定节点表示的区域的相交,则从所接收的数据推断定义由特定节点表示的区域的数据。
21.如果所述确定是要跳过测试一个或多个光线与所述子树的特定节点表示的区域的相交,则可以不推断定义由特定节点表示的区域的数据。
22.定义由特定节点表示的区域的数据可以从所述接收的数据中的数据推断,所述数据定义由特定节点的后裔在子树中的特定层级表示的区域。
23.可以通过在场景的每个维度中确定定义由子树中特定层级的特定节点的后裔表示的轴对齐包围盒的分量中的最小和最大分量,来推断定义由该特定节点表示的区域的数据。
24.表示分层加速结构的一部分的所述所接收的数据可以包括指示子树的节点如何链接的数据,并且其中定义由特定节点表示的区域的数据可以使用指示子树的节点如何链接的数据中的至少一些从所述所接收数据推断。
25.所述接收表示分层加速结构的一部分的数据可以包括接收数据块,其中所述数据块可以包括表示分层加速结构内的子树的数据。
26.数据块可以包括:(i)定义由子树中特定层级的特定节点的后裔表示的区域的数据,以及(ii)指示子树的节点如何链接的数据。
27.特定层级可以是子树的最低层级。
28.所述数据块可以包括定义由在分层加速结构中具有共享祖先的节点表示的区域的数据,其中,数据块可以包括表示由共享祖先表示的区域的共同起点区域的指示,并且其中数据块中定义由所述分层加速结构中具有共享祖先的节点表示的区域的数据,对于具有共享祖先的每个节点,可以包括与所述共同起点区域的一个或多个偏移。共享祖先可以是分层加速结构中的共享父节点、共享祖节点或共享曾祖节点。
29.所述分层加速结构可以针对所述场景构建,并且在所述相交测试开始渲染场景图像之前存储在存储器中,其中,所述接收表示所述分层加速结构的一部分的数据可以包括从所述存储器读取表示所述分层加速结构的一部分的所述数据。数据块的大小可以匹配存储器的最小突发串大小。
30.所述确定是否要跳过测试一个或多个光线与所述子树的特定节点表示的区域的相交可以在所述光线跟踪系统中渲染所述场景的图像的相交测试阶段期间动态地执行。
31.所述方法还可以包括:
32.监测所接收的表示所述分层加速结构的部分的数据量;以及
33.监测所述相交测试模块的所述测试块上的处理负载;
34.其中,所述光线跟踪系统中的所述条件包括所监测的数据量和所监测的处理负载。
35.所述确定是否要跳过测试一个或多个光线与所述子树的特定节点表示的区域的相交可以包括:
36.如果测试所述一个或多个光线与由所述子树的所述特定节点表示的区域的相交,则确定所述相交测试模块的所述测试块中有多少将是空闲的指示;以及
37.将所述确定的指示与阈值进行比较。
38.所述光线跟踪系统中的所述条件可以包括以下各项中的一个或多个:
39.待测试与由所述子树的特定节点表示的区域相交的光线的数量;
40.待测试相交的光线的相干水平;
41.相交测试模块的测试块上的处理负载;
42.所述测试块的工作队列中的工作量;
43.所述相交测试模块的测试块数量;以及
44.从读取表示所述分层加速结构的一部分的数据的存储器接收的数据量。
45.所述测试一个或多个光线的相交的结果可以用于确定表示场景的图像的渲染值。
46.所述一个或多个光线可以分组为待测试其与分层加速结构中的在数据块中接收到一个或多个节点表示的一个或多个区域的相交的分组。
47.提供了一种在光线跟踪系统中渲染场景的图像的方法,包括:
48.生成和存储分层加速结构;
49.使用所生成的分层加速结构的部分来执行根据本文所述的任何方法的相交测试;以及
50.执行一个或多个着色器程序以处理所述相交测试的结果以确定表示所述场景的图像的渲染值。
51.提供了一种被配置成在用于渲染场景图像的光线跟踪系统中执行相交测试的相交测试模块,所述相交测试模块包括:
52.接收逻辑,所述接收逻辑被配置成:
53.接收表示分层加速结构的一部分的数据,其中,所述分层加速结构包括节点,每个节点表示场景中的区域,其中,所述节点被链接以形成所述分层加速结构,其中,所述分层加速结构的所述部分表示所述分层加速结构内的子树;以及
54.接收待测试与由所述子树的特定节点表示的区域的相交的一个或多个光线的指示,其中,所述子树包括所述特定节点的后裔;
55.节点处理逻辑,所述节点处理逻辑被配置成基于所述光线跟踪系统中的条件确定是否要跳过测试所述一个或多个光线与所述子树的特定节点表示的区域的相交;以及
56.多个测试块,所述多个测试块被配置成根据由所述节点处理逻辑作出的所述确定测试所述一个或多个光线的相交,其中所述相交测试模块被配置成使所述多个测试块通过以下方式测试所述一个或多个光线的相交:
57.如果所述节点处理逻辑作出的所述确定是要跳过测试所述一个或多个光线与所述子树的特定节点表示的区域的相交,则测试所述一个或多个光线与所述子树中的特定层级的所述特定节点的后裔表示的区域的相交,从而跳过测试所述一个或多个光线与所述子树的特定节点表示的区域的相交。
58.所述特定节点可以是隐含表示的节点,其中定义由隐含表示的节点表示的区域的数据未被明确地包括为表示所述子树的所述接收数据的一部分,但可以从所述接收的数据推断,并且
59.其中,所述节点处理逻辑可以被进一步配置成:
60.如果所述确定是不跳过测试所述一个或多个光线与所述子树的特定节点表示的
区域的相交,则从所述接收的数据推断定义由所述特定节点表示的区域的数据;以及
61.如果所述确定是要跳过测试所述一个或多个光线与所述子树的特定节点表示的区域的相交,则跳过推断定义由所述特定节点表示的区域的数据。
62.所述接收逻辑可以被配置成接收表示所述分层加速结构的一部分的数据作为数据块,其中所述数据块可以包括表示所述分层加速结构内的所述子树的数据。
63.所述相交测试模块可以进一步包括被配置成存储所接收的数据的本地存储器。
64.提供了一种被配置成渲染场景的图像的光线跟踪系统,所述光线跟踪系统包括:
65.处理模块,所述处理模块被配置成生成分层加速结构;
66.如本文所述的相交测试模块,所述相交测试模块被配置成使用所生成的分层加速结构的一部分来执行相交测试;以及
67.处理逻辑,所述处理逻辑被配置成执行一个或多个着色器程序以处理所述相交测试的结果以确定表示所述场景的图像的渲染值。
68.提供了一种被配置成执行本文所述方法中的任一种方法的相交测试模块或光线跟踪系统。
69.本文描述了一种生成要用于光线跟踪系统中的相交测试的分层加速结构的计算机实施的方法,该方法包括:
70.确定所述分层加速结构的节点,其中,所述节点中的每一个节点表示场景中的区域,并且其中,所述节点被链接以形成所述分层加速结构;以及
71.存储表示所述分层加速结构的数据,其中,所述存储的数据包括定义由所述分层加速结构的多个节点表示的区域的数据,
72.其中,所述分层加速结构的至少一个节点是隐含表示的节点,其中,定义由隐含表示的节点表示的区域的数据未被明确地包括为所述存储的数据的一部分,但能够从所述存储的数据推断。
73.本文描述了一种处理模块,所述处理模块被配置成生成用于光线跟踪系统中的相交测试的分层加速结构,所述处理模块被配置成:
74.确定所述分层加速结构的节点,其中,所述节点中的每一个节点表示场景中的区域,并且其中,所述节点被链接以形成所述分层加速结构;以及
75.使得表示所述分层加速结构的数据得到存储,其中所述存储的数据包括定义由所述分层加速结构的多个节点表示的区域的数据,
76.其中,所述分层加速结构的至少一个节点是隐含表示的节点,其中,定义由隐含表示的节点表示的区域的数据未被明确地包括为所述存储的数据的一部分,但能够从所述存储的数据推断。
77.本文提供了一种在用于渲染场景图像的光线跟踪系统中执行相交测试的计算机实施的方法,该方法包括:
78.接收表示分层加速结构的至少一部分的数据,其中所述分层加速结构包括节点,每个节点表示场景中的区域,其中所述节点被链接以形成分层加速结构,其中所述接收的数据包括定义由分层加速结构的多个节点表示的区域的数据,并且其中所述分层加速结构包括隐含表示的节点,其中定义由所述隐含表示的节点表示的区域的数据未被明确地包括为所述接收的数据的一部分,但能够从所述接收的数据推断;
79.从所述接收的数据推断定义由所述隐含表示的节点表示的区域的数据;以及
80.通过测试光线与由分层加速结构的节点表示的区域的相交来对场景中的光线执行相交测试,其中所述对场景中的光线执行相交测试包括使用推断数据来测试光线与由分层加速结构的隐含表示的节点表示的区域的相交。
81.本文中描述了一种被配置成在用于渲染场景图像的光线跟踪系统中执行相交测试的相交测试模块,所述相交测试模块包括:
82.接收逻辑,所述接收逻辑被配置成接收表示分层加速结构的至少一部分的数据,其中所述分层加速结构包括节点,每个节点表示场景中的区域,其中所述节点被链接以形成分层加速结构,其中所述接收的数据包括定义由分层加速结构的多个节点表示的区域的数据,并且其中所述分层加速结构包括隐含表示的节点,其中定义由所述隐含表示的节点表示的区域的数据未被明确地包括为所述接收的数据的一部分,但能够从所述接收的数据推断;
83.节点处理逻辑,所述节点处理逻辑被配置成从所述接收的数据推断定义由所述隐含表示的节点表示的区域的数据;以及
84.一个或多个测试块,所述一个或多个测试块被配置成通过测试光线与由分层加速结构的节点表示的区域的相交来对场景中的光线执行相交测试,其中所述一个或多个测试块中的至少一个被配置成使用推断数据来测试光线中的一个或多个与由分层加速结构的隐含表示的节点表示的区域的相交。
85.可以提供一种生成要用于光线跟踪系统中的相交测试的分层加速结构的计算机实施的方法,该方法包括:
86.确定分层加速结构的节点,其中节点中的每一个节点表示3d场景中的区域,并且其中节点被链接以形成分层加速结构;以及
87.在存储器中的数据块中存储节点的数据,其中,数据块包括表示分层加速结构内的子树的数据,其中,子树包括分层加速结构内多个层级的一个或多个节点;
88.其中,所述数据块包括:(i)定义由子树的最低层级的节点表示的区域的数据,以及(ii)指示子树的节点如何链接的数据,并且
89.其中,子树的至少一个处于子树的最低层级上方的层级的节点由数据块中的数据隐含表示,使得定义由相应至少一个节点表示的至少一个区域的数据不明确地存储在数据块中,但可从以下各项推断:(i)定义由子树的最低层级的至少一些节点表示的区域的数据中的至少一些,和(ii)指示所述子树的所述节点如何链接的数据中的至少一些。
90.子树的“最低层级”是子树的最远离分层加速结构的根的层级。子树的最低层级的节点在子树中没有子节点。
91.可以提供一种生成要用于光线跟踪系统中的相交测试的分层加速结构的计算机实施的方法,该方法包括:
92.确定分层加速结构的节点,其中节点中的每一个节点表示3d场景中的区域,并且其中节点被链接以形成分层加速结构;以及
93.在存储器中的数据块中存储节点的数据,其中,数据块包括表示分层加速结构内的子树的数据,其中,子树包括分层加速结构内多个层级的一个或多个节点。
94.本文中所描述的处理模块、相交测试模块和光线跟踪系统可以在集成电路上以硬
件体现。可以提供一种在集成电路制造系统中制造如本文所述的处理模块、相交测试模块或光线跟踪系统的方法。可以提供一种集成电路定义数据集,该集成电路定义数据集在集成电路制造系统中处理时将系统配置成制造处理模块、相交测试模块或光线跟踪系统。可以提供一种非暂态计算机可读存储介质,该非暂态计算机可读存储介质上存储有处理模块、相交测试模块或光线跟踪系统的计算机可读描述,该计算机可读描述在集成电路制造系统中被处理时致使集成电路制造系统制造包含处理模块、相交测试模块或光线跟踪系统的集成电路。
95.可以提供一种集成电路制造系统,该集成电路制造系统包括:非暂态计算机可读存储介质,其上存储有如本文所述的处理模块、相交测试模块或光线跟踪系统的计算机可读描述;布局处理系统,该布局处理系统被配置为处理该计算机可读描述以生成包含处理模块、相交测试模块或光线跟踪系统的集成电路的电路布局描述;以及集成电路生成系统,该集成电路生成系统被配置为根据电路布局描述来制造处理模块、相交测试模块或光线跟踪系统。
96.可以提供一种用于执行本文中描述的任一方法的计算机程序代码。可提供一种非暂态计算机可读存储介质,在其上存储有计算机可读指令,所述计算机可读指令在计算机系统处执行时使所述计算机系统执行本文中描述的任何方法。
97.如对本领域的技术人员显而易见的,上述特征可以适当地组合,并且可以与本文所述的示例的任何方面组合。
附图说明
98.参考附图通过示例的方式描述本发明。在附图中:
99.图1示出了现有技术的光线跟踪系统;
100.图2a示出了要针对其测试光线相交情况的场景内的区域和图元的2d示例;
101.图2b示出了用于表示图2a中所示的区域的分层加速结构;
102.图3示出了根据本文中所描述的示例的光线跟踪系统;
103.图4是生成用于光线跟踪系统中的相交测试的分层加速结构的方法的流程图;
104.图5示出了分层加速结构的一部分,其中两个节点是隐含表示的;
105.图6是在光线跟踪系统中执行相交测试的第一方法的流程图;
106.图7a示出了将分层加速结构的节点存储在数据块中的第一示例;
107.图7b示出了图7a中所示的第一示例中的数据块中的数据格式;
108.图8a示出了将分层加速结构的节点存储在数据块中的第二示例;
109.图8b示出了图8a中所示的第二示例中的数据块中的数据格式;
110.图9a示出了将分层加速结构的节点存储在数据块中的第三示例;
111.图9b示出了图9a中所示的第三示例中的数据块中的数据格式;
112.图10a示出了将分层加速结构的节点存储在数据块中的第四示例,其中一些节点被隐含表示;
113.图10b示出了图10a中所示的第四示例中的数据块中的数据格式;
114.图11a示出了分层加速结构内的子树;
115.图11b示出了由图11a中所示的子树的节点表示的场景内的区域;
116.图12a示出了已经平坦化之后图11a的子树;
117.图12b示出了由图12a中所示的平坦化子树的节点表示的场景内的区域;
118.图13是在光线跟踪系统中执行相交测试的第二方法的流程图;
119.图14a示出了存储在数据块中的分层加速结构内的节点子树,其中一些节点被隐含表示;
120.图14b示出了已经平坦化之后图14a的子树;
121.图15示出了实施光线跟踪单元的计算机系统;以及
122.图16示出了用于生成包含如本文所描述的光线跟踪系统的集成电路的集成电路制造系统。
123.附图示出了各种示例。技术人员将理解,附图中所示的元件边界(例如,框、框的组,或其它形状)表示边界的一个示例。在一些示例中,情况可能是一个元素可以被设计为多个元素,或者多个元素可以被设计为一个元素。在适当的情况下,贯穿各附图使用共同附图标记来指示相似特征。
具体实施方式
124.通过示例的方式给出以下描述,以使本领域的技术人员能够制造和使用本发明。本发明不限于本文中描述的实施例,并且对所公开的实施例的各种修改对于所属领域的技术人员而言将是显而易见的。仅通过示例的方式描述实施例。
125.类似于上文背景部分中所描述的光线跟踪系统100,本文所描述的光线跟踪系统包括光线跟踪单元和存储器。光线跟踪单元被配置成生成加速结构并将加速结构发送至存储器以存储在其中。然后,可以从存储器读取加速结构的部分,并用于在光线跟踪单元上进行相交测试。相交测试的结果用于确定表示场景的图像的渲染值,所述渲染值接着可被写回存储器。用于表示加速结构的数据量较大,例如通常大于可存储在光线跟踪单元上的存储器中的数据量。这就是加速结构存储在单独存储器中的原因。例如,存储加速结构的存储器可以不与光线跟踪单元物理地位于相同的芯片上,并且可以被称为“外部存储器”或“芯片外存储器”。存储器也可以被称为“系统存储器”,并且其可以用于存储用于系统中的其它处理单元,例如中央处理单元(cpu)的数据。在光线跟踪单元和存储器之间传递的数据在通信总线上行进。与在光线跟踪单元中执行其它操作的速度相比,将数据写入到存储器以及从存储器读取数据是消耗相对较大功率的缓慢操作。因此,减少用于表示加速结构的数据量,从而减少在光线跟踪单元和存储器之间传递的数据量可能(就减少光线跟踪系统的延时和功耗而言)是有益的。数据从存储器传递到光线跟踪单元的速率可以被称为“存储器带宽”。减少用于表示加速结构的数据量还减少了存储加速结构所需的存储器量。
126.在本文所述的示例中,存储表示加速结构的数据,其中加速结构的至少一个节点是隐含表示的节点。定义由隐含表示的节点表示的区域的数据未被明确地包括为所存储的数据的一部分,但可以从表示加速结构的所存储的数据推断。例如,加速结构可以是分层加速结构。特定节点可以是隐含表示的节点(即,定义由特定节点表示的区域的数据可以不明确地包括在存储的数据中),但是在分层加速结构中在特定层级上定义由特定节点的后裔表示的区域的数据可以被存储,其可以用来暗示(即,“推断”)定义由特定节点表示的区域的数据。例如,分层加速结构中特定层级的特定节点的后裔可以是分层加速结构中的特定
节点的子代。作为另一示例,分层加速结构中特定层级的特定节点的后裔可以是分层加速结构中的特定节点的孙代。如果对隐含表示的节点执行相交测试,那么光线跟踪单元使用表示加速结构的一些数据,例如,使用定义在分层加速结构中的特定层级的隐含表示的节点的后裔表示的区域的数据,来推断定义由隐含表示的节点表示的区域的数据。例如,可以使用父节点的子代的边界和关于分层加速结构的拓扑的信息来推断父节点的边界。关于分层加速结构拓扑的信息定义了节点在分层加速结构中是如何链接的,即它定义了分层加速结构中的不同节点之间的关系,例如作为子女

父母关系或同胞关系。
127.通过不明确地存储定义由隐含表示的节点表示的区域的数据,减少了在光线跟踪单元和存储器之间传递的数据量以及存储在存储器中的数据量。
128.此外,即使在使用加速结构时,在光线跟踪系统中执行相交测试所涉及的工作量仍然很大。例如,光线跟踪可用于渲染3d场景的图像,其中图像可具有百万量级的像素。可以针对每个样本位置跟踪一次光线。在一些示例中,每个像素位置可以有一个采样位置,而在一些其它示例中,每个像素位置可以有多个采样位置(例如,以允许在渲染最终像素值时执行诸如多样本抗混叠(msaa)等过程)。当光线与场景中的物体相交时,可以执行着色器程序,这可能导致另一个光线(即,“二次光线”)发射到场景中。每个一次光线可以导致许多二次光线的发射,这些二次光线全部通过场景被跟踪以确定其交点。因此,通过场景跟踪有数以千万或数亿的光线以用于渲染图像并不少见。随着图形渲染技术的发展,要渲染的场景的复杂性趋向于增加,因此场景中存在数千个物体并不少见,每个物体可以由许多图元表示。此外,正在渲染的图像可以表示要实时渲染的帧序列的帧,例如,用于实时向用户显示。例如,用户可能正在玩游戏,其中,渲染的图像表示用户在玩游戏时对3d场景的观察。为了使帧序列看起来像是连续的视频数据流,略举数例,每秒可以渲染许多帧,例如每秒24、30或60帧。因此,可以理解的是,在光线跟踪系统中执行相交测试以实时地渲染要输出的场景所涉及的工作是大量的。
129.克服该问题并执行光线跟踪以渲染要实时输出的场景的一个方法是使一个或多个超级计算机执行所有处理。这可被认为是一种“蛮力”方法。然而,除了具有高性能的目的之外,为了执行光线跟踪以渲染要实时输出的场景,还存在减小光线跟踪系统的大小(例如硅面积)和功耗的竞争性目的。例如,可以有在例如平板电脑或智能手机等移动装置上实施光线跟踪系统的目的,其可接受的大小和功耗可能远低于超级计算机。因此,当设计光线跟踪系统时,在性能、功耗和面积之间可能存在折衷。在本文所述的一些示例中,可以提高性能(即,可以降低延时),而不显著增加光线跟踪系统的功耗或面积。
130.相交测试模块可以具有多个测试块,所述多个测试块中的每一个可以执行相交测试以测试具有场景中的区域的光线。光线可以一起分组到成包(packet),其中,包中的每个光线都要通过相交测试模块的相应测试块测试与场景中的区域的相交。相交测试过程通常具有两个瓶颈之一,其限制了可以进行相交测试的速率:(i)存储器带宽是限制因素,例如,可以从待针对光线测试的存储器检索表示加速结构的部分的数据的速率是限制因素,或(ii)所述相交测试模块的吞吐量是限制因素,例如,相交测试模块可以执行相交测试操作的速率是限制因素。这两个因素中的哪一个是限制因素将取决于光线跟踪系统中的条件(例如操作条件)。例如,上述两个因素中的哪一个是限制因素可以取决于正测试其相交的光线的分布。如果要测试相交的光线是较为相干的,那么将同时测试相对大量的光线与场
景中的相同区域的相交;而如果要测试相交的光线较为不相干,那么将同时测试相对较少数量的光线与场景中的相同区域的相交。如果光线在时域接近的时间被提交用于相交测试并且具有相似的起点和相似的方向,那么光线是“相干的”。如果光线是较为相干的,则在特定时间测试与场景中的特定区域相交的光线的数量往往大于所述光线较为不相干的情况。因此,当光线较为不相干时,限制因素更有可能是存储器带宽,即可从存储器中获取表示场景中不同区域的数据的速率,并且这意味着相交测试模块的一些测试块在任何给定处理循环中可能空闲。相比之下,当光线较为相干时,限制因素更有可能是相交测试模块的吞吐量,并且在这种情况下,在任何给定的处理循环中,更少的测试块容易空闲。
131.在本文所述的示例中,相交测试模块可以基于光线跟踪系统中的条件在相交测试期间动态地决定是测试还是跳过测试特定节点。如果相交测试模块决定跳过对特定节点的测试,则它可以替代地测试该特定节点的子节点。以此方式,相交测试模块可以动态地改变正被遍历的分层加速结构的拓扑。这样可以提高光线跟踪系统的性能。例如,如果测试特定节点的相交,相交测试模块的许多测试块在特定处理循环中会空闲,则可以跳过该特定节点的测试,转而可以在该特定处理循环中测试特定节点的子节点的相交。以此方式,在将加速结构的多个层级一起编码的示例中,相交测试模块可以以很少的成本,例如零成本(即,不产生任何额外延时)推进分层加速结构中的层级。跳过关于特定节点的相交测试可被视为针对子树中包括分层加速结构内的该特定节点的层级跳过相交测试。针对分层加速结构内的子树中的层级跳过相交测试可被称为对子树进行“平坦化”。
132.在一些示例中,该特定节点是隐含表示的节点。在这些示例中,相交测试模块可以基于光线跟踪系统中的条件在相交测试期间动态地决定是否生成该特定节点(即,推断定义由该特定节点表示的区域的数据)。因此,相交测试模块可以基于当前系统条件,例如,基于系统中的当前瓶颈是什么(例如,基于如果生成隐含表示的节点并测试其相交,则相交测试模块的一些测试块是否空闲的判断),在相交测试期间动态地决定是否生成和测试隐含表示的节点,或者是否仅测试隐含表示的节点的子节点。术语“动态地”在本文中用于意指在渲染场景的图像的相交测试阶段期间(例如,而不是在渲染场景的图像的加速结构生成阶段期间)。
133.图2a示出了要针对其测试光线相交情况的场景内的区域和图元的2d示例。在其它示例中,场景和区域是三维的,但为了易于说明和理解,图2a示出了具有场景内的二维区域的二维场景。图2b示出了用于表示图2a中所示的区域的分层加速结构。图2a示出了x轴和y轴的方向。图2a中所示的所有区域都是轴对齐包围盒(aabb)。图2a还示出了场景内的九个三角形图元(在图2a中标记为1到9)。图元用于表示场景中的物体,并且可以是任何形状,但通常图元是平面多边形(例如,三角形)、线或点,其可以根据其顶点来定义。
134.分层加速结构的根节点(a)表示区域a’,所述区域a’是覆盖整个场景的aabb。节点a在分层加速结构中具有两个子节点:节点b和c。节点b表示区域b’,所述区域b’是被示为朝向图2a中所示场景的左侧的aabbb。节点c表示区域c’,所述区域c’是被示为朝向图2a中所示场景的右侧的aabb。节点b在分层加速结构中具有两个子节点:节点d和e。节点d表示区域d’,所述区域d’是利用朝向图2a中所示的区域b’的底部的虚线表示的aabb。节点e表示区域e’,所述区域e’是利用朝向图2a中所示区域b’的左上的虚线表示的aabb。节点d在分层加速结构中具有两个子节点:节点h和i。节点h表示区域h’,所述区域h’是利用朝向区域d’的左
侧的点线表示,并且包含图2a所示的图元1和2的aabb。节点i表示区域i’,所述区域i’是利用朝向区域d’的右下的点线表示,并且包含图2a所示的图元3的aabb。节点e在分层加速结构中具有两个子节点:节点j和k。节点j表示区域j’,所述区域j’是利用区域e’的底部的点线表示,并且包含图2a所示的图元4的aabb。节点k表示区域k’,所述区域k’是利用朝向区域e’的顶部的点线表示,并且包含图2a所示的图元5的aabb。节点c在分层加速结构中具有两个子节点:节点f和g。节点f表示区域f’,所述区域f’是利用图2a中所示的区域c’的左上的虚线表示的aabb。节点g表示区域g’,所述区域g’是利用图2a所示区域c’的底部的虚线表示的aabb。节点f在分层加速结构中具有两个子节点:节点l和m。节点l表示区域l’,所述区域l’是利用区域f’的底部的点线表示,并且包含图2a所示的图元6的aabb。节点m表示区域m’,所述区域m’是利用区域f’的顶部的点线表示,并且包含图2a所示的图元7的aabb。节点g在分层加速结构中具有两个子节点:节点n和o。节点n表示区域n’,所述区域n’是利用区域g’的右侧的点线表示,并且包含图2a所示的图元8的aabb。节点o表示区域o’,所述区域o’是利用朝向区域g’的左下的点线表示,并且包含图2a所示的图元9的aabb。
135.图2b中所示的图元实际上不是分层加速结构的一部分,但示出它们以说明图元如何与分层加速结构的节点相关。分层加速结构的“节点”表示区域(例如,aabb)。“树节点”指具有指向分层加速结构中的其他节点的指针的节点(即,树节点在分层加速结构中具有子节点)。“叶节点”指具有指向一个或多个图元的一个或多个指针的节点(即,叶节点在分层加速结构中不具有子节点)。参考图2b,节点a、b、c、d、e、f和g是分层加速结构的树节点;节点h、i、j、k、l、m、n和o是分层加速结构的叶节点;并且三角形1到9不是分层加速结构的节点,但是在图2b中示出以指示哪些叶节点具有指向哪些图元的指针。
136.图3示出了根据本文中所描述的示例的光线跟踪系统300。光线跟踪系统300包括光线跟踪单元302和存储器304。光线跟踪单元302包括处理模块306、相交测试模块308、处理逻辑310、调度器312和请求队列314。相交测试模块308包括接收逻辑316、本地存储器318、节点处理逻辑320、测试队列322、一个或多个测试块(大体上在324处表示)的集合(或“阵列”)和结果处理器326。请求队列314和测试队列322可以采取缓冲器的形式,例如堆栈(即先进后出(filo)缓冲器)或先进先出(fifo)缓冲器。测试块324可以实施为硬件单元(例如,使用固定功能电路)或在软件中实施为例如由处理单元执行的着色器代码。
137.在操作中,光线跟踪单元302接收定义场景内的物体的几何数据。例如,场景可以是3d场景或2d场景。光线跟踪单元302还接收渲染场景图像所来自的视点的指示。处理模块306被配置成基于几何数据生成加速结构,并且将表示加速结构的数据发送至存储器304以存储于其中。处理模块306可以在硬件(例如,固定功能电路)中或在软件(例如,作为在通用处理单元上执行的计算机代码)中实施。
138.图4示出了生成用于光线跟踪系统300中的相交测试的分层加速结构的方法的流程图。在步骤s402中,处理模块306确定分层加速结构的节点。如上所述,每个节点表示场景中的区域,并且节点被链接以形成分层加速结构。节点是基于在光线跟踪单元302处接收的定义场景内的物体的几何数据来确定的。本领域技术人员将意识到,存在很多种用于基于定义场景内的物体的几何数据来确定分层加速结构的节点的方法。这些方法的细节超出本公开的范围。此外,分层加速结构的结构在不同示例中可以不同。例如,分层加速结构可以是包围体积层次体系(bvh),其中,节点表示场景中紧密地绑定场景中的物体或图元的区
域。由具有bvh结构的分层加速结构的节点表示的区域可能不具有规则大小,并且可能不是连续的。例如,在具有bvh结构的分层加速结构中,由特定层级的节点表示的区域可能并非全部具有相同的大小或形状,且共同可能并不涵盖所有场景。图2a和图2b中所示的分层加速结构具有bvh结构。例如,可以看到,由层次体系中的一个层级的节点表示的区域d’、e’、f’和g’并不都具有相同的大小或形状,并且并不共同覆盖所有场景。相比之下,分层加速结构可具有空间细分结构,例如多级网格结构或八叉树结构,其中,节点表示作为场景的规则细分的区域。由具有空间细分结构的分层加速结构的节点表示的区域具有规则大小,并且是连续的。例如,在具有空间细分结构的分层加速结构中,由特定层级的节点表示的区域可能全部具有相同的大小或形状,且共同表示所有场景。
139.在步骤s404中,存储表示分层加速结构的数据。具体而言,处理模块306通过将数据发送至存储器304,使表示分层加速结构的数据存储在存储器304中。所存储的数据(即,表示分层加速结构的数据)包括定义由分层加速结构的多个节点表示的区域的数据。然而,在本文描述的示例中,分层加速结构的至少一个节点是隐含表示的节点,其中,定义由隐含表示的节点表示的区域的数据未被明确地包括为所存储的数据的一部分,但可以从所存储的数据推断。隐含表示的节点在本文中可以被称为“隐含节点”。
140.定义由隐含表示的节点表示的区域的数据可以使用定义由分层加速结构的其他节点中的至少一些表示的区域的数据(明确存储)从存储的数据推断。例如,“至少一些其它节点”可以是隐含表示的在分层加速结构中的特定层级的节点的后裔,例如隐含表示的节点的子代或孙代。
141.所存储的表示分层加速结构的数据可以包括指示如何链接分层加速结构的节点的数据。指示分层加速结构的节点如何链接的数据中的至少一些可用于推断定义由隐含表示的节点表示的区域的数据,例如,通过识别分层加速结构中的哪些节点是分层加速结构中的特定层级上的隐含表示的节点的后裔(例如,通过识别哪些节点是隐含表示的节点的子代或孙代)。
142.如上所述,在本文所述的示例中,由分层加速结构的节点表示的区域是场景中的轴对齐包围盒(aabb),例如如图2a的2d示例中所示。可以通过为每个轴指定沿着该轴的最小和最大分量来定义aabb。可以通过在场景的每个维度中确定定义由分层加速结构中特定层级的隐含表示节点的后裔表示(例如,由分层加速结构中隐含表示节点的子代或孙代表示)的轴对齐包围盒的分量中的最小和最大分量,来推断定义由隐含表示的节点表示的区域的数据。
143.例如,图5示出了在图2b中所示的分层加速结构的一部分,处于两个节点(节点d和e)被隐含表示的状况中。隐含表示的节点在图5中以虚线示出。可以存储表示图5中所示的分层加速结构的数据。定义节点d和e的数据未被明确地包括为表示分层加速结构的数据的一部分,但定义子节点h、i、j和k的数据被明确地包括为所存储的数据的一部分,并且可用于推断由节点d和e表示的区域。
144.由于定义由隐含表示的节点表示的区域的数据未被明确地包括为所存储的数据的一部分,所以与分层加速结构的任何节点都不隐含表示相比,减少了用于表示分层加速结构的数据量。
145.图6是在光线跟踪系统300中执行相交测试的第一方法的流程图。调度器312接收
指令以跟踪一组一个或多个光线(即,为其执行相交测试)。这些指令可以从gpu中的着色器核心(例如,从光线跟踪单元302的处理逻辑310)或从cpu接收。例如,在着色器核心上执行(例如,在处理逻辑310上执行)的着色器程序可以创建光线并将其发送至调度器312,以便针对加速结构遍历它们,即,使用加速结构对其执行相交测试。在步骤s602中,调度器将光线分组成待测试相交的分组。调度器312可以这样做以对需要访问存储器304的相同块或部分的光线分组。例如,调度器312可以将光线分组为待测试其与分层加速结构中针对其在数据块中接收到数据的节点表示的区域的相交的分组。存储器304的块或部分可以是一组存储器地址处的可以从存储器304中一起获取的连续存储器块。参考存储器304的相同块的一组光线可以被称为分组。例如,将要针对同一个盒或物体测试的光线可以被分到分组中,使得盒或物体的数据可以从存储器304一次性提取,以用于分组中的所有光线的相交测试。作为示例,对于相交测试的初始阶段,可能是所有光线将与根节点(例如,图2b中的节点a)相交,并且因此需要访问存储器304的相同块,从而落入一个分组内。一旦调度器312已将一个或多个光线集合到分组中,调度器312将发出该分组并使该分组加入请求队列314,从而从存储器304请求该分组的节点数据(即,请求描述对应于加速结构的适当节点的盒的数据,要比照该数据测试分组的光线的相交)。
146.在步骤s604中,从存储器304检索分组的节点数据,并将其传递到相交测试模块308。即,在步骤s604中,相交测试模块308的接收逻辑316接收表示分层加速结构的至少一部分的数据。例如,所接收的数据可以表示图5中所示的分层加速结构的一部分。接收的数据包括定义由分层加速结构的多个节点(例如,节点b、h、i、j和k)表示的区域的数据。然而,定义由隐含表示的节点(例如,节点d和e)表示的区域的数据未被明确地包括为所述接收的数据的一部分。该数据可以从所接收的数据推断。
147.接收逻辑316将它从存储器304接收的节点数据(即,定义分层加速结构的一部分的数据)传递到本地存储器318以存储于其中。当从存储器304获取到数据时,本地存储器318临时存储节点的数据,使得此数据可以重新使用,例如用于执行光线与节点数据定义的节点的相交测试,而无需从存储器304重新获取节点数据。节点数据从本地存储器318被提供到节点处理逻辑320。
148.在步骤s606中,节点处理逻辑320从接收的数据推断定义由隐含表示的节点表示的区域的数据。例如,节点处理逻辑320可以使用定义由节点h和i表示的区域的数据来推断定义由隐含表示的节点d表示的区域的数据,节点处理逻辑320可以使用定义由节点j和k表示的区域的数据来推断定义由隐含表示的节点e表示的区域的数据。例如,参考图2a、图2b和图5可以看出,可以通过确定节点h和i(节点d的子节点)的分量的最小和最大值来推断节点d所表示的aabb中的x和y维度的每个中的最小和最大分量。类似地,可以通过确定节点j和k(节点e的子节点)的部件的最小值和最大值来推断由节点e表示的aabb的x和y维度的每个中的最小和最大分量。因此,在此示例中,步骤s606涉及通过在每个维度中确定由隐含表示的节点的子节点表示的区域的分量的最小和最大值,来推断定义由每个隐含表示的节点表示的区域的数据。节点的节点数据(在从存储器304检索的数据中明确定义,或在步骤s606中推断)被传递到测试队列322。在此示例中,由节点表示的区域是aabb,但在其它示例中,所述区域可以是其它形状,例如球体或多面体。在这些其它示例中,技术人员将知道如何使用定义由分层加速结构中的其它节点表示的其它区域的数据来推断由隐含表示的节
点表示的区域。
149.接收逻辑316还接收待测试与由分层加速结构的部分的节点中的一个表示的区域的相交的一个或多个光线的指示。例如,在接收逻辑316处从存储器(例如,存储器304)或从请求队列314(经由链路,利用图3中的虚线所示)接收光线分组的光线数据,以在测试队列322处与对应节点数据相关联。
150.当在测试队列322处接收到针对待测试与光线分组的光线的相交的节点的光线分组的光线数据和节点数据时,相交测试模块308将来自分组的光线分配给测试块324。相交测试模块308可以将光线按顺序分配到测试块324。当已将分组的光线分配给测试块时,该测试块执行相交测试,以例如,通过对盒的适当边缘进行边缘测试,来确定该光线是否与对应于光线测试所比照的节点的区域相交。以此方式,在步骤s608中,测试块324通过测试光线与由分层加速结构的节点表示的区域的相交来对场景中的光线执行相交测试。当正在测试光线与隐含表示的节点的相交时,则步骤s608包括使用在步骤s606中推断的数据来测试光线与由分层加速结构的隐含表示的节点表示的区域的相交。实施相交测试以确定光线是否与区域(例如aabb)相交的方法是本领域已知的,并且为了简洁起见,本文未详细描述。
151.测试块324均向结果处理器326输出它们已经执行的相交测试的结果。结果处理器326处理相交测试的结果。具体而言,如果已经发现光线不与其正在被测试所针对的节点相交,则结果处理器326不为该光线相对于不相交的节点的子节点调度相交测试。如果结果处理器326确定光线已经与其正在被测试所针对的节点相交,那么将该光线从相交测试模块308输出回到调度器312,在这里,该光线将被分组成到分组中,并且被调度以相对于相交节点的子节点进行相交测试。
152.迭代地重复上文参考步骤s602到s608所述的过程,直到光线没有更多命中。响应于光线与叶节点相交(例如,图2b中所示的叶节点h、i、j、k、l、m、n或o中的一个),该叶节点内的(多个)物体各自被调度用于与光线的相交测试。相交测试模块308可以包括物体测试块(图3中未示出),其被配置成针对与所述叶节点内的物体相交的光线执行相交测试。物体可以用三角形图元描述,使得物体测试块被配置成测试光线相对于场景中的三角形的相交。本领域技术人员将知道如何测试光线与三角形图元的相交,并且本文未详细描述该过程的细节。如果针对光线的所有相交测试的结果是光线不与场景中的任何物体相交,那么返回“错过”结果,并且可以对其进行相应的处理。如果针对光线的所有相交测试的结果是光线与单个物体相交,那么可以返回此相交的数据以及“命中”结果,并且对其进行相应的处理。如果针对光线的所有相交测试的结果是光线与多于一个物体相交,那么比较相交的相交距离(即,从光线原点到交点的距离)以找到“最近命中”,即,最接近光线原点的交点。可以返回这一最近命中相交的数据以及“命中结果”并对其进行相应的处理。当确定“命中”结果时,可以由物体测试块确定与相交有关的数据,例如,相交在相交图元上的位置的指示(例如,作为重心坐标)和相交距光线起点的距离的指示。
153.相交测试的结果(例如,命中结果)被传递到处理逻辑310。处理逻辑310执行一个或多个着色器程序以处理相交测试的结果以确定表示场景的图像的渲染值。以此方式,可以确定相交的效果,即,使用相交测试结果来确定表示场景的图像的渲染值。
154.为了渲染3d场景的图像,可以执行许多相交测试(例如,数百万或甚至数十亿次相交测试)。因此,对于光线跟踪系统300的性能来说,重要的是相交测试模块308可以快速地
执行相交测试。这意味着,在硬件中(例如,使用固定功能电路)实现相交测试模块308可能是有益的,使得与在软件中执行相交测试相比,相交测试操作的延时相对较低。然而,在某些系统中,相交测试模块308可以在通用处理单元上执行的软件中实施。一般来说,处理逻辑310可以在硬件或软件中实施,但允许由处理逻辑310执行的功能灵活性以处理相交测试的结果通常是有益的,因此处理逻辑310通常被配置成执行着色器程序,即计算机代码的模块,以处理相交测试的结果。处理逻辑310可以被实现为单指令多数据(simd)处理单元,所述单指令多数据处理单元被配置成对多个数据项并行执行指令。由处理逻辑310确定的渲染值可以传回到存储器304以存储在其中,以表示3d场景的图像。
155.在不同示例中,被存储以表示分层加速结构的数据的格式可以不同。例如,表示分层加速结构的数据包括两个要素:(i)定义由分层加速结构的节点表示的区域(例如,aabb)的信息,以及(ii)关于层次体系的拓扑的信息,例如,定义节点如何链接以形成分层加速结构的信息。图7a和图7b示出了分层加速结构的每个节点的数据存储在单独的数据块中的简单示例。图7a示出了分层加速结构的一部分的节点为圆圈,而正方形表示数据块。箭头示出了分层加速结构中的节点之间的链接(同胞链接或子链接)。在此示例中,由节点表示的区域是aabb。图7b示出了在此示例中的数据块中的数据格式。如图7b中所示,数据块包括将节点表示的aabb定义为x、y和z维度的每一个中的最大和最小分量值的数据。数据块还包括指向子节点的“子指针”和指向同胞节点的“下一个指针”。应注意,在此示例中,每个节点在分层加速结构中不具有多于一个父节点。即使节点在分层加速结构中有多个子节点,在此示例中节点的数据块中仅使用一个子指针,且“下一个指针”指示节点的同胞。下一个指针可被称为同胞指针。例如,在图7a所示的分层加速结构的一部分中,节点d和e是同胞,节点h和i是节点d的子节点。在节点d的数据块中,子指针指向节点h,而下一个指针指向节点e。节点h的下一个指针指向节点i。通过这种方式,多个子节点使用同胞指针形成链表。当特定节点的相交测试返回命中结果时,通过遵循适当的指针依次获取特定节点的每个子节点,然后针对每个子节点单独地执行相交测试。图7a中所示的示例是二叉树(即,每个树节点具有恰好两个子节点),但图7b中所示的相同数据结构可以与具有更大分支因子(即,其中节点在分层加速结构中可具有多于两个子节点)的分层加速结构一起使用。通过使用同胞指针将两个以上的同胞链接在一起来实现这一点。
156.在图7b所示的示例中,数据块的每个字段包括32位,并且有8个字段,因此数据块具有32字节的表示层次体系中的单个节点的数据。逐个将节点存储在单独的数据块中对于从存储器304进行存储器读取往往是低效的,所述存储器可以例如实施为动态随机存取存储器(dram)。存储器304具有最小突发串大小,这是单次读取操作中可从存储器读取的最小数据量。在本文所述的示例中,存储器304的最小突发串大小为64字节,但在其它示例中,最小突发串大小可大于或小于64字节。分层加速结构中的单个节点的数据往往小于64字节(例如,在图7b所示的示例中其为32字节),即小于存储器304的最小突发串大小。因此,使每个数据块中的单个节点具有数据会浪费存储器带宽。
157.为了改进图7a和图7b中所示的基本方案,多个同胞节点可以存储在存储器的一个连续块中(即,在一个数据块中)。当节点的相交测试返回命中结果时,获取节点的所有子节点进行相交测试,因此如果可能,可以将它们组合到一次读取中可能是有益的。例如,图8a示出了将分层加速结构的节点存储在数据块中的第二示例。同样,分层加速结构的一部分
的节点被示为圆圈,而正方形表示数据块。箭头示出了分层加速结构中的节点之间的子链接。在此示例中,每个数据块包括最多两个节点的数据。在此示例中,如果数据块中包括多个节点,则它们是同胞节点。这样一来,不需要存储数据块中的节点之间的同胞链接。图8b示出了图8a中所示示例中的数据块中的数据格式。
158.如图8b中所示,数据块现在具有64字节的数据,并且包括表示分层加速结构的两个节点的数据(与图7b中所示的示例相反,其中数据块具有32字节的数据并且包括表示一个节点的数据)。由于在此示例中,存储器304的最小突发串大小为64字节,因此使用图8b中所示的格式而不是图7b中所示的格式在存储器带宽方面效率更高。
159.压缩技术可以用于表示数据块中的两个以上的同胞节点,而不增大数据块的大小。例如,图9a示出了将分层加速结构的节点存储在数据块中的第三示例。同样,分层加速结构的一部分的节点被示为圆圈,而正方形表示数据块。箭头示出了分层加速结构中的节点之间的子链接。在此示例中,每个数据块包括最多四个节点的数据。在此示例中,如果数据块中包括多个节点,则它们是同胞节点。这样一来,不需要存储数据块中的节点之间的同胞链接。图9b示出了图9a中所示示例中的数据块中的数据格式。
160.在此示例中,存储在数据块内的节点是同胞节点。这意味着存储在数据块内的所有节点具有相同的父节点。例如,如图9a中所示,节点o和p是同胞节点且两者都是节点n的子节点;节点q、r、s和t是同胞节点并且都是节点o的子节点;并且节点u、v、w和x是同胞节点并且都是节点p的子节点。从图2a和图2b中所示的示例中可以看到,具有相同父节点的节点在空间上距离近,即,它们一般表示在场景中彼此接近的区域。数据块内的节点的接近度可以用于压缩定义由数据块内的节点表示的区域的数据。例如,由节点表示的aabb的边界可以存储为从共享基值的偏移。例如,如图9b所示,存储x、y和z位置分量(“pos x”、“pos y”和“pos z”)以指示共同起点区域(例如,父代aabb)的位置(例如,中心位置)。“sx”、“sy”和“sz”字段表示共同起点区域的大小。存储在pos x、pos y、pos z、sx、sy和sz字段中的数据指示由数据存储在数据块中的四个节点的父节点表示的aabb的近似大小和位置。例如,具有图9b中所示格式的数据块可以存储节点q、r、s和t的数据,并且存储在pos x、pos y、pos z、sx、sy和sz字段中的数据指示由节点o表示的区域的近似大小和位置。
161.对于数据存储在数据块中且格式如图9b所示的四个节点中的每一个节点(例如,对于节点q、r、s和t中的每一个节点),数据块存储子指针,以及在x、y和z维度中的每一个中的最小和最大分量偏移(表示为“max x”、“min x”、“max y”、“min y”、“max z”和“min z”)和该节点在分层加速结构中具有多少子节点的指示(表示为“n”)。在图9b所示的格式中,“pos x”、“pos y”、“pos z”字段和子指针字段具有32位;并且“sx”、“sy”、“sz”、“max x”、“min x”、“max y”、“min y”、“max z”、“min z”和“n”字段具有8位。选择“max x”、“min x”、“max y”、“min y”、“max z”和“min z”字段的值,以便通过仅用8位(而不是32位)表示这些值而不会减小盒的大小。特别地,最小值被编码为小于或等于真实(32位)最小值(例如,当减少用于表示最小值的位数时,使用四舍五入到负无穷大取整模式),并且最大值被编码为大于或等于真实(32位)最大值(例如,当减少用于表示最大值的位数时,使用四舍五入到正无穷大取整模式)。数据块的总大小为64字节,与存储器304的最小突发串大小匹配。
162.如上所述,sx、sy和sz值表示针对数据存储在数据块中的四个节点(例如,针对节点q、r、s和t),每个aabb包含在其中的共享盒(即,公共起点区域)的大小。在此示例中,sx、
sy和sz值被存储为浮点指数,因此公共起点区域限于二次幂的大小。共享盒(或“公共起点区域”)的位置由pos x、pos y和pos z字段中的数据指示。例如,共享盒的中心可以位于由pos x、pos y和pos z字段中的数据指示的位置。数据存储在数据块中的四个节点中的特定一个节点的8位偏移值(“max x”、“min x”、“max y”、“min y”、“max z”、“min z”)相对于共享盒的边界定义由该特定节点表示的aabb的最小和最大分量。
163.除了压缩定义由节点表示的区域的边界的数据之外,同胞指针也不包括在图9b中所示的数据块中。相反,包括指示“n”,其指示节点在分层加速结构中具有的子节点的数量。子节点数量的指示可以是子数据块数量的指示。在这种情况下,如果节点具有的子节点数量在范围1

4中,则将在“n”字段中存储“1”,如果节点具有的子节点数量在范围5

8中,则将在“n”字段中存储“2”,以此类推。针对子列表的多个数据块可以连续地存储在存储器中,以避免对水平指针的需要,即避免对同胞指针的需要。
164.在图9a和图9b所示的示例中,数据块中的节点必须具有相同的父节点;堂表节点不能打包在一起。正因为如此,当分层加速结构包含具有大分支因子(例如,至少4的分支因子)的节点时,图9a和图9b中所示的格式是特别有益的。节点的分支因子是节点具有的子节点的数量。分层加速结构的每个节点的分支因子不一定相同。在图9a所示的示例中,节点o和p各自具有四个子节点以增加具有图9b中所示格式的数据块的利用率。然而,本技术的发明人已经确定,较低分支因子(例如,2的分支因子)往往对于最小化由相交测试模块308执行的相交测试的次数更好。这是因为盒越多,光线越有可能命中它们,因为它们从光线的角度讲是“重叠的”。然而,能够将更多节点打包到数据块中对于存储器带宽来说更好。因此,当确定合适的分支因子时,在减少相交测试的次数与降低存储器带宽之间存在折衷。
165.即使是图9b中所示的格式,存储器带宽(即,在光线跟踪单元302与存储器304之间传递的数据量)有时也可能成问题,例如,它仍可能是可以执行相交测试的速度的限制因素。为了解决这个问题,可以修改数据块的格式,使得来自分层加速结构的多个层级的节点的数据包括在单个数据块中。例如,数据块可以包括表示分层加速结构内的子树的数据,其中,子树包括分层加速结构内多个层级的一个或多个节点。在一些示例中,数据块可以包括表示分层加速结构内的多个子树的数据。编码子树的数据块可以在测试块324遍历子树时在本地缓存于测试块附近。例如,编码子树的数据块可以在对子树的节点执行相交测试的同时存储在本地存储器318中。由于可以在单个数据块中检索来自分层加速结构的多个层级的节点,因此可以减少光线跟踪单元302与存储器304之间的存储器带宽。例如,当相交测试模块308确定光线与特定节点相交时,特定节点的子节点的数据可能已经位于本地存储器318中,因此不需要从存储器304提取。
166.在测试块324依序测试由数据块中的数据表示的子树的多个层级中的节点的同时,本地存储器318存储数据块。本地存储器318较小且具有低延时,因此与从存储器304提取节点数据时相比,在从本地存储器318提取节点数据时更容易实现高吞吐量。这意味着,执行更少的读取以从存储器304获取数据,这可能导致光线跟踪系统300的性能增加,例如当存储器带宽是对光线跟踪系统300的性能的限制因素时。
167.然而,如果我们简单地将子树的每个节点打包成较大的数据块,则存在光线将错过子树的第一层级且不需要测试与下一层级中的节点的相交的可能性。如果发生这种情况,则大量带宽被浪费,因为从存储器304获取包括许多节点数据的较大数据块,但在相交
测试中仅使用几个节点。
168.因此,并非存储较大数据块,本发明人已意识到,如果定义由其子节点表示的区域的数据存储在数据块中,则不需要明确地将定义由父节点表示的区域的数据存储在数据块中。换句话说,如果父节点的子节点被存储,则不需要存储父节点。在这种情况下,父节点被存储为表示分层加速结构的数据中隐含表示的节点。如上所述,定义由隐含表示的父节点表示的aabb的数据可以由其所有子节点表示的aabb的最小和最大分量推断,并且可以在相交测试阶段期间在运行时计算,而不是与在加速结构生成阶段确定的分层加速结构一起存储。推断由父节点表示的aabb的计算成本在待测试与aabb的相交的光线分组中的每个光线上摊销(amortised),因此其并不太昂贵,尤其当所述光线较为相干,使得相对大量的光线被包括在光线分组中时。
169.图10a示出了将分层加速结构的节点存储在数据块中的示例,其中一些节点被隐含表示。在图10a中,节点a、d、e、f和g用虚线示出以指示它们是隐含表示的节点。图10b示出了图10a中所示示例中的数据块中的数据格式。图9b和图10b中所示的格式之间的唯一差异在于,图10b中所示的格式包括表示标记为“pg”的父组的额外字段。pg字段中的数据指示如何将节点细分为父组,即它指示数据块中的哪些节点共享隐含表示的父节点。在此示例中,数据块中的节点的数据被排序成使得具有相同父节点的节点彼此相邻,因此组(pg)字段仅指示数据块中的节点在哪里从具有一个父节点改变为具有另一个父节点。在本文所述的示例中,有可能有具有零、一个或两个隐含父节点的数据块,在其它示例中,有可能有具有甚至多于两个隐含父节点的数据块。应注意,“隐含表示的节点”在本文中也可以被称为“隐含节点”。在图10a和图10b所示的示例中,数据块存储两个子树的数据:(i)包括隐含表示的节点d及其子节点:节点h和i的第一子树;以及(ii)包括隐含表示的节点e及其子节点:节点j和k的第二子树。节点d和e是节点b的子节点。在此示例中,定义由四个节点(节点h、i、j和k)表示的区域的数据包括在数据块中。存在四个可能的分组,其中四个节点可以被分组,并且这四个可能的分组中的一个是使用pg字段中的数据定义的。在此示例中,pg字段仅具有两个位以指示四个可能分组中的一个(图10a中仅示出其中一个)。例如,如果pg具有第一值(例如00),那么不存在由数据块中的数据表示的隐含表示的节点;如果pg具有第二值(例如01),则存在由数据块中的数据表示的一个隐含表示的节点,即节点i、j和k的父节点;如果pg具有第三值(例如10),则存在由数据块中的数据表示的两个隐含表示的节点(例如d和e),其中,隐含表示的节点中的一个(例如,节点d)是节点h和i的父节点,并且隐含表示的节点中的另一个(例如,节点e)是节点j和k的父节点;并且如果pg具有第四值(例如11),则存在由数据块中的数据表示的一个隐含表示的节点,即节点h、i和j的父节点。应注意,在图10a所示的示例中,pg字段会具有第三值(例如10)。
170.在其它示例中,pg字段中的数据可以具有不同格式。例如,pg指示可用于每个隐含表示的父节点,并且隐含表示的父节点的pg指示的值可以是其具有的子节点的数量,即其“父组”中的节点的数量。在此示例中,允许节点的分组跨越多于一个数据块。例如(这并非图10a中所示的示例),数据块可包括两个pg值,其值为二和三。这可能表示一个隐含表示的节点具有子节点h和i,并且另一个隐含表示的节点具有子节点j、k和l。数据块包括定义由节点h、i、j和k表示的区域的数据,但定义由节点l表示的区域的数据包括在下一个数据块中。因此,第二隐含表示的节点的“父组”跨越到另一个数据块中。每个父组仅遵循前一父
组,因此节点在被写入数据块时被排序成父组。该示例中的格式可以允许将数据更紧密地打包到数据块中,但是当确定如何打包数据并从数据块解压缩数据时,它增加了系统的复杂性。
171.应注意,图10a和图10b中所示的示例编码包括仅具有三个64字节数据块的节点a至o(即,十五个节点)的较大子树。
172.如上所述,数据块可以包括表示分层加速结构内的一个或多个子树(例如,具有节点d、h和i的子树,以及具有节点e、j和k的子树)的数据。所述子树中的每一个包括在分层加速结构内的多个层级上的一个或多个节点。数据块包括:(i)定义由子树的最低层级的节点表示的区域的数据(例如,针对节点h、i、j和k),以及(ii)指示子树的节点如何链接的数据。子树的“最低层级”是子树的最远离分层加速结构的根节点的层级。
173.在图10a所示的示例中,子树的至少一个处于高于子树的最低层级的节点是隐含表示的节点,其由数据块中的数据隐含表示。例如,节点d由数据块中的数据隐含表示。定义由相应至少一个隐含表示的节点(例如,节点d)表示的至少一个区域的数据未明确存储在数据块中,但可从以下各项推断:(i)定义由子树的最低层级的节点中的至少一些(例如作为节点d的子节点的节点h和i)表示的区域的数据中的至少一些,和(ii)指示子树的节点如何链接的数据中的至少一些(例如,指示节点h和i是节点d的子节点的g数据)。
174.在该示例中,数据块包括定义由分层加速结构中具有共享祖先的节点表示的区域的数据。例如,共享祖先可以是分层加速结构中的共享父节点、共享祖节点或共享曾祖节点。在图10a所示的示例中,数据块包括定义由节点h、i、j和k表示的区域的数据,节点h、i、j和k具有共享祖节点:节点b。如上所述,数据块包括使用pos x、pos y、pos z、sx、sy和sz字段中的数据的共同起点区域的指示。数据块中的定义由分层加速结构中具有共享祖先(例如节点b)的节点(例如,节点h、i、j和k)表示的区域的数据对于具有共享祖先(例如,节点b)的每个节点(例如,节点h、i、j和k)包括一个或多个距共同起点区域的偏移。例如,共同起点区域可以表示由共享祖先(例如,节点b)表示的区域。
175.如上所述,表示分层加速结构的数据存储在存储器304中,并且可从存储器304读取以供相交测试模块308用于在光线跟踪系统300中执行相交测试。此外,在上述示例中,数据块的大小匹配存储器304的最小突发串大小。例如,数据块的大小和存储器304的最小突发串大小可以是64字节。
176.在图10a中,节点a、d、e、f和g全部隐含地表示,即,定义由这些节点表示的区域的数据未明确存储,并且如果需要它们的话,可以在相交测试中在运行时期间计算(即推断)。在图10a所示的示例中,每个其它层级的节点都是隐含表示的节点。在其它示例中,可以隐含地表示不同层级的节点。在一些示例中,可以隐含地表示分层加速结构的两个相继层级的节点,使得块中的一些节点的数据可以用来推断其父节点和祖节点的数据。当考虑隐含表示哪些节点时,有很多因素需要权衡,例如,要解码(多个)数据块时必须读取多少数据,生成隐含表示节点的硬件成本,以及测试光线与节点的相交的成本。例如,祖节点可以具有4和16个之间的孙节点,因此如果隐含地表示祖节点,则推断祖节点的aabb需要考虑所有孙节点。在推断由隐含表示的节点表示的区域时,这种额外的复杂性可能超过不必明确存储定义由隐含表示的节点表示的区域的数据的益处。因此,关于在表示分层加速结构的数据中隐含表示哪些节点的决定是实施决定,在不同实施中可能不同。
177.上文详细描述的示例解释定义由隐含表示的节点表示的区域的数据如何不需要明确地包括在被存储以表示分层加速结构的数据中。这减少了用于表示分层加速结构的数据量,这可以减少在光线跟踪单元302与存储器304之间传递的数据量,即降低存储器带宽。
178.现在,我们继续详细地描述可以对子树进行平坦化的示例。
179.例如,子树可以在构建分层加速结构期间由处理模块306进行平坦化。子树的节点的分支因子影响在通过遍历分层加速结构来执行相交测试时由相交测试模块308执行的相交测试的次数。子树节点的分支因子还影响在光线跟踪单元302和存储器304之间传递的数据量(即,影响存储器带宽)。当数据块具有能够存储固定数量的节点的格式时,其中固定数量大于一,每次将节点添加到所述分层加速结构时,存储器带宽成本并不增加;相反,当我们添加数据块时,存储器带宽成本会增加,因此,在保持内存带宽较低方面,保持每个数据块的平均节点数量较高,例如,接近数据块中能够包括的节点的固定数量可能是有益的。换句话说,填充数据块中的大多数(例如,所有)时隙可能是有益的。
180.如上所述,当确定合适的分支因子时,在减少相交测试的次数与降低存储器带宽之间存在折衷。处理模块306知道数据块的格式,并且可以在确定分层加速结构的节点时,例如在步骤s402中,平衡这种折衷的目标。结果是,靠近分层加速结构的根的节点的分支因子相对较低(例如,对于根节点附近的节点,分支因子可以是二,使得层次体系在根附近是更加二元的),并且分层加速结构的叶附近的节点的分支因子相对较高(例如,叶节点附近的节点的分支因子可以大于二(例如,四或更多),使得层次体系在叶附近更宽)。根附近的节点对执行的相交测试的数量具有最大的影响,因为与在叶附近的节点相比,将测试更多光线与根附近的节点的相交。此外,调度器312可以构建大的光线分组用于针对根附近的节点进行测试,因此存储器带宽不太成问题,因为与提取节点数据相关联的带宽成本可以在大数量光线上进行摊销。因此,就平衡减少相交测试的数量与减少存储器带宽之间的折衷而言,对于根节点附近的节点具有较低的分支因子(例如,二的分支因子)是有意义的。相反,叶附近的节点对执行的相交测试的数量具有最小的影响,因为与在根附近的节点相比,将测试更少光线与叶附近的节点的相交。此外,调度器312可以构建更小的光线分组用于针对叶附近的节点进行测试,因此存储器带宽更成问题,因为与提取节点数据相关联的带宽成本仅可以在较小数量的光线上进行摊销。因此,就平衡减少相交测试的数量与减少存储器带宽之间的折衷而言,对于叶节点附近的节点具有较高的分支因子(例如,四或更大的分支因子)是有意义的。
181.图11a示出了图2b中所示分层加速结构内的子树。图11b示出了由图11a中所示的子树的节点表示的场景内的区域。子树的根节点(节点b)表示区域b’。节点d和e是节点b的子节点,其中节点d表示在区域b’的底部以虚线示出的区域d’,节点e表示在区域b’的左上以虚线示出的区域e’。节点h和i是节点d的子节点,其中节点h表示在区域d’的左侧以点线示出的区域h’,节点i表示在区域d’的右侧以点线示出的区域i’。节点j和k是节点e的子节点,其中节点j表示在区域e’的底部以点线示出的区域j’,节点k表示在区域e’的顶部以点线示出的区域k’。
182.图12a示出了已平坦化之后的图11a的子树,并且图12b示出了由图12a中所示的平坦化子树的节点表示的场景内的区域。省略父节点的过程在本文中被称为“子树平坦化”,因为子树的多个层级塌缩成一个简单列表。在图12a和图12b所示的示例中,节点d和e已被
省略。当省略节点时,被省略节点的子节点成为省略节点的父节点的子节点。应注意,图11a和图12a中的线表示父子关系,而不是存储在数据块中的实际指针。在图12a和图12b中,子树的根节点(节点b)表示区域b’。节点h、i、j和k是节点b的子节点。节点h表示用朝向区域b’的左下方的点线示出的区域h’;节点i表示用朝向区域b’的右下方的点线示出的区域i’;节点j表示用区域b’左侧的点线示出的区域j’;节点k表示用朝向区域b’的左上方的点线示出的区域k’。
183.当基于一次或多次试探生成分层加速结构时,处理模块306可以决定是否将子树平坦化(例如,是否省略节点d和e)。例如,可以使用表面积试探(sah)来估计将针对子树进行的相交测试的预计数量,所述表面积试探(sah)定义为:
[0184][0185]
这个方程可以适于将带宽试探(bwh)定义为:
[0186][0187]
带宽试探(bwh)可用于估计在相交测试期间从存储器提取的数据块的预计数量。在这些方程中,n是子树或分层加速结构中的节点集合,n是集合n中的节点,r是分层加速结构的根节点,a(n)是节点n的表面积,a(n)/a(r)表示假定其命中根节点r的情况下光线命中节点n的概率,c(n)是节点n的子节点的数量,b(n)是打包节点n的子节点所需的数据块的数量。
[0188]
利用这两种试探法(sah和bwh),处理模块306可以将图11a和图12a中所示(即,在有和没有节点d和e的情况下)的子树之间的子树成本(就相交测试次数和存储器带宽而言)进行比较,确定是否更适合省略节点d和e,即是否更适合对子树进行平坦化。
[0189]
在层次体系中所有节点间测量表面积试探(sah)和带宽试探(bwh),但可以在本地评估层次体系的较小变化,因为它们仅影响几个节点的得分。因此,当考虑是否对子树进行平坦化时,节点集合n包括子树的节点就足够了,而不必包括分层加速结构的其它节点。
[0190]
例如,图11a中所示的未平坦化子树的sah可以计算为并且图12a中所示的平坦化子树的sah可以计算为其中节点a是节点b的父节点。因此,如果2a(b)>2a(d)+2a(e)的话,则图12a中所示的平坦化子树的相交测试的估计数量将高于图11a中所示的未平坦化子树。然而,如果2a(b)<2a(d)+2a(e),则图12a中所示的平坦化子树的相交测试估计次数将低于图11a中所示的未平坦化子树。带宽成本取决于在数据块中存储节点的方式。例如,如果节点d和e被存储为如图10a所示的隐含表示的节点,那么对于图11a中所示的未平坦化子树和图12a中所示的平坦化子树,带宽成本将是相同的。处理模块106利用这两种试探法来确定是否使子树平坦化。
[0191]
在本文所述的示例中,子树的平坦化可以动态地执行,例如在渲染的相交测试阶段期间,而不是在渲染的加速结构构建阶段期间。例如,数据块的多层级树格式意味着来自分层加速结构的多个层级的节点是一起接收的,这意味着相交测试模块308可以在运行时执行子树平坦化。具体而言,相交测试模块308可以接收包括特定节点及其所有子节点的子树。相交测试模块308可以动态地决定是否在相交测试期间测试特定节点或是否仅测试该
特定节点的子节点。该决定基于当前系统条件而做出,例如基于光线跟踪系统300中的当前瓶颈,和/或基于如果测试特定节点,节点测试器中的一些是否将空闲。以此方式,可以在运行时期间(即,在相交测试期间)改变正被遍历的子树的拓扑,以适应系统的需求(例如,以适应光线跟踪系统300中的当前条件)。
[0192]
系统中的瓶颈可以严重取决于待测试相交的光线的分布。具体而言,如上所述,相交测试过程通常具有两个瓶颈之一,其限制了可以进行相交测试的速率:(i)存储器带宽是限制因素,例如,可以从待针对光线测试的存储器304检索表示加速结构的部分的数据的速率是限制因素,或(ii)所述相交测试模块308的吞吐量是限制因素,例如,相交测试模块308可以执行相交测试操作的速率是限制因素。这两个因素中的哪一个是限制因素将取决于光线跟踪系统中的条件(例如操作条件)。例如,如果要测试相交的光线是较为相干的,那么将同时测试相对大量的光线与场景中的相同区域的相交;而如果要测试相交的光线较为不相干,那么将同时测试相对较少数量的光线与场景中的相同区域的相交。如果光线在时域接近的时间被提交用于相交测试并且具有相似的起点和相似的方向,那么光线是“相干的”。如果光线是较为相干的,则由调度器312一起被分入分组中待测试与场景中的特定区域相交的光线的数量往往大于所述光线较为不相干的情况。因此,如果光线较为相干,则在每次从存储器304提取节点的节点数据时,要针对节点测试的光线数量比如果光线较不相干时更大。因此,对于较为相干的光线,从存储器304提取节点数据的存储器带宽成本针对每条光线降低,但执行相交测试的测试成本可以独立于光线分布。这样一来,当光线较为相干时,限制因素可能是相交测试模块308的吞吐量,并且在这种情况下,相对较少数量的测试块324在任何给定处理循环中往往会空闲;而当光线较不相干时,限制因素可能是存储器带宽,且在这种情况下,相对较多数量的测试块324在任何给定处理循环中往往空闲。
[0193]
光线跟踪系统300(例如,节点处理逻辑320)可以监测存储器带宽和节点测试器的计算吞吐量,以确定是什么在限制相交测试模块308的吞吐量。借助于该信息,节点处理逻辑320可以作出关于相交测试模块308应测试特定父节点还是完全跳过其的明智决定。如上所述,如果光线不相干,则测试块324可能未被充分利用,因此可以跳过关于特定父节点的测试,并且替代地可以测试其所有子节点。如果特定父节点被测试相交,并且该特定父节点的子节点的节点数据已经从存储器304提取,则测试器时隙中的一些可能已经空闲,因此测试子节点而不是该特定父节点意味着测试进一步零成本地向下推进分层加速结构(即,不产生任何额外延时)。术语“测试器时隙”在本文中用于指代特定处理循环中的测试块324中的一个。相比之下,如果光线是相干的,那么测试器时隙将空闲的可能性较小,并且相交测试模块308的吞吐量很可能是限制因素,因此将需要执行的相交测试的次数减到最少是有益的,因此测试特定父节点以有可能避免必须测试其所有子节点通常是有意义的。
[0194]
监测子系统利用率(例如,通过监测有多少测试块324是空闲的来监测测试块324的利用率)和动态地选择对子树进行平坦化可以改善光线跟踪系统300的性能,而不需要在由处理模块306执行的树构建期间预先了解光线分布。
[0195]
图13是在光线跟踪系统300中执行相交测试的方法的流程图。在步骤s1302中,相交测试模块308(例如,接收逻辑316)接收表示分层加速结构的一部分(例如,如图11a中所示的子树)的数据。此数据是从存储器304接收的。如上所述,子树的节点数据存储在本地存储器318中。
[0196]
在步骤s1304中,相交测试模块308(例如,接收逻辑316)接收待测试与由子树的特定节点表示的区域的相交的一个或多个光线的指示。例如,特定节点可以是图11a中所示的子树的节点d。子树包括特定节点的后裔(例如,子代或孙代)。例如,图11a中所示的子树包括节点h和i,它们是节点d的子节点。如上所述,可以在接收逻辑316处从存储器304或从请求队列314接收待测试与由特定节点表示的区域的相交的光线分组。应注意,接收逻辑316可以被实施为多个不同模块,例如,用于接收表示子树的节点数据的第一模块,以及用于接收指示要测试相交的一个或多个光线的第二模块。
[0197]
在步骤s1306中,节点处理逻辑320基于光线跟踪系统300中的条件确定是否要跳过测试一个或多个光线与所述子树的特定节点表示的区域的相交。换句话说,节点处理逻辑320基于光线跟踪系统300中的条件确定是否通过省略特定节点来使子树平坦化。
[0198]
例如,节点处理逻辑320可以监测所接收的表示分层加速结构的部分的数据量。换句话说,节点处理逻辑320可以监测存储器带宽。此外,节点处理逻辑320可以监测相交测试模块308的测试块324上的处理负载。监测到的从存储器304接收的数据量和监测到的测试块324上的处理负载表示光线跟踪系统300中的条件,可以在步骤s1306中使用所述条件来确定是否要跳过一个或多个光线与由所述子树的特定节点表示的区域相交的测试。
[0199]
在一些示例中,节点处理逻辑320可以通过确定如果测试一个或多个光线与所述子树的特定节点所表示的区域的相交,则相交测试模块308的测试块324中有多少会空闲的指示,并且将确定的指示与阈值进行比较,来确定是否要跳过一个或多个光线与所述子树的特定节点表示的区域的相交测试。例如,阈值可以等于(或大于)小于该特定节点具有的子节点的数量减一。如果测试一个或多个光线与由所述子树的特定节点表示的区域相交而空闲的测试块324的数量高于阈值,则可以跳过特定节点的测试,并且可以替代地测试特定节点的子节点。例如,节点d有两个子节点(节点h和i)。如果节点处理逻辑320确定如果在特定处理周期中测试节点d的相交,则测试块324中的一个或多个在该特定处理周期期间将空闲,则可以跳过关于节点d的测试,并且可以转而测试节点h和i的相交。这允许相交测试过程零成本地在子树上向下推进。
[0200]
节点处理逻辑320做决定所基于的光线跟踪系统的条件在不同的实施方式中可以是不同的,并且可以包括以下中的一者或多者:
[0201]
待测试与由所述子树的特定节点表示的区域相交的光线的数量;
[0202]
待测试相交的光线的相干水平;
[0203]
相交测试模块的测试块上的处理负载;
[0204]
测试队列322中的工作量;
[0205]
所述相交测试模块的测试块数量;以及
[0206]
从存储器304接收的数据量。
[0207]
根据所述确定,使用相交测试模块308的测试块324中的一个或多个,(在步骤s1312或s1314中)对一个或多个光线执行相交测试。如果不跳过对特定节点(例如,节点d)的测试,则方法从步骤s1308前进到s1312。步骤s1308和s1312之间是步骤s1310,如下所述,如果特定节点是隐含表示的节点,则执行所述步骤,但如果特定节点不是隐含表示的节点,则不执行所述步骤。
[0208]
在步骤s1312中,测试块324中的一个或多个测试相应一个或多个光线与所述子树
的特定节点(例如,节点d)表示的区域的相交。如上所述,用于测试光线与区域(例如aabb)相交的方法是本领域已知的,并且这些方法的特异性超出本公开的范围。如果光线与由特定节点(例如,节点d)表示的区域相交,则测试光线与特定节点(例如,节点h和i)的子节点的相交。由于定义由节点h和i表示的区域的节点数据存储在本地存储器318中,因此可以测试光线与子节点(例如,节点h和i)的相交,而无需从存储器304提取进一步数据。如果光线与由特定节点(例如,节点d)表示的区域不相交,则不测试光线与特定节点(例如,节点h和i)的子节点的相交。
[0209]
如果要跳过对特定节点(例如,节点d)的测试,则方法从步骤s1308前进到s1314。在步骤s1314中,测试块324中的一个或多个测试相应一个或多个光线与子树中特定层级的特定节点(例如,节点d)的后裔(例如,节点h和i)表示的区域的相交,从而跳过一个或多个光线与所述子树的特定节点(例如,节点d)表示的区域的相交测试。因此,如果节点处理逻辑320确定要跳过一个或多个光线与所述子树的特定节点表示的区域的相交测试,则不测试一个或多个光线与所述子树的特定节点所表示的区域的相交。
[0210]
在步骤s1312或s1314之后,测试块324可以均向结果处理器326输出它们已经执行的相交测试的结果。结果处理器326处理相交测试的结果。具体而言,如果已经发现光线不与其正在被测试所针对的节点相交,则结果处理器326不为该光线相对于不相交的节点的子节点调度相交测试。如果结果处理器326确定光线已经与其正在被测试所针对的节点相交,那么将该光线从相交测试模块308输出回到调度器312,在这里,该光线将被分组成到分组中,并且被调度以相对于相交节点的子节点进行相交测试。
[0211]
迭代地重复上文参考步骤s1302到s1314所述的过程,直到光线没有更多命中。响应于光线与叶节点相交,该叶节点内的物体(例如,三角形图元)均被调度与该光线进行相交测试。如上所述,相交测试模块308可以包括对象测试块(图3中未示出),其被配置成针对叶节点内的(一个或多个)物体与所述叶节点相交的光线执行相交测试,并且本领域技术人员将知道如何测试光线与三角形图元的相交,因此,本文未详细地描述该过程的细节。如果针对光线的所有相交测试的结果是光线不与场景中的任何物体相交,那么返回“错过”结果,并且可以对其进行相应的处理。如果针对光线的所有相交测试的结果是光线与单个物体相交,那么可以返回此相交的数据以及“命中”结果,并且对其进行相应的处理。如果针对光线的所有相交测试的结果是光线与多于一个物体相交,那么比较相交的相交距离(即,从光线原点到交点的距离)以找到“最近命中”,即,最接近光线原点的交点。可以返回这一最近命中相交的数据以及“命中结果”并对其进行相应的处理。当确定“命中”结果时,可以由物体测试块确定与相交有关的数据,例如,相交在相交图元上的位置的指示(例如,作为重心坐标)和相交距光线起点的距离的指示。
[0212]
相交测试的结果(例如,命中结果)被传递到处理逻辑310。处理逻辑310执行一个或多个着色器程序以处理相交测试的结果以确定表示场景的图像的渲染值。以此方式,可以确定相交的效果,即,使用相交测试结果来确定表示场景的图像的渲染值。因此,测试一个或多个光线的相交的结果用于确定表示场景的图像的渲染值。
[0213]
在一些示例中,该特定节点是隐含表示的节点。例如,分层加速结构可以包括图14a中所示的节点。图14a示出了不同节点如何存储在数据块中,其中两个正方形表示两个数据块。数据块的格式可以如上文详细描述,例如如上文参考图10a和图10b所述。在图14a
所示的示例中,节点a、d和e是隐含表示的节点。图14b示出了在分层加速结构内的子树已被平坦化之后图14a中所示的分层加速结构。在此示例中,隐含表示的节点d和e已被省略,从而使子树平坦化。
[0214]
在此示例中,如果节点处理逻辑在步骤s1306中确定不跳过一个或多个光线与隐含表示的节点d和e所表示的区域相交的测试,则方法从步骤s1308进行到步骤s1310,其中,节点处理逻辑320从接收的数据推断定义由节点d和e表示的区域的数据。上文详细描述了用于推断定义由隐含表示的节点表示的区域的数据的方法(例如,使用定义由子树中的特定层级的特定节点的后裔(例如子代或孙代)表示的区域的数据)。
[0215]
如果节点处理逻辑在步骤s1306中确定要跳过一个或多个光线与隐含表示的节点d和e所表示的区域相交的测试,则不推断定义由节点d和e表示的区域的数据。换句话说,不在步骤s1308中决策的“是”路径上执行步骤s1310。以此方式,如果隐含表示的节点不需要相交测试,则相交测试模块308不推断定义由隐含表示的节点表示的区域的数据。因此,在这种情况下,不存储数据以表示隐含表示的节点(由此减少存储器带宽和用于存储表示分层加速结构的数据的存储器量),且不在相交测试模块308中执行推断隐含表示的节点所涉及的操作,且不在相交测试模块308中执行测试光线与隐含表示的节点所表示的区域的相交所涉及的操作(由此减少由相交测试模块308执行的工作量,这可以减少相交测试模块308的延时和功耗)。
[0216]
图15示出了可以在实现本文描述的光线跟踪系统的计算机系统。计算机系统包括cpu 1502、存储器304、光线跟踪单元302和其他装置1504,诸如显示器1506、扬声器1508和相机1510。计算机系统的部件可通过通信总线1512彼此通信。
[0217]
光线跟踪系统300被示为包括若干功能块。这仅是示意性的,并不旨在定义此类实体的不同逻辑元件之间的严格划分。每个功能块可以任何合适的方式提供。应理解,在本文中被描述为由光线跟踪系统形成的中间值不需要由光线跟踪系统在任何点物理地生成,并且可以仅仅表示方便地描述由光线跟踪系统在其输入与输出之间执行的处理的逻辑值。
[0218]
本文中描述的光线跟踪系统可以包含在集成电路上的硬件中。本文中描述的光线跟踪系统可以被配置成执行本文所描述的任一种方法。一般来讲,上文所述的功能、方法、技术或部件中的任一者可在软件、固件、硬件(例如,固定逻辑电路系统)或其任何组合中实现。本文可以使用术语“模块”、“功能”、“部件”、“元件”、“单元”、“块”和“逻辑”来概括地表示软件、固件、硬件或其任何组合。在软件实现方式的情况下,模块、功能、部件、元件、单元、块或逻辑表示程序代码,所述程序码在处理器上执行时执行指定任务。本文中所描述的算法和方法可以由执行码的一个或多个处理器执行,所述码使处理器执行算法/方法。计算机可读存储介质的示例包括随机存取存储器(ram)、只读存储器(rom)、光盘、闪存存储器、硬盘存储器以及可以使用磁性、光学和其它技术来存储指令或其它数据并且可以由机器存取的其它存储器装置。
[0219]
如本文中所使用的术语计算机程序代码和计算机可读指令是指供处理器执行的任何种类的可执行代码,包含以机器语言、解释语言或脚本语言表达的代码。可执行代码包含二进制代码、机器代码、字节代码、定义集成电路的代码(例如硬件描述语言或网表),以及用例如c、java或opencl等编程语言码表达的代码。可执行代码可以是例如任何种类的软件、固件、脚本、模块或库,当在虚拟机或其它软件环境中被适当地执行、处理、解释、编译、
运行时,这些软件、固件、脚本、模块或库使支持可执行代码的计算机系统的处理器执行由所述代码指定的任务。
[0220]
处理器、计算机或计算机系统可以是任何种类的装置、机器或专用电路,或其集合或一部分,它具有处理能力使得可以执行指令。处理器可以是任何种类的通用或专用处理器,例如cpu、gpu、片上系统、状态机、媒体处理器、专用集成电路(asic)、可编程逻辑阵列、现场可编程门阵列(fpga)等。计算机或计算机系统可以包括一个或多个处理器。
[0221]
本发明还意图涵盖定义如本文中所描述的硬件的配置的软件,例如硬件描述语言(hdl)软件,用于设计集成电路或用于配置可编程芯片以执行所要功能。也就是说,可以提供一种计算机可读存储介质,其上编码有集成电路定义数据集形式的计算机可读程序代码,这种集成电路定义数据集当在集成电路制造系统中被处理(即运行)时,将该系统配置为制造被配置为执行本文所述的任何方法的光线跟踪系统,或者制造包括本文所述的任何装置的光线跟踪系统。集成电路定义数据集可以是例如集成电路描述。
[0222]
因此,可以提供一种在集成电路制造系统中制造如本文所述的光线跟踪系统的方法。此外,可提供一种集成电路定义数据集,其在集成电路制造系统中处理时使制造光线跟踪系统的方法得以执行。
[0223]
集成电路定义数据集可以是计算机代码的形式,例如作为网表,用于配置可编程芯片的代码,作为定义适合于在集成电路中以任何级别制造的硬件描述语言,包括作为寄存器传输级(rtl)代码,作为高级电路表示法(诸如verilog或vhdl),以及作为低级电路表示法(诸如oasis(rtm)和gdsii)。在逻辑上定义适合于在集成电路中制造的硬件的更高级表示法(诸如rtl)可以在计算机系统上处理,该计算机系统被配置用于在软件环境的上下文中生成集成电路的制造定义,该软件环境包括电路元件的定义和用于组合这些元件以生成由该表示法定义的集成电路的制造定义的规则。如通常软件在计算机系统处执行以便定义机器的情况一样,可能需要一个或多个中间用户步骤(例如,提供命令、变量等),以便将计算机系统配置成生成集成电路的制造定义,以执行定义集成电路以便生成所述集成电路的制造定义的代码。
[0224]
现在将参考图16描述在集成电路制造系统处处理集成电路定义数据集以便将该系统配置为制造光线跟踪系统的示例。
[0225]
图16示出了集成电路(ic)制造系统1602的示例,其被配置为制造如本文任一示例中所描述的光线跟踪系统。特别地,ic制造系统1602包括布局处理系统1604和集成电路生成系统1606。ic制造系统1602被配置为接收ic定义数据集(例如,定义如本文的任何示例中描述的光线跟踪系统),处理ic定义数据集,并根据ic定义数据集来生成ic(例如,其体现如本文任何示例中所述的光线跟踪系统)。ic定义数据集的处理配置ic制造系统1602以制造体现如本文任一示例中所描述的光线跟踪系统的集成电路。
[0226]
布局处理系统1604被配置成接收和处理ic定义数据集以确定电路布局。根据ic定义数据集确定电路布局的方法在本领域中是已知的,并且例如可以涉及合成rtl代码以确定要生成的电路的门级表示,例如就逻辑部件(例如nand、nor、and、or、mux和flip

flop部件)而言。通过确定逻辑部件的位置信息,可以根据电路的门级表示来确定电路布局。这可以自动完成或者在用户参与下完成,以便优化电路布局。当布局处理系统1604已经确定电路布局时,其可将电路布局定义输出到ic生成系统1606。电路布局定义可以是例如电路布
局描述。
[0227]
如所属领域中已知,ic生成系统1606根据电路布局定义来生成ic。举例来说,ic生成系统1606可实施生成ic的半导体装置制造工艺,其可涉及光刻和化学处理步骤的多步骤序列,在此期间,在由半导体材料制成的晶片上逐渐形成电子电路。电路布局定义可呈掩模的形式,其可以在光刻工艺中用于根据电路定义来生成ic。替代地,提供给ic生成系统1606的电路布局定义可呈计算机可读代码的形式,ic生成系统1606可使用所述计算机可读代码来形成用于生成ic的合适掩码。
[0228]
由ic制造系统1602执行的不同过程可全部在一个位置例如由一方来实施。替代地,ic制造系统1602可以是分布式系统,使得一些过程可在不同位置执行,并且可由不同方来执行。例如,以下阶段中的一些可以在不同位置和/或由不同方来执行:(i)合成表示ic定义数据集的rtl码,以形成要生成的电路的门级表示;(ii)基于门级表示来生成电路布局;(iii)根据电路布局来形成掩码;以及(iv)使用掩模来制造集成电路。
[0229]
在其他示例中,通过在集成电路制造系统处对集成电路定义数据集的处理,可以将系统配置为制造光线跟踪系统,而无需处理ic定义数据集以确定电路布局。例如,集成电路定义数据集可以定义例如fpga的可重新配置的处理器的配置,并且对所述数据集进行的处理可以将ic制造系统配置成(例如,通过将配置数据加载到fpga)生成具有所述定义的配置的可重新配置的处理器。
[0230]
在一些实施例中,当在集成电路制造系统中处理时,集成电路制造定义数据集可以使集成电路制造系统生成如本文中描述的装置。例如,通过集成电路制造定义数据集以上面参考图16描述的方式配置集成电路制造系统可以导致如本文所述的器件被制造。
[0231]
在一些示例中,集成电路定义数据集可以包括在数据集处定义的硬件上运行的软件,或者与在数据集处定义的硬件组合运行的软件。在图16所示的示例中,ic生成系统可以进一步由集成电路定义数据集配置,以在制造集成电路时,根据在集成电路定义数据集定义的程序代码将固件加载到该集成电路上,或者以其他方式向集成电路提供程序代码以供集成电路使用。
[0232]
与已知的实现方式相比,在本技术中阐述的概念在装置、设备、模块和/或系统中(以及在本文中实现的方法中)的实现方式可以引起性能改进。性能改进可以包括计算性能提高、等待时间缩短、处理量增大和/或功耗降低中的一个或多个。在制造此类装置、设备、模块和系统(例如在集成电路中)期间,可以在性能改进与物理实施方案之间进行权衡,从而改进制造方法。例如,可以在性能改进与布局面积之间进行权衡,从而匹配已知实现方式的性能,但使用更少的硅。例如,这可以通过以串行方式重复使用功能块或在装置、设备、模块和/或系统的元件之间共享功能块来完成。相反,在本技术中阐述的引起装置、设备、模块和系统的物理实现方式的改进(诸如硅面积减小)的概念可以针对性能提高进行权衡。例如,这可以通过在预定义面积预算内制造模块的多个实例来完成。
[0233]
申请人据此独立地公开了本文中所描述的每个单独的特征以及两个或更多个此类特征的任意组合,到达的程度使得此类特征或组合能够根据本领域的技术人员的普通常识基于本说明书整体来实行,而不管此类特征或特征的组合是否解决本文中所公开的任何问题。鉴于前文描述,本领域的技术人员将清楚,可以在本发明的范围内进行各种修改。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1