本申请要求2008年9月10日提交的名称为“用于光线跟踪再现的并行相交测试和描影”的美国临时专利申请第61/095,890号、名称均为“光线跟踪系统架构和方法”的2009年7月28日提交的美国临时申请第61/229,258号和2009年7月29日提交的美国临时申请第61/229,705号、以及2009年9月8日提交的名称为“光线跟踪系统架构和方法”的美国专利申请第12/555,766号的优先权,出于全部目的,以引证方式将以上引用的所有申请的全部内容合并于此。
具体实施方式
给出以下说明以使得本领域普通技术人员能够制造和使用本发明的各个方面。仅作为例子而给出具体技术、实现和应用的说明。对此处描述的例子的各种修改对于本领域技术人员而言是显而易见的,并且在不脱离本发明的范围的情况下,此处定义的一般原理可以适用于其他的例子和应用。
为了描述清楚起见,例如基元(如三角形的三个顶点的坐标)之类的特定类型对象的数据通常被简单地描述为该对象本身,而不是指代该对象的数据。例如,当指代“光线”时,应理解为表示指代该光线的数据,以及场景中的光线概念。
图1例示了简化的场景布置,在该场景布置中,二维平面175设置在摄像机105与场景150之间,该场景布置包括对象110、115以及灯120。摄像机光线130从光线105发出(其使用描述摄像机特性的程序代码)。通过相交测试确定光线130与对象110相交。光线131从与对象110相关联的测试(例如,描述对象或表面的特性的程序代码和数据)发出。例如,对象110可以具有镜像表面,因而其测试将以光线130在对象110上的入射角生成要进行测试反射的光线131。然后,确定光线131射到对象115上。为了简化起见,与对象115相关联的测试示出为具有与对象110的测试的特性相似的特性,发出光线132以测试光是否以在光线131的路径上传播的角度入射到对象115上。光线132被确定为与光120相交。
图1的例子根据需要而进行了粗略的简化。对更实际的光线跟踪场景增加了计算开销的许多因素包括:要再现的二维表示的分辨率可能非常高,例如是1920x1080像素(超过二百万个像素)的全高清(full HD)分辨率。该场景的各个像素可以具有从与之相关联的摄像机发出的许多光线。因此,这种场景的再现可能涉及:初始地单独对数百万摄像机光线进行测试,然后对从基于与摄像机光线的对象相交而标识出的描影器发出的更多数量的光线进行测试,进而对描影器发出的光线进行测试。
描影器可能涉及大量计算并发出对多种条件进行测试的其他光线。例如,描影器能够执行诸如蒙特卡洛漫射发光的漫射发光测试(diffuse lighting test),其涉及发出用于对环境发光状况进行测试的多条光线。描影器可以发出光线来测试对于场景中已有的光源而言相交点是否被另一对象遮蔽。描影器还能够模拟复杂的材料特性,如皮肤的亚表面散射、反射、折射等。这些功能中的每一个可能涉及发出需要在场景中进行相交测试的光线。因此,复杂场景的全高清高分辨率二维表示可能涉及对数百万或更多的光线进行相交测试。
因此,为了此处的目的,该例子示出了在场景中对光线进行相交测试。如果发现与对象(例如,基元)相交,则可以识别并执行与该对象相关联的描影器。该描影器进而可以发出更多光线进行相交测试。描影器发出的光线的数量和类型通常既取决于相交光线的特性,又取决于描影器实现的效果。
虽然有如此多的光线需要进行相交测试,但不能同时对所有的光线进行相交测试。此外,当考虑再现从开始进行到结束的场景时,在任意给定的时间,由于场景再现本身决定了要对何种光线进行测试,因此,并非要进行跟踪以完成该再现的所有光线都已经被定义。
图2例示了利用光线跟踪技术再现场景时使用的示例性系统200。系统200包括主存储器205,该主存储器205中存储有用于相交描影(intersection shading)(例如描影器码、纹理、过程几何等)的数据206、原始和加速形状元素(例如三角形、三角带、顶点、包围球面(bounding sphere)、轴对准包围盒或k-d树定义等等)以及定义了场景中当前进行相交测试的光线的原本(master copy)数据208。主存储器205与相交处理资源202通信,在相交处理资源202中能够运行所识别出的光线/基元相交的描影器。所示的存储器205与相交处理资源202之间的通信包括用于从存储器205提供相交明暗处理数据206的链路221和用于从存储器205提供基元数据的链路222。
相交处理资源202操作为对相交测试资源210识别出的相交进行描影。相交测试资源210被指令借助于控制器203对光线进行测试。控制器203经由链路225向相交测试资源210提供待测试光线的指示;优选地,控制器203通过提供标识符而指示待测试光线,该标识符可以与存储有对驻留在高速缓存211中的光线进行定义的数据的存储器位置相关。在该优选情形中,从光线定义高速缓存211经由链路228获得/接收待测试光线的定义数据。当前最接近的检测到的基元相交的中间测试结果可以与光线定义数据一起存储在高速缓存211中(即,在一些实现中,光学可能与基元相交,但如果没有按照光线经过该场景的顺序对这些光线进行测试,则在检测到真实的、最接近的相交(其通常是感兴趣的唯一相交)之前,能够检测到较远的相交)。
经由链路224向控制器203指示最接近的可能检测到的相交(如果存在的话)(例如,如果光线不与可以通过链路224或者不可以通过链路指示该光线的任何场景对象相交)。相交测试资源210通过链路220从存储器205接收原始和加速形状数据。
控制器203设置为在相交处理资源202中处理这些可能的最接近的所指示的相交。控制器203接收对由在资源202上执行的描影器创建的要进行相交测试的光线进行定义的数据。在图2中,链路226被示出为接收这种新光线数据,而链路227被示出为提供用于例示对已从链路224提供的特定相交进行描影的信息。链路227可以包括:提供或取得(fetch)代码和定义了描影器的数据,或者指示相交处理资源从存储器205执行这种取得操作。
控制器203还对存储在存储器205中的原本光线定义数据208进行管理,并且还经由链路223在存储器205中存储定义了新光线的数据。存储在存储器205中并对已完成相交测试的光线进行定义的数据由对描影器例示的新光线进行定义的数据代替。
相交测试资源210和相交处理资源202可以在处理平台201上实现,并且可以包括在多线程处理器上执行的线程,或者包括在多核处理器的独立核上执行的线程,或者包括在物理上独立的处理器(各处理器潜在地具有多核)。各线程可以执行来自于从存储器205或从另一个源获得的计算机可执行代码的指令。类似地,存储器205可以实现为可由处理器201通过存储器控制器(未单独例示)访问的动态RAM。可以在多种层级实现高速缓存211,例如由多核处理器中的一个或更多个核拥有的私有或半私有L1高速缓存,以及可以在多个核和/或多个处理器之间共享的L1高速缓存和L3高速缓存。优选地,存储在高速缓存211中的光线定义数据受到保护而不被正常的高速缓存管理算法(例如最近最少使用算法等)盖写。而是,优选地,控制器203对存储在高速缓存211中的光线定义数据进行管理,作为原本光线定义数据208的子集。可以经由链路229从原本数据208更新存储在高速缓存211中的这种光线定义数据。
可以基于高速缓存211、存储器205、相交测试资源210和相交处理资源210的实现来实现所例示的链路220-229。
通常,相交测试资源210执行更固定功能类型的计算,因为其针对形状(通常是原始形状或加速形状元素)对光线进行相交测试,该形状包围了对场景进行定义的基元的所选择的一部分。作为对比,在(相交处理资源202上进行)描影其间要执行的计算类型更为通用,这是因为描影器可以执行多种计算、访问,操控并创建多种数据等。因此,在一些情况下,相交测试资源210可以有利地实现为具有更固定功能的处理,而常常可以在更通用的计算平台上有利地实现资源202。因此,在一些情况下,可以提供相交测试资源210作为具有固定功能的或者能够被编程使得在场景再现其间该编程不经常改变的加速功能、附加卡、协同处理器等。
根据本公开的实现不一定具有示例性系统200中示出的所有特征。例如,在系统200中,通过向相交测试资源210提供与定义了光线的数据分离的光线标识符而指示要进行相交测试的光线,这是可选的。在另外的例子中,取决于具体的实现,并不一定必须或期望实现所例示的多种链路中的所有这些链路。而是,图2示出了能够提供用于进行相交测试的计算资源的系统,因此,这些计算资源生成了检测到的相交的指示。这些相交测试资源能够与对检测到的相交执行描影器的计算资源同时工作。描影器发出用于相交测试的新光线,这些新光线被相交测试资源用于进行测试。
图3包括具有多个测试单元310a-310n以及340a-340n的相交测试资源210的一个例子的框图。加速结构元素被示出为来自于存储部207。加速结构的元件可以由包含在存储器中的定义数据来定义,该存储器还包含定义了场景的基元的数据。
ITU 303还包括集合管理逻辑303和集合缓存器361。集合缓存器361和光线数据211可以存储在(例如)能够从存储器139接收光线数据的存储器340中。集合缓存器361维持与GAD元素相关联的光线参考(ray reference)。集合管理逻辑303基于来自测试单元的相交信息而维持这些集合。集合管理逻辑303还发起从存储器207取得用于光线集合测试的基元和GAD元素。
ITU 303返回所识别出的相交的指示,该指示可以缓存在输出缓存器375中以经由结果接口225最终提供给相交处理资源202。该指示可以包括足以在给定准确度内识别出光线以及被确定为该光线所相交的形状(例如基元)的信息。该准确度可以包括找到了包围一个或更多个基元的给定包围元素与一个或更多个光线相交,但各基元最终尚未执行与这些光线的相交测试。
ITU 303可以视为可通过控制过程或驱动器来调用的功能或工具,该控制过程或驱动为ITU 303提供光线和要执行与该光线的相交测试的几何形状。例如,可以通过驱动器向ITU 303馈送信息,该驱动器一方面可以视为将ITU 303与其他再现进程(例如描影)以及初始光线生成功能进行接口连接的进程。从ITU 303的角度来看,ITU 303不需要知晓提供给它的信息的来源,因为其能够使用提供给它的或者它基于提供给它的其他信息而获得的光线、GAD和基元(或者更普遍的,场景对象)执行相交测试。
如上所述,ITU 303可以控制如何向它提供数据、何时向它提供数据以及向它提供何种数据,使得ITU 303不是被动的,而是例如可以根据进行相交测试的需要而去的光线或几何数据、或者加速数据。例如,可以与足以识别出其中要对光线进行测试的场景的信息一起向ITU 303提供要进行相交测试的大量光线。例如,在给定时间可以向ITU 303提供多于一万(10000)个光线进行相交测试,并且当对这些光线的测试结束时,可以提供(由相交处理资源202提供的)新的光线以使得在ITU 303中正在处理的光线数量大约保持在初始数量,如下所述。随后,在(光线集合缓存器361(参见图3)中的)处理期间,ITU303可以(在逻辑303中)控制光线的临时存储,并且还可以在该处理期间根据需要发起取得GAD的基元和元素。
如上所述,与光线相比,GAD元素和基元在ITU 303中是瞬变的,因为光线标识符维持在缓存器361中并针对GAD元素进行组织,并且还维持定义了光线的数据(光线数据211)以供测试单元310a-310n以及340a-340n使用。在存储器340中可以维持各个缓存器361和光线数据211,该存储器340可以用多种方式物理地实现,例如一组或更多组SRAM高速缓存。
如上所述,逻辑303对存储在存储器340中的光线集合的状态进行跟踪,并确定那些集合准备好进行处理。如图3所示,逻辑303以可通信方式耦合至存储器340,并且能够发起将带测试光线传递至各个所连接的测试单元。
在特定GAD元素可以包围其他GAD元素和基元二者的情况下,ITU 303可以具有用于将其他GAD元素和基元二者提供给各测试单元的数据通道,使得逻辑303能够在测试资源中设置测试光线集合。在这种示例中,由于在GAD元素与基元之间(例如,球形相对于三角形)通常存在形状差异,因此可以从逻辑303提供用于切换测试逻辑或者加载针对测试形状而优化的相交测试算法的指示。
逻辑303可以直接地或者间接地导致向测试单元310a-310n和测试单元340a-340n提供信息。在直接提供的情况下,逻辑303可以向各测试单元提供信息,使得各测试单元可以发起从存储器340取得用于测试的光线数据。虽然逻辑303被例示为与存储器340分离,但出于描述简化的目的,由于逻辑303执行的管理功能大多与存储在存储器340中的数据有关,因此逻辑303可以实现在存储器340的电路内。
此处描述的一些方面的一个优点是能够提高相交测试资源对存储器340的并行访问。由此,增加对存储器340的访问端口数量(优选的是,增加至每测试单元至少一个访问端口)是有利的。下面进一步说明了与这种并行化有关的示例性组织方式。
此外,ITU 303能够与为其提供输入数据或从其接收输出的单元异步地工作。这里,“异步”可以包括在针对先前接收的光线继续进行相交测试期间ITU可以接收另外的光线并开始进行相交测试。此外,“异步”可以包括不需要按照ITU 303对光线的接收顺序来完成对这些光线的相交测试。异步还可以包括ITU 303中的相交测试资源可用于在不针对光线在三维场景中的位置或者叠置于该场景上的调度网格的情况下指派或调度相交测试,或者仅测试具有两代间关系的光线,例如父光线和产生于少量父光线的子光线,或者特定代光线(例如摄像机光线或辅助光线)。
输出缓存器375可以接收所识别出的基元与该基元可能相交的光线的相交的指示。在一个例子中,该指示包括对基元以及与该基元成对的足以识别出该基元所相交的光线的信息的指示。光线的指示信息可以包括对光线列表中的特定光线进行标识的引用(例如索引)。例如,运行在主机上的驱动器可以维持该列表,或者在存储器205中维持该列表。优选的是,存储器205还可以包括存储器340中的所有光线的光线定义数据。然而,该光线识别信息还可以包括在存储器205不包含这种信息的情况下足以重新构建光线的信息(例如光线的来源和方向)。
图4示出了此处能够对系统进行设计和组织的示例性架构的多个方面。示出的架构包括多个相交测试资源(“相交测试器”)405a-405n,各相交测试资源与相应的高速缓存465a-465n耦合,在高速缓存465a-465n中分别存储有光线定义数据466a-466n。相交测试器405a-405n通过数据线460接收要进行相交测试的场景对象,可以通过集合管理器475发起的存储器访问来馈送场景对象。在存储器(例如队列或缓存器)440中可以存储形状以供相交测试器405a-405n使用。
因此,相交测试器405a-405n在本地访问相应存储器中的光线定义数据,并被指示通过从相应的输入缓存器421a-421n接收光线标识符来获得和使用部分这种光线定义数据。可以在实现了决策点413-415的分配逻辑480中提供输入缓存器421a-421n,或者由实现了决策点413-415的分配逻辑480为输入缓存器421a-421n提供服务,在决策点413-415中做出与是否应当向输入缓存器421a-421n中的任意一个添加从集合管理475提供的光线标识符有关的决策。
各个相交测试器405a-405n生成能够提供给集合管理475的结果(如通过结果通道450a-450n所示)。在一些例子中,当这些结果用于光线与加速结构的元素(即,GAD元素)之间的相交时,由集合管理处理这些结果,而如果这些结果用于基元与光线之间的相交时,则可以由集合管理475输出或者转发这些结果。集合管理475维持光线ID与包围接下来将要测试的对象(在相交测试器405a-405n可访问的缓存器440中为该对象提供数据)的相应GAD元素之间的关联。
在一些例子中,缓存器440被集合管理475从主存储器(例如存储器205)发起的DMA事务(transaction)填充。例如,在分级加速结构(hierarchical acceleration structure)的情况下,可以使缓存器440存储作为父加速元素的孩子的形状,针对该父加速元素已经累积了光线集合。当给定集合的光线在高速缓存466a-466n中相等地分配时,实现了最高吞吐量。
当一个高速缓存中存在给定集合的多个光线时,其他的相交测试器可以延后(stall),或者这些相交测试器可以测试下一集合的光线。需要注意的其他方面是,在任意一个队列421a,421b,421c(如集合447所示)中可以存储给定光线集合的多于一个光线ID。在这样的情况下,该队列的ITR可以对这些光线进行测试,并且当结果可用时输出这些结果用于第二次测试(或者另外用于许多后续测试)。
当在相交测试器(例如相交测试器405b)之一中测试了给定集合的多个光线的情况下,该集合的其余结果可以等待一个集合的所有结果汇合起来(assemble),或者当“掉队的”结果可用时对该“掉队的”结果进行传播,而由这些测试器执行其余的测试器。在一些实现中,如下所述,在要求再次进行集合测试同步之前,可以容纳(或设计)最大数量的无序测试。
总之,图4例示了使得与一个或更多个形状相关联的一组光线标识符能够分配到多个测试资源的队列中的系统组织形式,各队列存储有光线数据的子集。各测试资源取得由针对载入到测试资源的形状的各光线标识符而标识出的光线数据。优选的是,可以同时通过所有测试资源顺序的流传输这些形状。这些形状可以标识为从主存储器中的一个地址开始的孩子序列。因此,图4例示了通常针对多个层同时测试的形状的系统组织形式。
图5与其他功能一起示出了在图2-4所示的架构方面的另选透视图。图5的一个高级方面是,相交处理202可以通过提取层501与相交测试210通信。在一些情况下,在提取层501中,执行相交处理的描影器可以实例化要进行相交测试的新光线。可以由在执行描影器的处理资源的上下文中有意义的标识符来标识这些新光线。为了方便起见,这些标识符称为“软件标识符”或“SW标识符”。可以将这些SW标识符与待测试光线的定义数据一起提供给SW ID到HW ID映射器515,该SW ID到HW ID映射器515可以针对这些光线中的每一个生成相应的标识符,该标识符能够用于在对这些光线进行相交测试期间对光线进行标识。光线的SW标识符可以与光线定义数据一起存储,并且当要报告给定光线的相交结果时,可以与相交信息一起报告该光线的SW标识符。可以利用HW ID到SW ID映射器520针对特定HW标识符来标识SW标识符。在其他的例子中,SW ID可以与光线定义数据一起存储在RAM 211中,并且在其他例子中,HW ID可以是SW ID的比特子集,或者可以基于SW ID的算法变换。
然而,在与图4类似的根据架构的系统的上下文中,优选的是,HW光线ID是可选择的,使得相交测试资源能够灵活地确定将特定光线的光线定义数据存储在何处。可以利用该确定操作在存储光线定义数据的不同存储器之间实现负载均衡。根据本例的独立光线标识符策略使得能够针对不同的目的适当地改变光线标识符的大小。例如,可以维持主光线存储器,并在相交测试210中主动地完成对这些光线的子集的相交测试。因此,主存储器中的光线数量可能比正在主动测试的光线数量大许多倍,从而使得标识符能够更长时间地在主存储器中唯一地标识各光线。
该光线标识符方法还提供了一种示例性架构选择,其接受用于存储给定数量光线的更大的总存储器占用(footprint),以获得如下的有益效果,即用于对给定光线分别进行相交测试的总数据移动相对较小。
再参照图5,可以向相交处理(例如描影)和相交测试(即加速结构遍历(traversal)和/或原始相交测试)二者提供几何和加速形状数据207。
从相交测试210返回到相交处理202的结果可以包括对检测到的光线与一个或更多个基元及加速元素的相交的指示。在一些实现中,可以在相交测试的输出(例如输出缓存器375)处收集或缓存光线。缓存可以按多种方式实现,并且可以包括基于多种公共属性对光线进行排序。如前所述,光线可以收集在基于加速元素的集合中,并且还公开了可以使加速元素包围特定的场景对象。在一些例子中,随后可以基于场景对象来收集光线。在一些实现中,该收集策略还使得能够针对公共的描影器来执行光线的收集。
如针对输出缓存器375所示,光线缓存可以实现为使得能够针对公共描影代码执行光线收集。此外,通过在输出缓存器375中收集光线可以在本地(in locality)增加要使用的数据元素,使得顶点属性数据511、纹理数据512和/或均一性数据513可用于给定对象在紧凑的时间帧中对一些光线进行描影。在一些方面中,在收集了与使用这些种类数据的对象相交的光线之后,可以在高速缓存514中载入这样的数据。例如,可以取得更大集合的顶点属性并存储在高速缓存514中用于与一些光线相交的对象。
图6示出了相交测试器(例如,相交测试210)的实现的其他方面。如针对图4所示,可以提供多个相交测试器405a-405n。各测试器可以与相应的缓存器421a-421n接口连接。这些缓存器可以包含光线标识符以及与这些光线标识符所标识的光线的相交测试的对象有关的信息。可以从就绪分组列表(ready packet list)612提供光线标识符,(经由控制631)从分组单元608控制就绪分组列表612。就绪分组列表612可以包含要针对该分组中(由索引或由所包括的数据)标识出的一个或更多个形状进行相交测试的光线标识符的列表。提取点620从就绪分组列表612接收这种分组,并基于哪个本地存储器231a-231n包含各个所标识出的光线的定义数据,在缓存器421a-421n之间分派(split)光线标识符。在一些实现中,提取点620可以基于光线标识符与本地存储器231a-231n中的存储器地址位置的相关性(例如通过掩蔽各光线标识符的特定比特以利用该特定光线的光线定义数据标识出相交测试器)来分派数据(当然,多于一个本地存储器可以存储给定光线的数据)。分组可以引用要进行相交测试的加速数据的元素或基元,通常,首先在分组中引用光线以针对加速元素进行测试,并且最终标识出基元以进行测试。
分组单元608使用系统接口616传送过另一个提取点605,以接收要进行分组和相交测试的其他光线。分组单元608还可以与DRAM 681接口连接,以基于与分组一起包含在就绪列表612中的引用来调度存储器事务,将形状数据传递到相交测试器。
分组单元608在相对于加速结构中的形状维持光线标识符的集合时可以使用集合存储器606,并且在一些情况下,集合存储器606可以被细分为用于存储给定数量光线标识符的固定大小的位置。在集合存储器606可以具有已知大小或可显现(discoverable)大小或可配置大小的情况下,可以容纳并引用已知数量的集合。因此,可以在自由位置列表610中维持对各个这种位置的引用。当从结果列表614中读取结果时,分组单元608将这些结果处理为与所相交的各加速结构元素相关联的集合。这种处理可以包括从返回分组检索得到各个加速元素的标识符,或者由一个或更多个相交测试器405a-405n提供的其他信息。在一些实现中,相交测试器405a-405n可以传送分组以收集给定加速元素的光线相交结果,在其他例子中,各相交测试器可以聚合许多加速元素与一个光线的测试结果,或者一个光线与许多加速元素的测试结果。
因此,相交测试结果经过提取点620传播到结果列表614,而在缓存器421a-421n之间分配在就绪分组列表612中标识出的其他集合的光线。各相交测试器405a-405n可以操作为当能够对另一光线进行相交测试时从其缓存器进行读取。在一些例子中,各缓存器的各条目(entry)可以利用标识出的形状来标识要进行相交测试的光线。如参照图4所公开的,可以从DRAM提供形状数据,并且可以由分组单元608发起提供这种数据。
图7示出了可以存储在就绪分组列表612中的分组705的示例性格式,并且其组成包括分组ID、位置、多个光线标识符、以及形状标识符。优选的是,形状标识符标识出被确定为与分组705的各光线相交的形状,随后,针对标识出与相交的形状(例如加速数据层级的孩子节点)有关的对象,对各标识出的光线进行测试。
当确定分组705开始进行相交测试时,可以针对基于标识出的形状而标识出的各个对象形成单独的分组,并且可以将每个这样的分组提供给各个缓存器421a-421n。在其他例子中,可以将定义了待测试对象的数据提供给相交测试器405a-405n,可以借助于分组中提供的标识符将这些对象中的每一个表示为需要进行测试(例如,标识符中的一些比特可以保持不变,使得只要特定数量的比特(例如有效位)匹配,则可以将给定对象标识为另一对象的孩子)。
已经参照图6和其他图描述了,分组单元608或其他实体管理集合数据能够在确定利用形状数据测试标识出的一组光线时发起向测试器提供该形状数据。图8例示了由相交测试器405a-405n示例性构成,其中,工作存储器810能够操作用于接收并存储这种形状数据。工作存储器810可以高速缓存这种形状数据用于例如当给定分组标识出了两个或更多个光线(该两个或更多个光线在存储器中被存储为用于一个测试器的光线定义数据)时,利用不同的光线重复地进行测试(参见以上针对图4的讨论)。
如下所述,在实现与利用光线标识符触发在分散的相交测试器中进行光线测试有关的其他方面时,可以使用这种形状数据的存储。
图8例示了测试单元405a的一个例子,该测试单元405a可以包括工作存储器810和测试逻辑820。工作存储器810可以是若干个寄存器,该若干个寄存器包含足以对线段进行与表面的相交测试的信息,或者在其他的实现中工作存储器810可以更复杂。例如,工作存储器810可以存储用于将测试逻辑820配置为对接收的特定形状进行相交测试的指令,并且可以基于接收的数据来检测接收到何种数据。工作存储器810还可以高速缓存检测到的照射(hit),其中,各测试单元被配置为针对几何形状测试光线序列,或者相反;随后,被高速缓存的照射可以作为一个组而输出,如下进一步的说明。例如在根据针对图10A至10B给出的例子的实现中,工作存储器还可以从例如主存储器(205)的存储部接收进入形状数据,并将其存储以供使用。
然而,首先针对图9说明与如何能够对结果进行处理有关的进一步解释。图9示出了包括分组标识符、光线标识符(Rid)和一个或更多个形状命中比特(shape hit bit)的分组格式901。分组格式902示出了分组ID、加速树位置指示符(位置)、光线标识符(rid)和多个形状标识符以及各光线标识符的相应命中/不中信息的指示。
如果用于给出结果的分组格式是根据格式901,则可以实现可选的对与分组ID相关联的形状的查找(903)。例如,当确定开始测试就绪列表612中的分组时,可以使用该分组中指示的形状来标识多个相关(例如孩子)的形状,并且当标识出这些相关的形状时,可以由分组单元608或者由另一个功能单元保留这些相关形状的标识信息。然后,当以类似于分组格式901的格式返回结果时,可以对该仓库进行索引以标识出相关形状。
另选的是,如果例如通过类似于格式902的格式明确的地标识出了这些形状,则可以略过查找操作(903)。在这两种情况中的任意一种情况下,获得了多个形状标识符(905)。各形状标识符可以进行散列操作(hashed)(910),并且可以使用来自散列值的一些比特来索引集合存储器606以标识出与该形状ID相关联的光线集合的多个候选位置。例如,可以将集合存储器606实现为多路交织高速缓存,因此,索引操作能够为与给定散列值相关联的集合提供多个候选位置。然后,可以将形状ID整体与存储在各候选位置的形状ID进行比较以确定该位置是否存储了该形状ID的集合。如果存在匹配的形状ID,则确定该集合是否有空位(free slot),并且如果有空位,则将分组的rid ID添加至该位置。本例是针对具有固定大小的集合(其是优选实现),但也可以可变地改变集合的大小。
如果不存在空位,则回收(evict)集合中被标识为匹配位置之一的一个集合,并且在刚刚驱赶出且现在空余的位置处创建形状ID的集合。
如果不匹配(918),则确定候选位置中的任意一个是否为开放的(923),并且如果候选位置中的任意一个是开放的,则集合在该位置开始(924)。如果不存在空余位置,则回收一个集合(922),并且在该位置开始该新形状ID的集合。因此,在一些示例性方面中,可以基于散列存储器606的标识符的散列值按固定大小的块(chunk)来管理集合存储器606,在该固定大小的块中,集合可以存储在可用集合位置的子集中。可以实现回收策略以确保形状将能够具有针对该形状收集的光线。该回收操作的结果是集合标识信息被置于就绪列表612中。
在一些实现中,可以将回收策略定制为用于实现在场景中对跟踪/遍历光线时可能相关的多个目的。例如,可以实现可采用一个或更多个不同集合选择策略(926)的过载(override)模式925。以下提供了这种策略的例子。过载模式可以使用特定次数,或者响应于特定条件使用过载模式。在其他例子中,不一定明确地决定要改变集合选择模式,而是可以采用一组集合试探法,该组集合试探法包括要在过载模式和正常模式下实现的目的。图10A、10B和图11的多个方面与集合选择策略有关,因此首先对此加以说明。
图10A示出了分组流动格式,期中,时隙T1...T5可用。本例中的新光线分组1001在各时隙中可以标识出多达40个光线,而相交测试资源可以在各时隙中测试多达32个光线,如光线测试1005所示。图10A示出了在时隙T1-T4中提供一系列完整的完全分组1002-1005进行测试的情形。由于该完整的完全分组包含40个光线,因此对4个由40个光线组成的分组进行相交测试要求5个时隙。因此,在时隙5中,没有新光线开始相交测试。
在相交测试的输出具有更深缓存器(例如缓存器421a-421n)的情况下,在相交测试必须开始跟上光线分组接收之前能够接收更多的光线分组。然而,在其他实现中,在使相交测试资源保持饱和的同时,希望光线标识符发送能力相对于光线相交测试容量多余的部分主要用于实现非完全集合的发送。在维持饱和的同时进行非完全集合的发送使得能够实现在相交测试进行期间可以动态改变集合选择/回收策略。
要注意的是,图10A是从提取点620的角度示出的,使得通过提取点620提供分组,但分组单元608不能看到哪些光线是否测试过或者给定集合的各光线分配给了哪个相交测试器。
在图10B中示出了这样的例子,其中示出了同样的5个时隙。在T1中,发送一个40光线分组,并对32个光线进行测试而其余8个光线未测试。图10B进一步例示了可以在T2时隙中接收23光线分组,而对32个光线进行测试。因此,在可测试的40个光线中,可以测试32个而其余8个未测试。在T3中,接收24光线分组,使得32个光线可用于测试,可以在T3中测试所有这些光线。在T4和T5中,接收40光线分组,而在各时隙中测试32个光线,使得可以留下16个光线用于在后续时隙中进行测试。实际上,缓存可以比此处描述的更深,使得即使接收了一些大部分为空的分组,各测试单元的缓存器(例如参见图6)也具有足够的光线标识符进行测试。
图11示出了相交测试器820(图8)的进一步的示例性细节。在所示例子中,相交测试器820可以包括多个测试器1102a-1 102n,每个测试器访问工作存储器810,该工作存储器810存储有定义了多个形状825、826和833的数据。这些形状存储在工作存储器810中作为分组单元608发起的存储器取数据的结果。缓存器421a存储已从通过提取点620分配的多个分组接收的光线标识符。图11进一步示出了由这种光线标识符的选定部分标识出的光线从光线定义数据存储部231a载入各测试器1102a-1102n。如所示,不同测试器1102a-1102n可以针对不同形状测试不同分组的光线。
在一些情况下,各测试器1102a-1102n可以实现为在计算单元上执行的线程。虽然各测试器1102a-1102n可以针对不同形状测试不同光线,但任意测试器1102a-1102n中可以测试的形状和光线优选地基于给定相交测试器(例如405a-405n)是否能够本地访问特定光线的定义数据。此外,由于特定光线通过集合与要进行相交测试的对象相关联,因此可用的光线标识符和形状最终均由分组单元608确定。作为对比,在独立调度的工作上自由执行的一些计算单元将以更随机的方式和更低的效率访问主存储器。
如上所述,根据图4或图6的例子的架构使得能够异步地控制何时提出要进行相交测试的光线,使得实质上增大测试光线所针对的对象数据的本地性(locality),在分组经常可以被填充的相交测试中可能存在这种情况,因为这些示例性架构提供了相交测试光线的延迟(deferral),并且在这些情况下,对象数据经常从主存储器进行流传输,因为可以针对大量对象来测试大量光线。然而,有时希望能够对不完全分组的测试进行调度。
例如,相交测试器可以设计为适应给定大小的集合存储部,这隐含的意思是,例如可以在给定时间存储最大或近似最大的集合,或者可以在更快的存储器中维持最大数量的活动集合。如所述,可以针对加速结构(例如层级结构)的元素来收集光线。在一些实现中,在这种结构中的任意点,可能存在相对高的扇出(fan out)。例如,该结构中的给定节点可以具有接下来要进行相交测试的8、10、16、24或者甚至32个子节点。进而,这些节点的每一个可以具有其自己的子节点。虽然通常希望使光线分散在许多不同的集合中,以增大光线分集(ray diversity)并标识出可以针对公共对象(例如加速元素)测试的更多光线,但这种分散还可能导致创建了要对每一个进行跟踪的过多的集合。
更具体地并参照图12,可以假设针对根节点的孩子(标识为节点1.0-1.n)对许多光线进行相交测试,其中节点1.2被示出为通过边1202连接至根节点,类似地,边1203将节点1.n连接至根节点。图12还示出了加速结构可以是非均质的(heterogeneous),使得直接包围基元的元素可以是其他元素(例如元素1244)的兄弟姐妹。离根节点越近,经常的情况是节点扇出越广泛,如所示,节点1.0具有子节点p.1-p.n,而节点1.n具有子节点q.1-q.n(可以存在许多中间连接节点)。最终,离包围基元的节点越近,加速结构1200越窄。
在本例中,提供了对象节点1210,该对象节点1210包围定义了与不同场景对象相关联的各网格的基元(例如,节点r.1可以包围与一个对象相关联的基元,而节点r.2可以包围与不同对象相关联的基元)。进而,另外地加速元素可以包围给定对象的基元的子集(例如节点r.1的叶1),直到最终到达直接包围这种基元的叶节点(例如叶节点1-T)。
在这种加速结构中,可能希望控制对哪个集合进行相交测试以控制需要形成为这种测试的结果的多个新集合(所述部件集合增长无效)。在一个例子中,可以通过选择离叶节点更近的集合(即使这些集合比离根节点更近的集合更不完全)进行测试来实现这种控制。已经说明了一些分组格式可以包含与在加速结构中对象所关联的内容所在位置有关的信息在一些情况下,该信息可以是根据该集合中累积的光线确定的反弹计数(bounce count)。在其他例子中,该信息可以包括对象标识符信息,其中可以对对象标识符进行计数,使得该数字在加速结构内有意义。然后,可以使用这些数据确定加速结构中的位置,并因此而确定与之相关联的集合是否具有更接近测试完成的光线。
因此,通过选择接近完成的测试集合,相交测试单元能够控制在对树进行遍历期间的扇出度(degree of fan out),并促进集合空间在存储器中的填充(completion)和释放。由于分组可以过度供应相交测试单元,因此在相交测试仍然完全饱和时也可以选择非完全分组(less-than-full packets)。
图13示出了用于实现这种光线跟踪方法的方面的多个方面。图13示出了相交指示处理1302与集合就绪处理1303通信。相交指示处理1302对返回的光线和加速元素的相交的指示进行处理,并且例如可以在分组单元608中实现相交指示处理1302。参照图9也说明了这种处理的示例性方面,并且这种处理的示例性方面包括,在光线标识符的集合之间分配被指示为与加速元素相交的光线。集合就绪处理1303包括,例如通过逐一地和/或聚合地收集与存储器使用有关的统计信息和/或集合的完全度(fullness),可以监视(1304)集合的状态。可以做出与集合存储器是否受到约束(1305)有关的决策,并且如果在未确定约束条件的情况下,可以主要基于集合完全度来测试集合选择1306(虽然并不要求只能仅基于此做出这样的决策)。在检测到约束条件的情况下,还可以基于哪些集合更接近遍历完成来实现集合,在一些例子中包括,集合更接近叶节点,或者更接近感兴趣的加速结构中的另一位置。
随后,任意这样标识出或选择的集合可以被回收或者标记为测试就绪,并且在图8的例子中,可以存储在就绪列表812中。
图14示出了包括光线遍历、光线排序和描影准备的方法的一个方面。图14示出了可以通过加速结构(例如图12的加速结构)来遍历光线。图14还示出了,在一个实现中可以通过可被认为是完成了遍历的包围单元(例如叶节点)对集合的光线进行相交测试。这种元素可以是叶节点,或者可以是加速结构中的另一节点(例如,包围与对象相关联的基元的节点)。在这两种情况的任一情况下,可以基于当前可能最接近的检测到的该光线的相交以及包含该可能的最接近的检测到的相交的对象,对光线进行排序。
应注意的是,由于本说明书包括在最终原始相交测试之前停止遍历的方法,因此尽可能指示出该最接近的相交,因为可能的情形是,光线最终可能错过与加速元素包围的基元相交(即使该光线与该元素相交)。
在1406中,可以确定排序准则。在一个例子中,这种排序准则包括使用语各基元相关联的标识符。在另一个例子中,这种排序准则可以包括,在对相交进行描影时使用和/或执行公共描影器或描影器代码模块的一部分,更一般地,使用和/或执行待访问的公共数据和/或代码。随后,在对相交进行排序时,可以使用该排序准则。还可以采用利用光线标识符来查找光线相交的基元(三角形标识符(Triangle IDentifier,TID))的功能1432,使得可以为光线标识符提供光线相交测试与排序逻辑之间的数据通道,并且可以根据需要提供存储器查找功能以获得所标识出的光线的相交信息。可以从光线定义数据存储部211中进行该查找,该光线定义数据存储部211可以分布在多个相交测试区(例如参见图6)。
在这两种情况的任一情况下,可以基于随后可用的相交(实际和/或可能的相交)在对象关联的缓存器中对相交(或可能的相交)进行排序(1407),可以由排序器实现该排序。缓存器1408、1410和1412被示出为用于接收按对象排序后的相交信息的示例性缓存器,并且这种缓存器可以实现为FIFO、环形缓存器、链表等。其他的实现可以基于与特定代码段(例如描影器)的关联在缓存器中对光线进行排序。在一些实现中,可以使用上述光线跟踪延迟方面来实现在与特定描影器或特定对象相关联的缓存器中对光线进行排序(1407)。在一些情况下,可以为各基元赋予唯一编号,该唯一编号的某部分标识出该基元所属的场景对象,并且可以基于与光线相关联的基元标识符或者基于该编号的场景对象标识部在多种缓存器中队光线进行排序。
缓存器选择器1418可以控制从哪个缓存器得到用于执行描影操作的光线相交信息。缓存器选择器1418可以通过从缓存器1408、1410和1412中选择更完全或最完全缓存器而工作。在一些情况下,缓存器选择器1418可以选择具有其中收集了多于最少数量光线的任意缓存器(收集光线优选地是指收集光线标识符,但也可以包括在缓存器中收集光线的定义数据)。在一些例子中,可以为缓存器1408-1412存储光线标识符(而不是存储用来标识特定相交的所有数据,如原始标识符)的实现方式提供光线结果查找功能1430。
在一个例子中,光线可以由对象收集,并且例如可以在高速缓存1419中加载(1420)和存储与该对象相关联的描影器代码。描影器进一步可以加载(1422)从所选择的缓存器读取的数据中标识出的光线的定义数据。可以在存储器中对与来自所选择的缓存器的光线相关联的对象的顶点属性数据进行分页(1424)。此外,在执行所载入的对象的描影器代码期间,可以采集对光线相交进行描影有用的纹理数据和其他数据。在缓存器1408、1410、1412中维持的集合可以更大,并且在一些情况下,比针对加速结构的节点维持的集合大得多。例如,各缓存器可以存有256、512、1024、1096、2048个或者更多或更少的光线相交指示。
缓存方法可以包括,包含大小相对较小的缓存器段并根据需要将这些较小缓存器段链接成更大的缓存器。其他方法还可以包括,具有多个缓存器大小,并基于构成了要与该缓存器相关联的形状的基元的数量,选择缓存器大小。例如,与1M基元的形状相比,与250K个基元相关联的形状可以与较小的缓存器相关联。可以基于对场景及构成该场景的对象的分析来构造缓存器大小。例如,如果场景分布了许多较小的对象,则可以分配更多的较小缓存器;相反,如果在场景中较大对象比较少,则可以分配更少的较大缓存器。
虽然以上说明了缓存方法,但此处描述的光线排序和收集的多个方面不一定要求这样的缓存。例如,可以在相交测试后不进行中间的缓存就输出已执行了相交确定的多组光线信息。例如,在一些情况下,相交测试资源可以同时测试32、64或更多个光线与基元中所选择的可能涉及同一场景对象(或部分场景对象)的基元的相交。可以将所找到的在该同时测试中相交的任意光线输出为一组而不进行缓存(例如进行缓存以等待与同一对象相交的更多光线)。在其他实现中,可以利用缓存来聚合数百个甚至数千个光线以输出用于描影。
在一些情况下,系统实现可以包括软件或硬件实现的功能,该功能使得能够查找给定光线与何种三角形相交。对于提供这种功能的实现,缓存器不需要与光线或光线标识符一起存储三角形标识符,而是,可以在准备好对光线进行描影时使用光线标识符执行查找。
在上述方面中,优选的是,在使用部分分页顶点数据(和其他数据)对一些光线相交进行描影时,以相对较大的顶点属性片段进行分页并在高速缓存中维持该数据。
上图示出了根据本说明书的系统的方法和结构元素的功能元素。例如,可以借助于根据图2-5的例子的结构和系统来实现测试1404。
图15示出了如何基于对象相交信息或者基于所执行的描影器代码的一部分在更粗(granular)的水平对光线集合进行分组的其他例子。图15示出了相交处理资源202和高速缓存层级1515,该相交处理资源202可以包括多个执行核心(线程)1510a-1510n,而该高速缓存层级1515可以包括多个高速缓存存储器。在本例中,高速缓存层级1515可以包括位于芯片上和/或位于执行核心1510a-1510n所在模块中的多个高速缓存。可以离片(off-chip)地访问其他的存储器1517。相交处理资源202可以在执行核心1510a-1510n中执行描影器代码,并且在该特定例子中示出了作为同一描影器的不同实例的描影器实例1520a和1520b。描影器实例1521也被示出为不同描影器的描影器代码的实例。
调度器1507可以创建聚合点,为了有利于对其他光线集合的描影,在聚合点处可以收集光线以延迟其描影。集合点1522示出了描影调度器1507可以聚合光线以等待执行两个所示描影器实例1520a和1520b(示出了这种描影器代码的入口点)的逻辑图。因此,由于光线被延迟,这些光线被收集到与集合点1522相关联的集合中。当要对所收集的光线进行描影时,可以将在描影时有用的数据分页到高速缓存层级1515中(如参照图14所示)。
图15还示出了描影器可以包括多段代码,并且还可以分支到(branch)和调用其他代码模块。例如,代码1525被示出为在执行描影器实例1520a(而非描影器实例1520b)期间分支到描影器实例1520a的代码。模块1531和1532是诸如可以由描影器调用的漫射发光模块之类的模块的例子。可以由调度器1507来提供集合点,用于收集已经调用了这种模块的描影器实例的光线。例如,集合点1530代表了收集已经调用了模块1532的光线。
如所示,这种调用可以来自于不同描影器代码的实例(此处为实例1520b和实例1521)。一旦针对在集合点1530收集的光线执行了模块1532,描影器就在其正常描影路径上继续进行描影。例如,在完成了模块1532之后,从模块1532收集的光线可以返回执行代码1535,并调用模块1536。类似地,描影器1520a具有两个所采取的支路,在这两个支路中对一些光线执行模块1531,而对其他光线执行模块1532。集合点1530仅适用于模块1532,使得对于取模块1531支路的那些相交,执行代码1533,并最终会合于模块1537处的同一代码路径,对于取模块1532并在会合于1537之前执行代码1534的那些相交而言也是如此。图15仅示例性示出了在调度器1507处可以基于对所提供的模块的调用、基于对存储器中已加载了某些对象或对象的一部分的对象数据的定义区域的访问等,在描影器模块中提供多种集合点。在一个优选的方面中,可以在漫射发光计算的开始就手机光线相交处理,使得能够针对与同一对象的若干部分相交的一些光线继续进行漫射发光计算,并且在其他例子中,可以收集如下的光线,该光线与相同或不同对象的若干部分相交并且其描影器使用漫射发光调用。
以上例子解释了响应于对与基元的相交的检测来排序(一个例子)。除了基于检测到的相交进行排序,在未检测到相交的情况下,各光线还可以与要在其中进行排序的缺省存储仓(bin)或缓存器相关联。该指定存储器仓或缓存器可以是同样与一个或更多个基元或对象或特定代码模块相关联的存储器仓或缓存器,使得一些光线借助于其相应的缺省指派(assignment)而在该处结束,而其他光线由于检测到使得该光线在该处存储或缓存的相交而在该处结束。因此,虽然原型例子是基于检测到的相交进行排序/缓存/进仓,但多个例子也可以提供使得各个光线能够指定缺省指派的功能。API调用使得能够进行光线发射以接受该缺省指派。
这两个例子的方法的组合可以在一个系统中实现。这两个例子的方法的组合可以在一个系统中实现。在图16中示出了可以实现这些方面的系统的例子。
进一步总结如下,根据这些例子的系统能够更广泛地工作以将驱动相交测试间的资源分配到场景结构的其他区域中,并生成更多种类的光线,开始新的摄像机光线。最终,希望测试由所执行的描影器发出的所有光线,但执行顺序可能对再现期间的存储器的使用具有重要影响。
可以在多种计算资源中实现此处描述的任意功能、特征和其他逻辑。计算资源的例子包括线程、核心、处理器一组处理器、虚拟机、固定功能处理单元等。因此,描述了多种途径、方法的多个方面、处理部件等,这种计算功能可以提供用于实现这些功能的装置。此外,可以提供或实现在实现这些实施方式时可以使用的其他功能作为属于一个计算资源或分布在多个计算资源间的进程、线程或任务(例如分布在多个物理计算机资源间的多个线程)。
作为特定例子,用于相交测试的计算资源还可以具有其他进程,例如用于对检测到的相交进行描影的描影进程。作为其他例子,如果一个核心可以支持多线程,则一个进程可以专用于描影而另一个线程可以专用于相交处理。
如上所述,从所定义的优势点角度看来,所述例子可以用于将三维场景转换为其二维表示。该三维场景可以包括物理对象的数据表示。光线相交测试的其他结果可以包括可用于多种应用的对象可视性确定。其他变换包括通过存储根据所定义的方法确定的数据而将计算机可读介质转换为不同状态。
用于准备再现以及再现本身的上述工作流和方法的例子可以在系统1600中实现,该系统1600可以包括多个计算资源1604-1607。计算资源1604-1607可以包括多个处理核心、处理器中的任意一个或更多个,该多个处理核心、处理器中的每一个可以包括固定功能和/或可编程单元。计算资源1604-1607例如还可以包括多线程处理器上的多线程计算。每个计算资源1604-1607可以对与其计算资源集成或分离的相应L1高速缓存1625a-1625n进行读和写访问。可以提供多个L2高速缓存,例如L2高速缓存1630和L2高速缓存1635,并且可以在计算资源之间共享或自用该多个L2高速缓存。可以提供共享的L3高速缓存和/或主工作存储器1640。在该例子中,光线数据1610和形状数据1615可以存储在L3/主存储器1640中,该示例性系统1600可以在一个或更多个应用及场景构建器工作流(例如应用/构建器865)上执行。计算资源可以通过共享总线1601、或使用点对点连接、或通过L2高速缓存1630和1635或L3/主存储器1640中的共享存储器空间彼此通信。
在一个应用中,这些系统和方法可以用在对三维场景的表现的再现中,以供全息成像系统使用。在用于全息成像系统的一个示例性方法中,对给定场景的多个图像进行再现,每个图像来自于一个不同的立体图。在对这些图像进行再现时,每个立体图可以视为要进行相交测试的光线的一个来源。可以将各个立体图的光线收集在一起(而不管其来源,而是针对要执行的相交测试和/或描影的共性)进行相交测试,例如将不同来源的光线及其子孙收集在一起。允许从多个这种来源收集光线使得系统和方法能够一次性建立三维场景,使得这种场景建立分摊到大量的图像再现上。此外,将来自不同来源的待跟踪光线组合起来可以允许更大的相干性和总的处理器利用率。因此,在上面的例子中,在根据本公开形成、输出或处理了了光线集合的情况下,这些光线是来自于多个摄像机位置。例如,可以针对公共加速结构的父节点的子节点测试给定集合的光线。
这些公开内容的另一应用包括确定第一类型数据元素之间的映射,该第一类型数据元素可以在对第二类型数据元素执行计算机实现的进程期间定义,该第二类型数据元素包括可以使用在执行该进程期间在第一类型元素中提供的信息的代码模块。换言之,由于在对多个离散的潜在代码模块的多个离散的潜在输入之间,一个应用包括基于该潜在输入的特性和代码模块的特性来确定哪个代码模块接收哪个输入。在这样的应用中,代码模块可以生成要再次执行确定的其他的潜在输入。因此,在一些这样的应用中,在执行应用本身期间发展或演变出待处理的完整数据集。
通过对比,一些种类的进程可以具有这些进程开始之前指定要采取的全部可能的动作;例如,可以指定如下的代码模块,在执行使用该代码模块的程序或处理之前,接受在该代码模块中用作输入的数据元素的代码模块。然而,在该情况下,在启动该进程之前,甚至在执行该进程期间的任意给定点,要采取哪些动作(或在一个更具体的例子中,要执行的代码模块)以及在何种情况下采取那些动作可能是不确定的。从而,在进程执行的迭代期间,确定这些信息。这样,在一些例子中,在进程开始时,在执行该进程期间使用的全部数据集可以是不确定的。此外,该进程的哪些代码模块(或功能模块)将使用数据集的哪些部分可能是不确定的。在编译时难以对这些进程的并行执行进行细化,这是因为代码模块的执行顺序以及哪些代码模块可以使用哪些输入在该时刻是未知的。
因此,如下的系统和方法是有利的,该系统和方法可以确定和调度对部分数据集的处理,该处理随着进程的执行过程而演进以更好地利用可用的并行化的优点。在一个具体的进程类中,可能有一种类型的数据元素,其中该数据元素的不同实例可以具有不同参数,各参数可以具有不同值。即使存在一个超集,并且可以从该超集中选择与任意给定数据元素相关联的参数,不同的数据元素也可以具有不同的参数。
这些数据元素可以用作代码模块的输入,该代码模块可以使用这些数据元素的参数作为输入,并且这些数据元素还可以实例化新的数据元素作为执行的输出。在实例化数据元素时,通过确定这些数据元素未执行其他代码可以使这些数据元素闭合(closed),或者标识出(并且取决于如何定义该闭合而执行)针对这些数据元素中的每一个要运行的代码的适当部分。
用于执行该进程的初步建立操作包括:建立n维空间,在该n维空间中通过将代码部分(例如一个模块的代码模块或代码部分)与该n维空间结构中的一个或更多个点或位置相关联来使这些代码部分互连或对这些代码部分进行组织(这些代码部分还可以与n维空间中的定义区域相关联,但优选的是,与点相关联,并且说明书中使用本例而无任何限制)。
该n维空间可以细分为包括多个元素的加速结构,其中每个元素建立一个超曲面(为了方便起见,与三维结构中一样,称作表面),该超曲面包围与各代码部分相关联的所选择的相应点。在一些例子中,该加速结构是分级的,即父元素具有子元素(为了便于说明,下面将使用本例,但不要求加速结构中的层级)。通常,父加速元素包围了其孩子所包围的点的超集,但不一定包围子元素本身的所有表面。
定义(或者得到)了多个数据元素,并且可能需要对这些数据元素进行处理。在n维空间中进行搜索以确定为了关闭这些数据元素的处理而要运行的一个或更多个代码模块(在一些更一般的情况下,确定是否针对给定元素执行任意处理)。基于数据元素中指定的准则执行检索,该准则包括一个或更多个参数,这些参数的允许值范围在n维空间中定义了路径或区域。例如,在光线作为数据元素的情况下,参数可以包括在三维空间中指定的来源和方向,该来源和方向在三维空间中定义了直线。类似地,参数可以定义三维对象,例如球体。其他的例子包括点通过空间的任意路径,或二维表面的挤压(extrusion)。超维区域可以借助于n维空间中规则或不规则的边界来定义。该区域可以是连续的或不连续的,例如该区域可以包括n维空间中多个不相交部分的结合。因此,数据元素定义了n维空间中的空间范围,其中n可以是2或更大;该空间范围取决于针对规定数据元素定义的参数和参数的值(此处使用“空间”一词是为了更便于理解,而不是限于工作空间中的维数)。
为了确定要针对给定数据元素运行哪些代码部分(如果存在的话),在由加速结构的元素定义了表面(超表面)的n维空间中对该数据元素的空间范围进行相交测试。由于找到了与加速元素的表面相交的数据元素,因此将这些数据元素收集到与这些加速元素相关联的集合中。
可以在包括能够对不同数据元素与给定表面(作为一个例子)的相交进行测试的多个测试元素(例如线程或专用测试单元)的计算资源中完成该搜索。该计算资源的限制在于其不能同时执行必须要完成的所有相交测试,因此要对该计算资源进行调度。对用于测试的计算资源的分配是基于在集合池中对要执行进一步测试的数据元素的集合进行调度。并非按照数据元素的定义顺序或以往开始测试的顺序对这些数据元素进行测试,而是基于从该池中选择的集合中的成员对数据元素进行测试。数据元素可以同时存在于多个集合中,并且即使在作为一个集合中的成员的测试被延迟的情况下,也可以作为另一个集合的成员进行测试。
一些集合相对于其他集合的延迟提供了要便利的更多集合来加入到具有非完全集合的加速结构内的集合中,使得在通常情况下,能够同时测试来自相对更完全集合的数据元素(集合调度的试探可以包括在一些情况下选择具有其他特性的集合)。在分级加速结构的情况下,接下来利用一个数据元素的集合所关联的加速元素的子加速元素来测试给定数据元素集合。
在进行光线相交测试的情况下,相交结果通常是来自正在测试的光线的来源的最接近相交。然而,对于更一般情况下的由(n维空间中的)数据元素中的参数定义所限定的空间范围的相交测试,可以返回多个结果、所选择的结果、或结果的排序。这样,结果被返回,并且通过提供可对数据元素查询进行格式化的格式,可以指定结果的格式。
这种测试的输出可以包括使用哪些数据元素作为哪些代码部分的输出(或要执行的触发器)的指示。这些数据元素还可以输出为一个集合,使得可以对不同数据元素提供相同或相关代码部分的一些实例。进而,代码部分的输出可以包括要进行规定搜索的其他数据元素。
除了以上说明或与以上说明分离地,对执行代码部分本身的调度可以包括对不同数据元素并行地执行代码部分,使得可以对不同的数据元素同时执行代码的公共部分。此外,可以获取这些代码部分所使用的其他数据(例如除了数据元素本身中可以包括的数据意外的数据)并高速缓存以供使用。
因此,根据上述例子的系统可以实现以下方法,在该方法中,可以对包括多个参数(这些参数的值定义了n维空间中的一个区域)的数据元素与包围了空间中与要执行的代码模块相关联的点(或区域)的超表面进行测试相交。所找到的与这些超表面相交的数据元素可以具有如下数据,该数据可以用作所相交的表面包围的一个或更多个代码模块的输入。在一些例子中,系统可以执行进一步测试以建立给定数据元素定义的区域与给定代码模块所关联的点之间的规定精确度的接近度或相交。优选的是,通过延迟各个数据元素的进一步测试以累积发现与给定超表面相交的一些数据元素,并在所提供的系统资源上调度要测试的其他累积数据元素,从而同时执行对多个数据元素的测试。
可以提供计算机代码和相关联的数据以实现此处说明的方法和其他方面。计算机代码可以包括计算机可执行指令,该计算机可执行指令例如可以是二进制指令、中间格式指令(如汇编语言、固件或源代码)。该代码可以配置或者被配置通用计算机、专用计算机或专用处理设备来执行特定功能或功能组。
任何这样的代码可以存储在计算机可读介质(如固态存储器、硬驱动器、CD-ROM和其他光学存储装置)中,瞬时存储在易失性存储器(例如DRAM)中,或非瞬时存储在SRAM中。
可以提供多种实现,该多种实现可包括互操作硬件、固件和/或软件,该互操作硬件、固件和/或软件也可以具体实现在多种形成因素和设备的任意一种中,包括膝上型计算机、智能电话、小型个人计算机、个人数字助理等。此处描述的功能也可以具体实现在外围卡或附加卡中。作为另一个例子,这种功能还可以实现在单个设备上执行的不同芯片或不同进程之间的电路板上。
例如,根据这些例子的机器可以包括具有特定的固定目的测试单元的相交测试资源,和/或配置有来自计算机可读介质的计算机可读指令的通用计算机,以执行所述的特定相交测试,并对测试的结果进行解释。其他的机器部件包括用于为测试资源提供加速结构并接收测试结果的通信链路。相交测试的机器可以是包括其他输入和输出设备的更大系统的部件,例如用于读取场景描述数据的驱动器、以及用于输出再现场景的显示器或计算机可读介质。例如,该计算机可读介质可以是DVD,并且各场景可以是运动图片的一帧。
在所有的上述例子中,再现的三维场景可以表示真实世界场景的提取或模型,测试的光线还可以表示从位于场景中的灯发出的光能。类似地,使用摄像机还可以表示场景的观察者的优势点(vantage point)。在确定光如何影响场景并最终影响其他应用可消耗的输出时的相交测试结果的输出可以存储在计算机可读介质中,并可以显示给用户。
虽然使用了多种例子和其他信息来说明所附权利要求书范围内的多个方面,但这些例子中的具体特征或布置并未隐含对权利要求书的限制,因为本领域普通技术人员能够使用这些例子得到广泛的应用。此外,虽然以结构特征和/或方法步骤的例子专用的语言描述了一些主题,但应理解的是,所附权利要求书中限定的主题不一定限于这些描述的特征或动作。例如,这样的功能可以分布在与除了此处所述部件以外的部件、附加的部件或更少的部件中,或在与除了此处所述部件以外的部件、附加的部件或更少的部件中执行。而是,公开所述特征和步骤作为所附权利要求书范围内的系统和方法的部件的例子。