CN110827390B - 处理无序不透明和α光线/图元交点的方法 - Google Patents
处理无序不透明和α光线/图元交点的方法 Download PDFInfo
- Publication number
- CN110827390B CN110827390B CN201910490356.0A CN201910490356A CN110827390B CN 110827390 B CN110827390 B CN 110827390B CN 201910490356 A CN201910490356 A CN 201910490356A CN 110827390 B CN110827390 B CN 110827390B
- Authority
- CN
- China
- Prior art keywords
- ray
- primitives
- primitive
- alpha
- intersection
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
- 238000012545 processing Methods 0.000 title claims abstract description 176
- 238000000034 method Methods 0.000 title claims abstract description 149
- 230000005260 alpha ray Effects 0.000 title abstract description 3
- 230000015654 memory Effects 0.000 claims abstract description 292
- 230000001133 acceleration Effects 0.000 claims abstract description 74
- 238000012360 testing method Methods 0.000 claims description 220
- 230000008569 process Effects 0.000 claims description 71
- 238000012800 visualization Methods 0.000 claims description 25
- 238000003860 storage Methods 0.000 claims description 22
- 230000000007 visual effect Effects 0.000 claims description 8
- 238000007726 management method Methods 0.000 description 65
- 230000009466 transformation Effects 0.000 description 42
- 239000000872 buffer Substances 0.000 description 29
- 239000012634 fragment Substances 0.000 description 25
- 230000006870 function Effects 0.000 description 24
- 238000005192 partition Methods 0.000 description 22
- 238000009877 rendering Methods 0.000 description 22
- 239000011159 matrix material Substances 0.000 description 19
- 238000004891 communication Methods 0.000 description 18
- 230000004044 response Effects 0.000 description 17
- 238000006243 chemical reaction Methods 0.000 description 14
- 238000000844 transformation Methods 0.000 description 13
- 230000006399 behavior Effects 0.000 description 12
- 238000004422 calculation algorithm Methods 0.000 description 12
- 238000013507 mapping Methods 0.000 description 12
- 238000007667 floating Methods 0.000 description 11
- 230000008859 change Effects 0.000 description 10
- 238000005286 illumination Methods 0.000 description 10
- 239000004065 semiconductor Substances 0.000 description 10
- 238000013528 artificial neural network Methods 0.000 description 9
- 238000010586 diagram Methods 0.000 description 9
- 230000000694 effects Effects 0.000 description 9
- 239000000463 material Substances 0.000 description 9
- 230000002452 interceptive effect Effects 0.000 description 8
- 239000004926 polymethyl methacrylate Substances 0.000 description 8
- 230000010076 replication Effects 0.000 description 8
- 238000013519 translation Methods 0.000 description 8
- 230000014616 translation Effects 0.000 description 8
- 238000012986 modification Methods 0.000 description 7
- 230000004048 modification Effects 0.000 description 7
- 238000012546 transfer Methods 0.000 description 7
- 230000001131 transforming effect Effects 0.000 description 7
- 230000005540 biological transmission Effects 0.000 description 6
- 230000007246 mechanism Effects 0.000 description 6
- 241001122767 Theaceae Species 0.000 description 5
- 238000004040 coloring Methods 0.000 description 5
- 230000006835 compression Effects 0.000 description 5
- 238000007906 compression Methods 0.000 description 5
- 238000013135 deep learning Methods 0.000 description 5
- 239000000203 mixture Substances 0.000 description 5
- 238000012549 training Methods 0.000 description 5
- 238000010276 construction Methods 0.000 description 4
- 238000013461 design Methods 0.000 description 4
- 238000011161 development Methods 0.000 description 4
- 238000009826 distribution Methods 0.000 description 4
- 230000006872 improvement Effects 0.000 description 4
- 230000003993 interaction Effects 0.000 description 4
- 239000007788 liquid Substances 0.000 description 4
- 238000002156 mixing Methods 0.000 description 4
- 239000007787 solid Substances 0.000 description 4
- 230000003068 static effect Effects 0.000 description 4
- 241000282326 Felis catus Species 0.000 description 3
- 238000007792 addition Methods 0.000 description 3
- 230000001174 ascending effect Effects 0.000 description 3
- 230000003542 behavioural effect Effects 0.000 description 3
- 210000004556 brain Anatomy 0.000 description 3
- 238000005516 engineering process Methods 0.000 description 3
- 210000003128 head Anatomy 0.000 description 3
- 230000000977 initiatory effect Effects 0.000 description 3
- 238000010801 machine learning Methods 0.000 description 3
- 210000002569 neuron Anatomy 0.000 description 3
- 230000003287 optical effect Effects 0.000 description 3
- 238000005457 optimization Methods 0.000 description 3
- 230000001151 other effect Effects 0.000 description 3
- 230000002093 peripheral effect Effects 0.000 description 3
- 238000004088 simulation Methods 0.000 description 3
- 230000001360 synchronised effect Effects 0.000 description 3
- HPTJABJPZMULFH-UHFFFAOYSA-N 12-[(Cyclohexylcarbamoyl)amino]dodecanoic acid Chemical compound OC(=O)CCCCCCCCCCCNC(=O)NC1CCCCC1 HPTJABJPZMULFH-UHFFFAOYSA-N 0.000 description 2
- 229920005372 Plexiglas® Polymers 0.000 description 2
- 238000009825 accumulation Methods 0.000 description 2
- 230000009471 action Effects 0.000 description 2
- 239000008186 active pharmaceutical agent Substances 0.000 description 2
- OFHCOWSQAMBJIW-AVJTYSNKSA-N alfacalcidol Chemical compound C1(/[C@@H]2CC[C@@H]([C@]2(CCC1)C)[C@H](C)CCCC(C)C)=C\C=C1\C[C@@H](O)C[C@H](O)C1=C OFHCOWSQAMBJIW-AVJTYSNKSA-N 0.000 description 2
- 238000013459 approach Methods 0.000 description 2
- 238000013473 artificial intelligence Methods 0.000 description 2
- 230000003190 augmentative effect Effects 0.000 description 2
- 230000002457 bidirectional effect Effects 0.000 description 2
- 230000027455 binding Effects 0.000 description 2
- 238000009739 binding Methods 0.000 description 2
- 230000015572 biosynthetic process Effects 0.000 description 2
- 239000000919 ceramic Substances 0.000 description 2
- 238000004883 computer application Methods 0.000 description 2
- 238000004590 computer program Methods 0.000 description 2
- 238000012937 correction Methods 0.000 description 2
- 230000001934 delay Effects 0.000 description 2
- 238000001514 detection method Methods 0.000 description 2
- 238000006073 displacement reaction Methods 0.000 description 2
- 230000008846 dynamic interplay Effects 0.000 description 2
- 230000007613 environmental effect Effects 0.000 description 2
- 238000011156 evaluation Methods 0.000 description 2
- 239000004744 fabric Substances 0.000 description 2
- 238000001914 filtration Methods 0.000 description 2
- 239000011521 glass Substances 0.000 description 2
- 230000003116 impacting effect Effects 0.000 description 2
- 238000002372 labelling Methods 0.000 description 2
- 239000012464 large buffer Substances 0.000 description 2
- 239000004973 liquid crystal related substance Substances 0.000 description 2
- 239000003550 marker Substances 0.000 description 2
- 239000002184 metal Substances 0.000 description 2
- 230000001537 neural effect Effects 0.000 description 2
- 239000002245 particle Substances 0.000 description 2
- 239000000047 product Substances 0.000 description 2
- 238000005070 sampling Methods 0.000 description 2
- 238000004904 shortening Methods 0.000 description 2
- 239000000758 substrate Substances 0.000 description 2
- 238000003786 synthesis reaction Methods 0.000 description 2
- XYDVHKCVOMGRSY-UHFFFAOYSA-N 4-(4-benzylphenyl)-1,3-thiazol-2-amine Chemical compound S1C(N)=NC(C=2C=CC(CC=3C=CC=CC=3)=CC=2)=C1 XYDVHKCVOMGRSY-UHFFFAOYSA-N 0.000 description 1
- 101000928034 Homo sapiens Proteasomal ubiquitin receptor ADRM1 Proteins 0.000 description 1
- 102100036915 Proteasomal ubiquitin receptor ADRM1 Human genes 0.000 description 1
- 230000004913 activation Effects 0.000 description 1
- 230000002776 aggregation Effects 0.000 description 1
- 238000004220 aggregation Methods 0.000 description 1
- 238000004458 analytical method Methods 0.000 description 1
- 230000004888 barrier function Effects 0.000 description 1
- 238000004364 calculation method Methods 0.000 description 1
- 230000001427 coherent effect Effects 0.000 description 1
- 239000003086 colorant Substances 0.000 description 1
- 238000007796 conventional method Methods 0.000 description 1
- 210000004087 cornea Anatomy 0.000 description 1
- 238000007405 data analysis Methods 0.000 description 1
- 238000013500 data storage Methods 0.000 description 1
- 238000000354 decomposition reaction Methods 0.000 description 1
- 238000003745 diagnosis Methods 0.000 description 1
- 238000002059 diagnostic imaging Methods 0.000 description 1
- 201000010099 disease Diseases 0.000 description 1
- 208000037265 diseases, disorders, signs and symptoms Diseases 0.000 description 1
- 230000035622 drinking Effects 0.000 description 1
- 238000009509 drug development Methods 0.000 description 1
- 238000007876 drug discovery Methods 0.000 description 1
- 230000009977 dual effect Effects 0.000 description 1
- 230000008030 elimination Effects 0.000 description 1
- 238000003379 elimination reaction Methods 0.000 description 1
- 239000005357 flat glass Substances 0.000 description 1
- 230000010354 integration Effects 0.000 description 1
- 239000013067 intermediate product Substances 0.000 description 1
- 238000002955 isolation Methods 0.000 description 1
- 238000011068 loading method Methods 0.000 description 1
- 230000004807 localization Effects 0.000 description 1
- 230000033001 locomotion Effects 0.000 description 1
- 238000004519 manufacturing process Methods 0.000 description 1
- 230000006386 memory function Effects 0.000 description 1
- 239000008267 milk Substances 0.000 description 1
- 235000013336 milk Nutrition 0.000 description 1
- 210000004080 milk Anatomy 0.000 description 1
- 238000000329 molecular dynamics simulation Methods 0.000 description 1
- 238000000302 molecular modelling Methods 0.000 description 1
- 239000000178 monomer Substances 0.000 description 1
- 230000008450 motivation Effects 0.000 description 1
- 238000003062 neural network model Methods 0.000 description 1
- 238000004806 packaging method and process Methods 0.000 description 1
- 238000001558 permutation test Methods 0.000 description 1
- 230000002085 persistent effect Effects 0.000 description 1
- 235000021110 pickles Nutrition 0.000 description 1
- 235000021178 picnic Nutrition 0.000 description 1
- 238000007781 pre-processing Methods 0.000 description 1
- 238000013138 pruning Methods 0.000 description 1
- 230000003252 repetitive effect Effects 0.000 description 1
- 238000011160 research Methods 0.000 description 1
- 230000011664 signaling Effects 0.000 description 1
- 238000000638 solvent extraction Methods 0.000 description 1
- 238000000547 structure data Methods 0.000 description 1
- 230000009182 swimming Effects 0.000 description 1
- 230000007704 transition Effects 0.000 description 1
- XLYOFNOQVPJJNP-UHFFFAOYSA-N water Substances O XLYOFNOQVPJJNP-UHFFFAOYSA-N 0.000 description 1
Abstract
本发明提供了一种处理无序不透明和α光线/图元交点的方法。基于硬件的遍历协处理器提供树遍历操作的加速,其搜索树形数据结构中表示的图元与光线之间的交点。图元可以包括用于生成虚拟场景的不透明三角形和α三角形。基于硬件的遍历协处理器被配置为确定与光线相交的图元,并将交点信息返回到流式多处理器以进行进一步处理。基于硬件的遍历协处理器被配置为提供相交三角形的确定性结果,而不管存储器子系统返回三角形范围块以进行处理的顺序,同时机会性地消除沿着光线长度比更近的不透明交点位于更远的α交点。
Description
相关申请的交叉引用
本申请涉及以下共同转让的美国专利和专利申请,其全部内容通过引用并入本文:2014年12月8日提交的标题为“树状数据结构的短堆栈遍历(Short Stack Traversalof Tree Data Structures)”的美国申请No.14/563,872;标题为“基于块的层次包围盒(Block-Based Bounding Volume Hierarchy)”的美国专利No.9,582,607;标题为“用于基于块的层次包围盒的相对编码(Relative Encoding For A Block-Based BoundingVolume Hierarchy)”的美国专利No.9,552,664;2015年3月18日提交的标题为“光束追踪(Beam Tracing)”的美国专利No.9,569,559;标题为“基于多个局部坐标系的树状数据结构(Tree Data Structures Based on a Plurality of Local Coordinate Systems)”的美国专利No.10,025,879;2015年6月11日提交的标题为“基于块的几何数据无损压缩(Block-Based Lossless Compression of Geometric Data)”的美国申请No.14/737,343;以及以下与其同时提交的美国申请:
·(卷号:6610-0032/18-AU-0127)标题为“在没有着色器干预下对交点进行连续层次包围盒遍历的方法(Method for Continued Bounding Volume Hierarchy TraversalOn Intersection Without Shader Intervention)”;
·(卷号:6610-0033/18-AU-0128),标题为“用于数据路径调度的高速缓存请求的有效分组方法(Method for Efficient Grouping of Cache Requests for DatapathScheduling)”;
·(卷号:6610-0034/18-SC-0141)标题为“鲁棒且高效的多处理器-协处理器接口(Query-Specific Behavioral Modification of Tree Traversal)”;
·(卷号:6610-0035/18-SC-0144)标题为“树遍历的查询特定行为修改(Query-Specific Behavioral Modification of Tree Traversal)”;
·(卷号6610-0036/18-SC-0145)标题为“保守水密光线三角形相交口(Conservative Watertight Ray Triangle Intersection)”;以及
·(卷号6610-0039/18-AU-0170)标题为“硬件中树遍历机制的前向进展和可编程超时的方法(Method for Forward Progress and Programmable Timeouts of TreeTraversal Mechanisms in Hardware)”。
技术领域
本技术涉及计算机图形,并且更具体地涉及光线追踪器。更具体地,该技术涉及计算机图形处理的硬件加速,包括但不限于光线追踪。更具体地,本文的示例性非限制性技术涉及基于硬件的遍历协处理器,其有效地遍历加速数据结构,例如,用于实时光线追踪。更详细地,本文的技术提供了一种改进的基于硬件的遍历协处理器,用于处理无序不透明和α光线-图元交点。改进的基于硬件的遍历协处理器可以被配置为提供相交图元的确定性结果,而不管存储器子系统返回图元范围块以进行处理的顺序,同时机会性地消除比更近的不透明交点位于沿着光线长度更远处的α交点。
背景技术
如果你在你之前环顾视觉场景,你会注意到你看到的一些最有趣的视觉效果是由光线与表面相互作用产生的。这是因为光是我们看到的唯一东西。我们看不到对象-我们看到的是对象反射或折射的光。我们可以看到的大多数对象都反射光(对象的颜色由对象反射哪部分光和吸收哪部分光确定)。闪亮的表面,诸如金属表面、光泽表面、陶瓷、液体表面和其他各种对象(甚至是人眼的角膜)都可以作为镜面反射光的镜子。例如,闪亮的金属表面将以与其碰撞(hit)表面时相同的角度反射光。对象还可以通过防止光线到达相对于光源为对象后面的其他表面来投射阴影。如果你环顾四周,你会注意到反射的数量和种类以及阴影的数量、种类和长度取决于许多因素,包括场景中光的数量和类型。单个点光源(例如单个遥远的灯泡)将产生单次反射和硬阴影。面光源(诸如窗户或光板)产生不同种类的反射高光和更柔和的阴影。多个光通常会产生多个反射和更复杂的阴影(例如,三个分离的点光源将产生三个阴影,这些阴影可以根据光相对于对象的位置而重叠)。
如果你在调查场景时移动你的头部,你会注意到反射在位置和形状上发生变化(阴影也一样)。通过改变你的视点,你可以改变你的眼睛检测到的光线的不同角度。这种情况瞬间发生-你移动你的头部则立即改变视觉场景。
喝一杯茶的简单行为是复杂的视觉体验。在你反射房间内的每个光之前,桌子上有光泽的陶瓷杯的各个光泽表面,杯子为每个光投下阴影。杯子中茶的移动表面本身是反光的。你可以看到茶叶表面上的光的小反射图像,甚至是茶叶表面部分的较小反射,在该处液体向上弯曲以与杯壁相交。杯壁还将阴影投射到杯子中的液体表面上。将杯子举到你的嘴处会导致这些反射和阴影随着你的视点的变化而移动和闪烁,并且随着液体表面因运动而变得波动而移动和闪烁。
我们认为这些复杂的反射和阴影是理所当然的。我们的大脑擅长解码阴影和反射的位置、大小和形状,并将它们用作视觉线索。这部分地是我们如何辨别对象相对于彼此的位置、我们如何区分一个对象与另一个对象以及我们如何了解对象的构成。不同的对象表面反射不同。硬金属的镜面(镜子类型)反射创建反射对象的图像,而粗糙表面的漫反射负责颜色并以更柔和的方式照亮对象。根据光照的类型,阴影可以是柔和的、漫射的或硬的和不同的,阴影的长度和方向将取决于光线相对于对象和我们眼睛的角度。
初学艺术家通常不会尝试显示反射或阴影。他们倾向于绘制没有阴影、没有反射或高光的平面场景。过去的计算机图形也是如此。
在过去的30年中,实时计算机图形已经取得了巨大的进步。随着20世纪80年代功能强大的图形处理单元(GPU)的发展,通过提供3D硬件图形管线,实时响应于用户输入基于纹理映射的多边形图元生成3D图形显示成为可能。这种实时图形处理器建立在称为扫描变换光栅化的技术之上,该技术是从单个点或透视图确定可见性的手段。使用这种方法,三维对象从几何图元构成的表面建模,通常是多边形(诸如三角形)。扫描变换过程建立图元多边形顶点并将其投影到视图平面上,并填充图元边缘内部的点。参见例如Foley,Van Dam,Hughes等,计算机图形:原理与实践(Computer Graphics:Principles and Practice)(第2版,Addison-Wesley 1995和第三版,Addison-Wesley 2014)。
长期以来,硬件一直用于确定每个多边形表面应如何着色和纹理映射,以及光栅化着色的、纹理映射的多边形表面以供显示。典型的三维场景通常由数百万个多边形构成。快速的现代GPU硬件可以实时响应于用户输入有效地处理用于每个显示帧(每1/30或1/60秒)的数百万个图元。得到的图形显示已经用于各种实时图形用户界面,包括但不限于增强现实、虚拟现实、视频游戏和医学成像。但传统上,这种交互式图形硬件尚无法准确地建模和描绘反射和阴影。
一些已经在该基本扫描变换光栅化方法上构建了其他技术,以允许实时图形系统在渲染阴影和反射时实现一定量的真实感。例如,纹理映射有时用于模拟3D场景中的反射和阴影。通常完成其的一种方法是从不同视角变换、投影和光栅化对象,将光栅化结果写入纹理映射,并对纹理映射进行采样以提供反射映射、环境映射和阴影。虽然这些技术已被证明是有用且适度成功的,但它们并不是在所有情况下都能很好地工作。例如,所谓的“环境映射”通常可能需要假设环境距离对象无限远。另外,环境映射对象通常可能无法反射自身。参见例如
http://developer.download.nvidia.com/CgTutorial/cg_tutorial_chapter07.html。
这些限制的结果是因为传统的计算机图形硬件-虽然足够快以实现出色的多边形渲染-但却无法执行精确逼真的反射和阴影所需的光可视化。有些人将反射和阴影的光栅/纹理近似比作AM收音机的视觉等效物。
存在另一种图形技术,其确实执行了用于反射和阴影的物理上真实的可见性确定。它被称为“光线追踪”。光线追踪是在20世纪60年代末开发出来的,并在20世纪80年代得到了改进。参见例如Apple,“一些用于固体的着色机器渲染的技术(Some Techniques forShading Machine Renderings of Solids)”(SJCC 1968)第27-45页;Whitted,“用于着色显示的改进的照明模型(An Improved Illumination Model for Shaded Display)”第343-349页,ACM通讯第23卷第6期(1980年6月);以及Kajiya,“渲染方程(The RenderingEquation)”,计算机图形学(SIGGRAPH 1986会议记录,第20卷,第143-150页)。从那时起,光线追踪已经用于非实时图形应用,例如设计和电影制作。任何看过“多莉去哪儿(FindingDory)”(2016)或其他皮克斯动画电影的人都看到了计算机图形的光线追踪方法的结果-即逼真的阴影和反射。参见例如Hery等人,“在皮克斯处迈向双向路径追踪(TowardsBidirectional Path Tracing at Pixar)”(2016)。
光线追踪是在各种渲染算法中使用的图元,包括例如路径追踪和梅特波利斯(Metropolis)光照传输。在示例算法中,光线追踪通过对穿过场景的光传输进行建模以使用射线光学计算所有全局效果(包括例如来自闪亮表面的反射)来模拟光的物理学。在光线追踪的这种使用中,当光线从可能多个光源到视点穿过三维场景时,可以尝试追踪数百或数千个光线中的每一个。通常,这些光线穿过场景相对于眼睛进行追踪,并针对场景中所有几何形状的数据库进行测试。光线可以从光向前追踪到眼睛,或从眼睛向后追踪到光,或者可以追踪它们以查看从虚拟相机开始以及从眼睛开始的路径是否具有清晰的视线。该测试确定最近的交点(以便确定眼睛可见的是什么)或者从对象表面朝向光源追踪光线以确定空间中是否存在阻止光传输到该点的任何干预。因为光线与现实中的光线相似,所以它们提供了许多真实的效果,使用过去三十年来实现的基于光栅的实时3D图形技术是不可能实现该效果的。因为来自场景内每个光源的每个照射光线在穿过场景中的每个对象时被评估,所以得到的图像看起来好像是在现实中拍摄的。因此,这些光线追踪方法长期以来一直用于专业图形应用,例如设计和电影,其中它们已经成为基于光栅的渲染的主导。
光线追踪的主要挑战通常是速度。光线追踪要求图形系统针对每个帧计算和分析入射到构成场景的每个表面(并且可能由其反射)的数百万条光线中的每一条。过去,这种大量的计算复杂性是不可能实时执行的。
现代GPU 3D图形管线在渲染着色的纹理映射表面处如此快速的一个原因是它们有效地使用了相干性。在传统的扫描变换中,假设所有一切都通过公共图像平面中的公共窗口观察并向下投射到单个有利点。每个三角形或其他图元通过图形管线发送并覆盖一些像素。可以为从该三角形渲染的所有像素共享所有相关计算。因此,对应于穿过窗口的相干视线的像素的矩形图块可以对应于在同一流式处理器中以锁步方式运行的线程组。假设落在三角形边缘之间的所有像素被假设是运行相同着色器的相同材料,并从相同纹理获取相邻的纹素组。相反,在光线追踪中,光线可以在公共点(光源或虚拟相机镜头)处开始或结束,但是当它们在场景中传播并与不同材料相互作用时,它们很快发散。例如,每条光线执行搜索以找到最近的对象。可以执行一些高速缓存和结果共享,但由于每条光线可能会碰到不同的对象,因此GPU传统上利用的、与纹理映射、着色三角形有关的相干性类型不存在(例如,不存在一个共同的有利点、窗口和图像平面用于光线追踪)。这使得光线追踪在计算上比其他图形方法更具挑战性-因此在交互的基础上执行起来要困难得多。
已经进行了许多研究以使得追踪光线的过程更加有效和及时。参见例如,Glassner,光线追踪介绍(Ray Tracing Introduction)(Academic Press Inc.,1989)。因为光线追踪中的每条光线本质上独立于其余光线进行评估,所以光线追踪被称为“令人尴尬地平行”。参见例如等人,实时渲染在章节9.8.2,412页(第三版.CRC出版社2008)。如上所述,光线追踪涉及针对场景中的所有对象和表面有效地测试每条光线。称为“加速数据结构”和相关过程的优化允许图形系统在加速数据结构上使用“分而治之(divide-and-conquer)”的方法来建立光线碰撞的表面以及光线未碰撞的表面。每条光线以个性化的方式遍历加速数据结构。这意味着将更多处理器专用于光线追踪可以提供近乎线性的性能提升。随着图形处理系统的并行性的增加,一些人开始设想可以实时执行光线追踪的可能性。例如,2000年中期在萨尔州大学的工作产生了一个早期的用于交互式光线追踪的专用硬件系统,其为使用几何着色器、顶点着色器和光照着色器提供了一定程度的可编程性。参见Woop等人的“RPU:用于实时光线追踪的可编程光线处理单元(RPU:AProgrammable Ray Processing Unit for Real Time Ray Tracing)”(ACM 2005)。作为另一示例,先进的渲染技术基于源自ARM1的AR250/350渲染处理器阵列开发了“RenderDrive(渲染器驱动)”,并通过自定义管线进行增强,以用于光线/三角形相交和SIMD向量和纹理数学,但没有固定功能遍历逻辑。参见例如
http://www.graphicshardware.org/previous/www_2001/presentations/Hot3D_Daniel_Hall.pdf。
然后,在2010年,NVIDIA利用NVIDIA GPU和其他高度并行架构的高并行度来开发OptiXTM光线追踪引擎。参见Parker等人的“OptiX:通用光线追踪引擎(OptiX:A GeneralPurpose Ray Tracing Engine)”(ACM Transactions on Graphics,Vol.29,No.4,Article66,July 2010)。除了API(应用程序编程接口)的改进之外,OptiXTM提供的一项改进是改进用于查找光线和场景几何形状之间的交点的加速数据结构。这种加速数据结构通常是由光线追踪遍历算法使用的空间或对象分层,以有效地搜索可能与给定光线相交的图元。OptiXTM提供了许多不同的加速结构类型,可供应用程序选择。节点图中的每个加速结构可以是不同的类型,允许高质量静态结构与动态更新的静态结构的组合。
OptiXTM可编程光线追踪管线提供了显着的进步,但是通常仍然无法在相对便宜的计算平台上为复杂的3D场景提供对用户输入的实时交互响应。从那时起,NVIDIA一直在开发用于光线追踪的硬件加速能力。参见例如US9,582,607;US 9,569,559;US20160070820以及US20160070767。
鉴于用于响应于例如用户输入渲染任意复杂度的高质量图像的真实交互式实时光线追踪图形处理系统的巨大潜力,进一步的工作是可能的并且是期望的。
需要在执行光线追踪的组件之间进行有效的动态交互。
在一些情况下,以特定方式报告调查结果可能是有帮助的。例如,假设老板要求员工调查公司夏季野餐的场地。老板列出了她感兴趣的几个标准:某些周末的可用性,成本,方便的位置,充足的停车位,是否有游乐场,是否有游泳池,是否有垒球场等。员工四处打电话,拜访一些这些网站,现在想要向他的老板提供调查结果。
员工应该以什么顺序提供结果?员工访问网站的顺序如何?员工喜欢这些场地的顺序?员工和老板可以进行对话并讨论结果,因此报告的顺序可能并不那么重要。但现在假设老板要求员工写一份总结他的调查结果的报告,以便中层管理人员委员会可以决定场地。现在,员工提供结果的顺序变得更加重要。以随机顺序或仅以员工知道的顺序报告效率较低,可能会造成混淆。
通常,计算机可以按照无法预先预测的顺序执行操作和计算结果。例如,有时处理器需要在完成任务之前等待某个资源(例如,存储器内容)变得可用,但是可能能够在等待时在另一个任务上前进。有时,计算机用于执行任务的最有效算法或过程不是请求任务的顺序,而是仅计算机知道的完全不同的顺序。在诸如计算机图形光线追踪器之类的上下文中尤其如此,其需要处理器遍历可能非常大且复杂的图形(例如层次包围盒)以发现几何形状的哪些部分与光线相交。处理器遍历图形的顺序可能取决于许多变量,包括例如如何构造图形,如何将其存储在存储器中,图形的哪些部分与光线相交,哪些图元范围相关,发现与光线相交的图元的特征,等等。
在设计用于光线追踪着色器和管线以进行通信的更有效方式方面已经做了大量工作。然而,流式多处理器和遍历协处理器之间的有效动态交互是一个复杂的问题,其中进一步的改进是可能的和期望的。
附图说明
图1示出了示例性非限制性光线追踪图形系统。
图2A示出了示例性镜面对象。
图2B示出了包围盒(Bounding Volume)内的示例性对象。
图2C示出了图2B的包围盒的示例性盒细分。
图2D、图2E和图2F示出了包围盒的盒细分的示例性进一步水平,以创建层次包围盒(BVH)。
图2G示出了由图元表面组成的对象的示例部分,在这种情况下是三角形。
图3A-图3C示出了用于确定光线是否穿过包含几何形状的包围盒以及光线是否与几何形状相交的示例性简化光线追踪测试。
图4示出了示例性光线追踪流程图。
图5A-图5C示出了示例性不同的光线-图元相交场景。
图6A和图6B示出了纹理映射如何影响光线-图元相交结果的示例。
图7A和图7B示出了光线实例变换。
图8A示出了示例性非限制性层次包围盒(BVH)。
图8B示出了图形或树状的示例性加速数据结构。
图9示出了包括树遍历单元(TTU)的简化示例性非限制遍历协处理器。
图10A示出了示例性非限制性光线追踪着色管线流程图。
图10B和图10C示出了更详细的光线追踪管线。
图11是用于加速光线-图元相交测试的示例非限制性方法的流程图。
图12A示出了根据本公开的示例性实施例的标识图元范围的多个块0-N。
图12B示出了根据本公开的示例性实施例的结果队列。
图13是用于加速光线-三角形相交测试的示例非限制性方法的流程图。
图14、图15A-图15C、图16A-图16C和图17A-图17D示出了在存储在存储器中的多个块中标识的一系列三角形的返回相交结果的非限制性示例性实施例。
图18示出了用于生成图像的示例性流程图。
图19示出了示例性并行处理单元(PPU)。
图20示出了示例性存储器分区单元。
图21示出了图18的并行处理单元内的示例通用处理集群(GPC)。
图22是由图21的GPC实现的图形处理管线的概念图。
图23和24示出了示例性流式多处理器。
图25是使用图19的PPU实现的处理系统的概念图。
图26展开图25以示出另外的互连设备。
发明内容
本文的技术提供硬件能力,其将光线追踪加速到这样的程度,即它将光线追踪的能力带到游戏和其他交互式实时计算机图形,最初在阴影和反射中实现高效质量并最终实现全局照明。在实践中,这意味着通过相同图形渲染系统上的软件可能达到的数量级的因子或更高的因子来加速光线追踪。
更详细地,示例性非限制性技术提供了用于加速光线追踪的专用硬件。在非限制性实施例中,硬件协处理器(本文称为“遍历协处理器”或在一些实施例中称为“树遍历单元”或“TTU”)加速支持交互式光线追踪的某些过程,包括光线-包围盒相交测试、光线-图元相交测试和光线“实例”变换。
在一些非限制性实施例中,遍历协处理器对加速数据结构执行查询,以用于在潜在大规模并行流式多处理器(SM)上运行的进程。遍历协处理器遍历加速数据结构以发现关于给定光线如何与加速数据结构描述或表示的对象交互的信息。对于光线追踪,与例如在运行不同类型的线程(例如,顶点线程和像素线程)的逻辑管线阶段之间执行一次操作的固定功能单元相比,遍历协处理器是可调用的。
在一些非限制性实施例中,加速数据结构包括递归地封装越来越小的包围盒细分的包围盒的层次(层次包围盒或BVH)。最大容量的包围盒可以称为“根节点”。包围盒的这种层次的最小细分(“叶节点”)包含项目(item)。项目可以是定义对象表面的图元(例如,诸如三角形的多边形)。或者,项目可以是球体,其包含作为项目存在的全新级别的世界,因为它尚未添加到BVH(想想猫身上的衣领魅力来自“黑衣人”,其中包含它里面的整个微型星系)。如果项目包括图元,则遍历协处理器针对图元测试光线,以确定与光线相交的对象表面以及沿着光线可见的对象表面。
遍历协处理器针对宽范围的包围盒执行每条光线的测试,并且可以剔除不与该光线相交的任何包围盒。从界定场景中所有一切的根节点开始,遍历协处理器针对较小(可能重叠)的子包围盒测试每条光线,这又界定了BVH的后代分支。光线跟随光线碰撞其他节点的包围盒的子指针,直到达到BVH的叶或终端节点(盒)。一旦遍历协处理器遍历加速数据结构以到达包含几何图元的终端或“叶”节点,它就执行加速的光线-图元相交测试,其确定光线是否与该图元相交(因此与图元定义的对象表面相交)。光线图元测试可以提供有关与光线相交的图元的附加信息,其可用于确定着色和可视化所需的表面的材料属性。通过加速数据结构的递归遍历使得遍历协处理器能够发现与光线相交的所有对象图元,或者与光线相交的最接近的(从视点的角度看)图元(在某些情况下,它是沿着光线的视点唯一可见的图元)。
遍历协处理器还加速每条光线从世界空间到对象空间的变换,以获得图元的越来越精细的包围盒封装,并减少场景上的那些图元的复制。在场景中不同位置、方向和比例下多次复制的对象可以在场景中表示为实例节点,其将世界空间BVH中的包围盒和叶节点与可以应用于世界空间光线的变换相关联,以将其变换为对象坐标空间,以及表示为指向对象空间BVH的指针。这避免了在世界空间中多次复制对象空间BVH数据,从而节省了存储器和相关的存储器访问。实例变换通过将光线变换为对象空间而不是要求将几何形状或层次包围盒变换为世界(光线)空间来提高效率,并且还与图形处理执行的以使图元可视化的附加的传统光栅化过程兼容。
因此,目前公开的某些非限制性实施例提供了遍历协处理器,3D图形处理管线中的一个或一组流式多处理器SM的新子单元。为了理解遍历协处理器在整体图片中适合的位置,理解大多数或所有现代光线追踪器所采用的算法的一些基本原理可能会有所帮助。但是应该指出的是,本文的技术提供了一种通用能力,用于为在GPU中运行的线程确定沿着指定方向从给定点开始的最近的可见事物,或者两个点之间是否有任何东西。这种能力的一个常见用例是在开始追踪来自已经在三角形上光栅化的点的光线的过程中使用传统扫描变换技术。所公开的技术可以但不一定取代或替代扫描变换技术,并且通常可以增强它并且与扫描变换技术结合使用以增强图像的照片般真实的反射、阴影和其他效果。
光线追踪技术
通常,光线追踪是一种渲染方法,其中光线用于确定场景中各种元素的可见性。光线追踪可用于确定沿光线是否有任何对象可见(例如,测试几何图元上的阴影点与光源上的点之间的遮挡物),并且还可用于评估反射(例如,可以涉及执行遍历以确定沿着视线的最近的可见表面,使得在流式处理器上运行的软件可以评估与被碰撞的内容相对应的材料着色功能-这反过来可以根据相交的对象的材料特性发射一条或更多条附加光线到场景中),以确定沿着光线返回眼睛的光。在经典的Whitted式光线追踪中,光线从视点通过像素网格射入场景,但其他路径遍历也是可能的。通常,针对每条光线,找到最近的对象。然后可以通过将光线从其射到场景中的每个光源并且发现其间是否有任何对象来确定该交点被照亮或处于阴影中。不透明对象阻挡光线,而透明对象则会使光线衰减。其他光线可以从交点产生。例如,如果相交表面是有光泽的或镜面的,则在反射方向上产生光线。光线可以接受相交的第一个对象的颜色,而其又测试阴影的交点。递归地重复该反射过程,直到达到递归限制或后续反弹的潜在贡献低于阈值。也可以在透明固体对象的折射方向上产生光线,并再次递归地评估。参见上文引用的等人。因此,光线追踪技术允许图形系统开发物理上正确的反射和阴影,其不遭受扫描变换技术的限制和伪影。
遍历协处理器
遍历协处理器执行的基本任务是针对场景中的所有图元(在一个实施例中通常是三角形)测试光线,并报告最接近的碰撞(根据沿光线测量的距离)或简单地报告遇到的第一(不一定最近)碰撞,这取决于用例。简捷算法将是O(n)强力搜索。然而,通过预先处理场景几何形状并提前构建合适的加速数据结构,可以将平均情况复杂度降低到O(log n)。在光线追踪中,当使用加速数据结构时,找到光线最接近(或针对阴影任何)交点的时间通常是n个对象的阶数O(log n)。例如,通常用于现代光线追踪加速数据结构的类型的层次包围盒(BVH)通常具有O(log n)搜索行为。
层次包围盒
现代光线追踪器最常使用的加速数据结构是包括嵌入的轴对齐包围盒(AABB)的层次包围盒(BVH)。BVH的叶节点包含要相交测试的图元(例如,三角形)。BVH通常由图形或树形结构数据表示来表示。在这种情况下,遍历协处理器可以称为“树遍历单元”或“TTU”。
给定BVH,光线追踪相当于树搜索,其中光线所访问的树中的每个节点具有用于每个后代分支或叶的包围盒,并且光线仅访问其相应包围盒与光线相交的后代分支或叶。通过这种方式,只有少数图元必须明确地进行相交测试,即那些驻留在与光线相交的叶节点中的图元。在示例性非限制性实施例中,遍历协处理器加速树遍历(包括光线-盒测试)和光线-图元测试两者。作为遍历的一部分,遍历协处理器还可以处理“实例变换”-将光线从世界空间坐标系变换为实例网格(对象空间)的坐标系,例如,以便避免将图元顶点变换到世界空间的计算复杂性。它可以以MIMD(多指令,多数据)方式实现,这意味着在遍历协处理器内部一次独立地处理光线。
示例的非限制性实时交互式光线追踪系统
图1示出了用于使用场景或一个或更多个对象的三维(3D)数据生成图像的示例的实时光线交互式追踪图形系统100。系统100包括输入设备110、一个或更多个处理器120、一个或更多个图形处理单元(GPU)130、存储器140和一个或更多个显示器150。图1中所示的系统可以采用任何形状因素,包括但不限于个人计算机、智能手机或其他智能设备、视频游戏系统、可穿戴虚拟或增强现实系统、基于云的计算系统、车载图形系统,片上系统(SoC)等。
处理器120可以是多核中央处理单元(CPU),其可操作以实时交互式响应于输入设备110而执行应用程序,其输出包括用于在显示器150上显示的图像。显示器150可以是任何种类的显示器,例如固定显示器、头戴式显示器(诸如显示器眼镜或护目镜)、其他类型的可穿戴显示器、手持显示器、车载显示器等。例如,处理器120可以基于从输入设备110(例如,操纵杆、惯性传感器、环境光传感器等)接收的输入执行应用程序,并指示GPU 130生成示出应用程序进展的图像以在显示器150上显示。
基于处理器120上的应用程序的执行,处理器可以发出用于GPU 130的指令,以使用存储在存储器140中的3D数据生成图像。GPU 130包括用于实时加速图像生成的专用硬件。例如,GPU 130能够实时处理用于数千或数百万个图元(多边形)的信息,这是由于GPU能够比传统软件-驱动的CPU更快地执行重复和高度并行的专用计算任务,例如多边形扫描变换。例如,与处理器120不同,其可具有多个核心,具有可一次处理少量软件线程的大量高速缓存存储器,GPU 130可包括数百或数千个处理核心或并行运行的“流式多处理器”(SM)132。
在一个示例性实施例中,GPU 130包括多个可编程流式多处理器(SM)132,以及包括图元引擎134和光栅引擎136的基于硬件的图形管线。GPU130的这些组件被配置为使用称为“扫描变换光栅化”的技术执行实时图像渲染,以在二维显示器150上显示三维场景。在光栅化中,3D场景的几何构建块(例如,点、线、三角形、四边形、网格等)被映射到显示器的像素(通常通过帧缓冲存储器)。
GPU 130将3D模型的几何构建块(即,诸如三角形之类的多边形图元)变换为2D图像的像素,并为每个像素分配初始颜色值。图形管线可以通过定义或调整像素的颜色值来将着色、透明度、纹理和/或颜色效果应用于图像的部分。最终像素值可以经过抗锯齿、过滤并提供给显示器150以供显示。多年来,许多软件和硬件的改进使用光栅化技术以一个或更多个显示器150上的高显示分辨率(例如4096x 2160像素或更高)在实时图形(即每秒30至60帧)所需的帧速率下提高了主观图像质量。
遍历协处理器添加到架构
为了使GPU 130能够以高效的方式实时地执行光线追踪,向GPU提供了耦合到一个或更多个SM 132的遍历协处理器138。遍历协处理器138包括被配置为执行通常在光线追踪算法中利用的操作的硬件组件。遍历协处理器138的目标是将光线追踪中使用的操作加速到这样的程度,即它将光线追踪的能力带到实时图形应用(例如,游戏)中,从而实现高质量的阴影、反射和全局照明。如下面更详细讨论的,遍历协处理器138的结果可以与GPU 130中执行的其他图形相关操作一起使用或作为其替代。
在所示的示例性架构中,称为“遍历协处理器”138的新硬件组件用于加速某些任务,包括但不限于光线追踪。光线追踪是指将光线投射到场景中,并确定该光线是否以及在哪儿与场景的几何形状相交。这种基本的光线追踪可见性测试是计算机图形学中作为各种渲染算法和技术基础的基础图元。例如,光线追踪可以与光栅化和z缓冲一起使用或作为光栅化和z缓冲的替代,用于采样场景几何形状。它还可以用作环境映射和阴影纹理的替代(或与之结合),以产生比通过纹理技术或其他光栅“黑客”实现的更逼真的反射、折射和阴影效果。为了克服可以通过光栅化实现的图像质量的限制,系统100还可以使用光线追踪技术生成整个图像或图像的部分。光线追踪也可以用作基本图元,以精确地模拟基于物理的渲染算法中的光传输,例如路径追踪、光子映射、Metropolis光传输和其他光传输算法。
更具体地,SM 132和遍历协处理器138可以协作,以将光线投射到3D模型中并确定该光线是否以及在何处与模型的几何形状相交。光线追踪直接模拟穿过虚拟环境或场景的光。光线相交的结果与表面纹理、观察方向和/或光照条件一起用于确定像素颜色值。由与遍历协处理器138一起工作的SM 132执行的光线追踪允许计算机生成的图像以与现实世界的照片或视频无法区分的方式捕获阴影、反射和折射。由于光线追踪技术部分地由于需要追踪的大量光线而比光栅化更加计算密集,因此遍历协处理器138能够在硬件中加速该过程的某些计算密集度更高的方面。
在本文的示例非限制性技术中,遍历协处理器138加速光线盒测试和光线图元测试两者。作为遍历的一部分,它还可以处理至少一级实例变换,将光线从世界空间坐标系变换为实例网格的坐标系。在示例非限制性实施例中,遍历协处理器138以MIMD方式完成所有这些操作,这意味着在遍历协处理器内部独立地处理光线一次。
在示例非限制性实施例中,遍历协处理器138作为SM(流式多处理器)132的服务方(协处理器)操作。换句话说,在示例非限制性实施例中,遍历协处理器138不独立地操作,而是遵循SM 132的命令以比SM 132自身执行更有效地执行某些计算密集的光线追踪相关任务。
在所示的示例中,遍历协处理器138通过SM 132指令接收命令并将结果写回SM寄存器文件。对于许多常见用例(例如,具有至多一级实例化的不透明三角形),遍历协处理器138可以服务于光线追踪查询而无需与SM 132进一步交互。更复杂的查询(例如,除了三角形或多级实例化之外涉及经过α测试的三角形、图元),可能需要多次往返。除了追踪光线之外,遍历协处理器138还能够执行更一般的空间查询,其中AABB或两个AABB(我们称之为“波束”)之间的挤压盒(extruded volume)取代光线。因此,虽然遍历协处理器138特别适合于加速与光线追踪相关的任务,但它也可用于执行除光线追踪之外的任务。
除了遍历协处理器138之外,用于支持图1的系统100的示例非限制性技术还为多个单元提供了额外的加速光线追踪增强以及用于BVH构建的大量努力。BVH构建不需要是硬件加速的(尽管在一些非限制性实施例中可以是),而是可以使用在SM 132和/或CPU 120和/或其他开发系统上(例如,在应用程序开发期间)运行的高度优化的软件例程来实现。以下说明描述了遍历协处理器138的软件可见行为、与周围单元(SM 132和存储器子系统)的接口以及作为完整光线追踪解决方案的一部分的附加特征,例如对SM 132组和存储器高速缓存系统的某些增强等。
在示例非限制性实施例中,遍历协处理器138允许快速遍历加速数据结构(例如,BVH)以确定数据结构中的哪些图元(例如,用于生成场景的三角形)与查询数据结构(例如,光线)相交。遍历协处理器138提供与在GPU上运行的软件应用程序中的TTU加速的光线追踪渲染的实践相关的问题的解决方案。本公开的示例性非限制性实施例可以扩展,例如,美国专利No.9,582,607中描述的树遍历单元(TTU)和美国专利No.9,569,559中描述的用于支持中间遍历光线/三角形交点的光束追踪方法。这样,三角形可以由TTU直接处理而不需要SM干预,从而避免了在没有本公开的示例性非限制性实施例的情况下可能需要的频繁的昂贵同步。美国专利No.9,582,607和美国专利No.9,569,559通过引用并入本文。
在示例非限制性实施例中,遍历协处理器138允许快速遍历加速数据结构(例如,BVH)以确定数据结构中哪些图元(例如,用于生成场景的三角形)与查询数据结构(例如,光线)相交。例如,遍历协处理器138可以确定加速数据结构中的哪些三角形与光线相交并且将最接近的不透明碰撞和/或一个或更多个α碰撞返回到SM 132。因为将每个三角形交点的结果返回到SM 132在接口和线程同步方面是昂贵的,因此遍历协处理器138可以从提供给SM 132的结果中省略一些相交的三角形。省略的三角形可以仅包括被证明能够被省略而对可视化虚拟场景没有功能性影响的三角形。
遍历协处理器138可以包括结果队列,用于存储相交图元的交点信息,直到交点结果返回到SM 132。在一些情况下,结果队列可以在图元范围中的所有图元被测试之前用交点填充。当结果队列用结果填充并且标识出附加的相交图元时,遍历协处理器138可以将结果队列中的交点信息返回到SM 132并且从SM 132接收更新的查询以继续测试图元范围以寻找与光线的附加交点。
图元范围可以在存储在存储器中的多个高速缓存线大小的块上展开。在请求测试图元范围以寻找光线-图元交点时,将块提供给遍历协处理器138以进行处理。由于存储器系统140的层次结构,可以将块提供给遍历协处理器138以随机顺序进行处理。一个选项是遍历协处理器138在开始图元相交测试之前接收所有块,以便可以按照它们存储在存储器中的顺序处理这些块。该方法将按照它们存储在存储器中的顺序标识相交的图元,并将确定性结果发送到SM 132。然而,在开始图元相交测试之前等待从存储器140检索所有块是耗时的。可能无法提供实时光线处理所需的处理速度。
在一些示例性非限制性实施例中,遍历协处理器138可以在从存储器140接收块时处理块,而不是等待接收所有块并按存储器中的顺序处理块。然而,按照从存储器接收它们的顺序处理块可能不提供确定性结果。特别地,当按照出存储器的顺序处理三角形时可能不提供确定性结果,并且由于结果队列的小尺寸需要对SM 132进行多次相交结果返回。
例如,如果遍历协处理器138处理相同的查询,则每次可以以不同的顺序向SM 132确定和标识相交的图元,因为每次可以以不同的顺序将块提供给TTU 700。因为SM 132被配置为当接收到相交结果时使用相交结果来执行进一步处理和/或发出附加交点查询,所以当未以确定性的方式提供结果时,SM 132可能无法确保场景中的可靠图像质量和稳定性。
为了产生没有令人讨厌的伪像的稳定图像,遍历协处理器138可以被配置为执行遍历,该遍历在给定光线和图元范围(该图元范围包含跨越多个块的不透明图元和α图元的混合)的情况下产生查询的确定性结果,而不管存储器子系统将这些块返回给协处理器的顺序。示例性非限制性实施例提供遍历协处理器138,其被配置为产生确定性相交结果,而不管存储器140将具有图元的块返回到遍历协处理器132的顺序,同时机会性地从结果中省略可证明能够被省略而对可视化虚拟场景没有功能性影响的图元。确定性结果可以通过以存储的存储器顺序而不是按照它们位于场景中的空间顺序或者按照确定相交的顺序返回一些图元(例如,α图元)的相交结果来提供给SM 132。
遍历协处理器138可以被配置为产生稳定的图像而没有令人反感的伪像,其具有遍历规则,该遍历规则在给定光线和包含跨越多个块的不透明图元和α图元的混合的图元范围情况下产生查询的确定性结果,而不管存储器子系统将这些块返回到遍历协处理器138的顺序如何。
遍历协处理器138可以被配置为执行返回到SM的多个中间遍历以处理α交点,其数量和内容在运行之间不变。如下面将更详细讨论的,改变返回到遍历协处理器138的块的顺序可以产生不透明交点的不同排序,其可以掩盖或不掩盖在相同图元范围内找到的不同α交点集。本申请中公开的遍历协处理器138包括结果队列和用于无序块处理的规则,以确保从图元范围的完成处理产生的副作用在运行之间是一致的。
在示例性实施例中,遍历协处理器138中的交点管理单元可以仅缩短光线并在已经处理了所有块并且已经找到最近的不透明交点之后将结果队列的内容返回到SM。交点管理单元可以被配置为确保出现在最近的不透明交点之前的每个α交点以存储器顺序呈现给SM,因此数量和内容在运行之间不会变化。
在一些示例性实施例中,返回至SM的数量和内容可以根据结果队列条目的数量而变化。如下面将更详细讨论的,本公开的实施例允许结果队列条目的数量和/或标识结果的数量对图像的功能正确性没有影响,并且不会因存储器返回顺序在运行之间变化。
本公开的示例性非限制性实施例在不损害图像质量的情况下改善了光线追踪性能。通过在遍历期间支持加速的光线/三角形相交,TTU能够从流式处理器卸载大量计算并且避免昂贵的同步性能损失。因为实时光线追踪必须提供与实时光栅化一样好或更好的图像质量和稳定性,所以TTU的光线-三角形交点具有水密性、保守性和单击特性,这一点非常重要。本公开的示例性非限制性实施例允许将实时光线追踪应用于采用数百万个三角形的实时游戏中。
遍历加速数据结构
加速光线追踪的好方法是使用加速数据结构。加速数据结构以有助于快速确定特定光线很可能与之相交的对象的哪个部分以及快速地拒绝光线不会与之相交的场景的大部分的方式表示对象或场景的3D模型。层次包围盒(BVH)数据结构是一种类型的加速数据结构,其可以帮助减少要测试相交的数量。BVH数据结构表示具有包围盒的场景或对象,并将包围盒细分为越来越小的包围盒,其终止于包含几何图元的叶节点。包围盒是分层的,这意味着最高级别(level)包含它下面的级别,该级别包含它下面的下一级别,依此类推。在一个实施例中,叶节点可能潜在地与层次包围盒中的其他叶节点重叠。
为了说明层次包围盒如何工作,图2A-图2G示出了递归地细分为越来越小层次的包围盒的茶壶。图2A示出了茶壶对象,图2B示出了包围整个茶壶的包围盒202(在这种情况下是盒子、立方体或长方体)。可以通过其顶点有效地限定的包围盒202提供对象的空间位置的指示,并且通常尺寸略大于对象。
加速结构构造的第一阶段获取所引用几何形状的包围盒。这是通过对对象中的每个几何图元执行包围盒程序来实现的,该包围盒程序返回其输入图元的保守轴对齐包围盒,例如图2B中所示的盒202。使用这些包围盒作为加速结构的基本图元,提供了针对任意用户定义的几何形状(包括单个结构内的几种类型的几何形状)追踪光线的必要抽象。因为在图2B中,包围盒202大于并且完全包含茶壶,不与包围盒相交的光线不能与茶壶相交,尽管与包围盒相交的光线可能或可能不与茶壶相交。因为包围盒202容易由其在3D空间中的顶点的x,y,z坐标定义,并且光线由其在3D空间中的x,y,z坐标定义,所以用于确定光线是否与包围盒202相交的光线-包围盒测试是简单的(尽管可以使用一些变换来调整到不同的坐标系,如下面将解释的)。
图2C示出了细分为较小的内含(contained)包围盒的包围盒202。虽然为了说明的目的而在此示出的细分方案是所谓的8进制细分或“八叉树”,其中每个盒被细分为八个统一尺寸的较小盒,许多其他空间层次和细分方案是已知的,例如二进制树、四进制树、k-d树、二进制空间分区(BSP)树和层次包围盒(BVH)树。参见例如USP 9,582,607。
图2C中所示的每个细分的包围盒可以进一步细分。图2D示出了图2C的细分盒204中的一个被进一步细分以提供额外细分的封装的包围盒。如图2D所示,一些细分的包围盒包括茶壶的部分而一些不包括。不包含茶壶的部分的盒不会进一步细分,因为进一步的细分不提供关于茶壶的进一步空间信息。已经细分的包含茶壶的至少一部分的包围盒可以进一步递归地细分-就像Seuss博士的帽子里的猫回来啦(1958年)的帽子里出现的一连串越来越小的猫一样。包含几何形状的包围盒202内的空间的部分被递归地细分,以允许遍历协处理器138使用盒细分来有效地发现几何形状相对于任何给定光线的位置。可以注意到,虽然盒的空间细分或主动细分是可能的,但许多实现将创建提前定义盒和子盒的层次结构。在这种情况下,构建器通常可以从各个三角形向上构建层次,而不是从整个场景向下构建。向上构建意味着你不需要确定某个细分的盒是否包含任何内容,因为根据定义它包含在盒细分层次中位于其下面的内容。
图2E示出了另外的这样的包围盒204细分为另一个较小的内含包围盒206,该包围盒206在该示例中仅包含茶壶的壶嘴加上茶壶的壁上的另一个表面,并且图2F示出了将包围盒206附加细分为更小的内含细分208,该细分208封装茶壶的壶嘴的末端。取决于构建BVH的方式,可以根据需要不断更进一步细分包围盒208-并且遍历协处理器138使图1系统100能够有效地将BVH向下遍历到任何任意细分级别。递归细分的数量和配置将取决于被建模的3D对象的复杂性和配置以及其他因素,例如期望的分辨率、对象距视点的距离等。
在某些细分级别(对于BVH的不同部分可以是不同级别),遍历协处理器138遇到构成被建模的封装对象的几何形状。使用树的类比,连续的盒细分是树干、分枝、树枝和细枝,并且最终在树的尖端即叶上显示几何形状。在这种情况下,图2G显示了由几何图元的示例性网格定义的茶壶壶嘴的表面。所示的几何图元是三角形,但是可以使用其他几何图元,例如四边形、线条、矩形、二次曲面、补丁或熟悉现有技术的人所知的其他几何图元(在一个实施例中,这样的其他类型的图元可以表示为或变换为三角形)。网格中的几何图元表示被建模的对象的3D表面的形状。此处示出的示例是网格,但是所包围的几何形状可以包括不连续的几何形状,例如可能未连接的粒子。在示例性非限制性实施例中,遍历协处理器138还利用该几何形状加速光线相交测试,以快速确定任何给定光线碰撞哪个三角形。确定光线-图元相交包含将每个图元的顶点的空间xyz坐标与光线的xyz坐标进行比较,以确定图元定义的光线和表面是否占据相同的空间。光线-图元相交测试可能是计算密集型的,因为可能要测试许多三角形。例如,在图2G所示的网格中,仅茶壶的壶嘴由超过一百个三角形组成-尽管在一些实现方式中可以更有效地进一步进行盒细分,从而限制在任何此类“叶节点”到类似16或更少的东西的三角形的数量。
如上所述,光线追踪程序确定场景的什么几何图元与光线相交。然而,由于3D场景中的大量图元,测试每个几何图元的相交可能不是有效或可行的。加速数据结构(例如BVH)允许快速确定哪些包围盒可以被忽略,哪些包围盒可以包含相交的几何图元,以及哪些相交的几何图元对于可视化而言是重要的而哪些不是。
光线相交测试
图3A-图3C示出了应用于包括三角形网格320的图2G包围盒208的光线追踪。图3A示出了包括包围盒310和315的虚拟空间中的光线302。为了确定光线302在网格320中是否与一个或更多个三角形相交,每个三角形可以直接针对光线302进行测试。但是为了加速该过程(因为该对象可以包含数千个三角形),首先针对包围盒310和315测试光线302。如果光线302不与包围盒相交,则它不与包围盒内部的任何三角形相交,并且可以针对该光线忽略包围盒内部的所有三角形。因为在图3A中,光线302未碰撞(miss)了包围盒310,所以不需要对该包围盒内的网格320的三角形进行相交测试。虽然包围盒315与光线302相交,但是包围盒315不包含任何几何形状,因此不需要进一步的测试。
另一方面,如果光线(诸如图3B中所示的光线304)与包含几何形状的包围盒310相交,则光线可能与或可能不与包围盒内的几何形状相交,因此需要对几何形状本身执行进一步的测试以找到可能的相交。因为图3B和图3C中的光线304、306与包含几何形状的包围盒310相交,所以需要执行进一步的测试以确定包围盒内部的任何(以及哪些)图元是否相交。在图3B中,对与图元的相交的进一步测试将指示即使光线304穿过包围盒310,它也不与包围盒所包围的任何图元相交(或者,如上所述,包围盒310可以进一步进行盒细分,以便可以使用包围盒相交测试来揭示光线不与任何几何形状相交,或者更具体地,光线可以与哪些图元相交)。
图3C示出了包围盒310与光线306相交并且包含与光线306相交的几何形状的情况。遍历协处理器138测试光线306和各个图元之间的相交,以确定光线与哪些图元相交。
光线追踪操作
图4是概述遍历协处理器138如上所述与一个或更多个SM 132协作执行的示例性光线追踪操作的流程图。图4的操作由遍历协处理器138和与其交互的SM 132协作执行。因此,遍历协处理器138可以从SM 132接收光线的标识,并且遍历状态列举光线必须穿过的一个或更多个BVH中的一个或更多个节点。遍历协处理器138确定光线与BVH数据结构的哪些包围盒(“光线-complet”测试512)相交,并随后确定光线是否与相交的包围盒中的一个或更多个图元相交以及与哪些三角形相交(“光线-图元测试”520)。在示例性非限制性实施例中,“complets”(压缩小树)指定层次包围盒的根节点或内部节点(即,盒),其具有子项(child),子项是其他complet或每个complet的单个类型的叶节点。
首先,遍历协处理器138检查光线的遍历状态。如果遍历协处理器138保持用于光线的堆栈为空,则遍历完成。如果堆栈顶部存在条目,则遍历协处理器138向存储器子系统发出请求以检索该节点。然后,遍历协处理器138执行包围盒测试512以确定BVH数据结构的包围盒是否与SM 132指定的特定光线相交(步骤512、514)。如果包围盒测试确定包围盒未与光线相交(步骤514中为“否”),则不需要对可视化执行任何进一步测试,并且遍历协处理器138可以将该结果返回到请求SM 132。这是因为如果光线未碰撞包围盒(如图3A中关于包围盒310),则光线将不会碰撞被测试的包围盒内的所有其他更小包围盒以及包围盒包含的任何图元。
如果由遍历协处理器138执行的包围盒测试显示包围盒与光线相交(步骤514中为“是”),则遍历协处理器确定包围盒是否可以细分为更小的包围盒(步骤518)。在一个示例性实施例中,遍历协处理器138本身不一定执行任何细分。相反,BVH中的每个节点具有一个或更多个子节点(其中每个子节点是BVH中的叶或分支)。对于每个子节点,都有一个包围盒和一个指向分支或叶节点的指针。当光线使用遍历协处理器138处理节点时,它正在针对节点的子节点的包围盒测试自身。光线只将堆栈条目推送到其堆栈上,用于那些其代表性包围盒被碰撞的分支或叶。当光线在示例性实施例中获取节点时,它不测试节点的包围盒-它针对节点的子节点的包围盒进行测试。遍历协处理器138按照由光线配置确定的顺序将其包围盒被光线碰撞的节点推送到光线的遍历堆栈上。例如,可以按照节点在存储器中出现的顺序或者按照它们沿着光线的长度出现的顺序或以某种其他顺序将节点推送到遍历堆栈。如果存在包围盒的进一步细分(步骤518中为“是”),则访问包围盒的那些进一步细分,并且对每个得到的细分包围盒执行包围盒测试,以确定哪个细分包围盒与光线相交以及哪个不与光线相交。在该递归过程中,可以通过测试514消除一些包围盒,而其他包围盒可以导致通过遍历协处理器138递归地应用步骤512-518来对越来越进一步的细分进行相交测试。
一旦遍历协处理器138确定与光线相交的包围盒是叶节点(步骤518中为“否”),遍历协处理器执行图元(例如,三角形)相交测试520,以确定光线是否与相交的包围盒中的图元相交以及光线与哪些图元相交。因此,遍历协处理器138执行相交的后代分支节点的深度优先遍历,直到到达叶节点。遍历协处理器138处理叶节点。如果叶节点是图元范围,则遍历协处理器138针对光线测试它们。如果叶节点是实例节点,则遍历协处理器138应用实例变换。如果叶节点是项目范围,则遍历协处理器138将它们返回到请求SM 132。在示例性非限制性实施例中,SM 132可以命令遍历协处理器138执行不同种类的光线-图元相交测试并取决于来自应用程序(或应用程序在其上运行的软件堆栈)的操作报告不同的结果,并由SM中继到TTU。例如,SM 132可以命令遍历协处理器138报告由相交测试揭示的最近的可见图元,或者报告与光线相交的所有图元,而不管它们是否是最近的可见图元。SM 132可以将这些不同的结果用于不同类型的可视化。一旦遍历协处理器138完成处理叶节点,就可以有其他分支节点(先前推送到光线的堆栈上)进行测试。
多个交点
更详细地,如图3C所示,任何给定的光线可以与包围盒内的多个图元相交。给定图元内的光线相交是否对可视化产生影响取决于该图元的属性和位置以及SM 132正在执行的可视化过程。例如,图元可以是不透明的、透明的或部分透明的(即半透明的)。不透明的图元将阻挡光线穿过图元,因为眼睛无法透过图元的不透明表面看到。透明图元将允许光线通过(因为眼睛可以透过透明图元看到),但情况可能更复杂。例如,透明图元可能具有镜面特性,这会导致光线的某些部分反射(考虑来自窗玻璃的反射),光线的其余部分通过。其他透明图元用于提供纹理映射到的表面。例如,树的每个个体的叶可以由透明图元建模,叶的图像被纹理映射到该透明图元上。
图5A-图5C示出了使用三个三角形的示例的一些场景,这三个三角形被假设在相同的包围盒中并且每个三角形与光线相交。图5A示出了朝向这三个三角形的光线,其中光线相对于不透明的视点遇到第一个三角形。因为“前方”(从眼睛的光线方向看)相交的三角形是不透明的,所以三角形将阻挡光线,因此光线也不会到达其他三角形,即使光线在空间上与它们相交。在该示例中,在识别出不透明三角形的相交之后,可以忽略(剔除)从视点看的不透明三角形“后面”的三角形,因为“前”不透明三角形沿着光线隐藏了用户视图中的其他三角形。在图5A-图5C中用虚线表示剔除。在这种情况下,遍历协处理器138可能仅需要向SM 132报告第一不透明三角形的标识。
图5B示出了指向相同三个三角形的光线,但是现在最近的可见三角形是部分透明的而不是不透明的。因为最近的可见相交三角形是至少部分透明的,所以光线可以穿过它以碰撞它后面的不透明三角形。在这种情况下,不透明的三角形将通过部分透明的三角形可见,但会阻挡用户沿着光线的第三三角形的视野。本文,遍历协处理器138可以向SM 132报告两个前面三角形的标识,但是不报告第三个被剔除的三角形,即使光线在空间上与该第三三角形相交。在本文发现顺序可能很重要。在α和不透明三角形的情况下,如果首先发现不透明,则遍历协处理器138将不透明三角形返回到具有遍历状态的SM 132,该遍历状态将在α三角形处重新开始测试。虽然本文暗示α意味着透明,但它实际上意味着“将我返回到SM 132并让SM决定如何处理它。”例如,可以根据纹理或函数修剪α三角形,以便三角形的部分被切掉(即,不存在、不透明)。遍历协处理器138不知道SM132将如何处理α三角形(即,它不处理与修剪的三角形不同的透明三角形)。因此,α三角形可能阻挡或可能不阻挡或着色沿着光线从点到达它们之外的光,并且在示例性实施例中,它们需要SM 132干预来处理/确定那些事物。
图5C示出了光线遇到的前两个三角形是部分透明的场景。因为第一和第二相交三角形是至少部分透明的,所以光线将穿过第一和第二三角形以照射在也相交的第三不透明三角形上。因为第三个相交的三角形是不透明的,它将阻挡光线,并且光线不会照射在第三个三角形后面的任何其他三角形上,即使它们可能在空间上与光线相交。在这种情况下,遍历协处理器138可以将所有三个三角形报告给SM 132,但不需要报告不透明三角形后面的任何其他三角形,因为不透明三角形阻挡光线到达那些附加三角形。
然而,在一些模式中,SM 132可能需要知道与光线相交的所有三角形的身份,而不管它们是不透明的还是透明的。在那些模式中,遍历协处理器138可以简单地执行相交测试并返回光线在空间上与之相交的所有三角形的身份(在这种模式中,遍历协处理器将返回图5A-图5C中所示的所有三种情形的相同相交结果),并允许SM 132对其进行分类-或者在某些情况下命令遍历协处理器138对这些相同的三角形进行更多测试。
如下面将更详细讨论的,当光线与不透明三角形相交时,遍历协处理器138可以在某些操作中被编程以将被测光线的长度减小到不透明三角形相交的位置,因此它将不报告相交三角形“后面”的任何三角形。当确定部分透明三角形与光线相交时,遍历协处理器138将返回光线照射到的更完整的三角形列表以用于可视化,并且请求SM 132可以执行进一步处理以基于例如三角形的任何纹理或其他属性确定光线是否将被阻挡、传递或部分传递以及部分反射。在示例性实施例中,遍历协处理器138不能访问三角形的纹理属性,因此不会尝试确定关于那些属性的可视化。
纹理或其他表面修改
例如,图6A和图6B示出了透明三角形610,其具有应用于三角形的叶的纹理615。人们可以想到一个由树脂玻璃制成的三角形,上面有一片叶贴花。如图6A所示,光线620在所施加的纹理615之外的点处与透明三角形610相交。因为光线620与所施加的纹理615外部的三角形相交,所以纹理将不会阻挡光线620并且光线将会不受阻挡地穿过透明三角形610。这就像是能够透过未经叶贴花覆盖的树脂玻璃三角形的部分看到。注意,在一个示例性实施例中,SM 132进行可见性确定,因为遍历协处理器138不一定能够访问关于叶贴花的信息。遍历协处理器138通过向SM返回光线与之相交的三角形的识别以及关于该三角形的属性的信息来帮助SM 132。
在图6B中,光线630与施加纹理615的透明三角形相交。SM 132将基于纹理615将阻挡光线630还是允许光线630通过来确定遍历协处理器138的后续遍历是否是必要的。如果光线630被纹理615阻挡,则透明三角形610后面的其他三角形(其可能已经与光线630相交)将被纹理阻挡并且不会有助于沿着光线的可视化。在本文的示例性非限制性实施例中,遍历协处理器138不能访问纹理信息,因此它不会尝试加速该确定。遍历协处理器138可以例如将光线和对象内的各种三角形之间的所有相交返回到请求SM 132,然后SM可以使用图元引擎134进行进一步的光线追踪可视化确定。在其他示例性实施例中,遍历协处理器138可以通过与纹理映射单元和图元引擎134内的3D图形管线的其他部分交互来加速这些测试中的一些或全部,以进行必要的可视化确定。
协调变换
图2A-图3C仅涉及单个对象,即茶壶。正如你现在所在的房间包含多个对象一样,大多数3D场景都包含许多对象。例如,包含茶壶的3D场景可能还包含杯子、碟子、牛奶罐、勺子、糖碗等,所有这些都放在桌子上。在3D图形中,这些对象中的每一个通常是独立建模的。然后,图形系统100使用来自处理器120的命令将所有模型以期望的位置、方向和尺寸放在公共场景中以便可视化(就像你将设置和安排用于供应茶的桌子一样)。这意味着SM 132可以命令遍历处理器138相对于场景中的多个对象分析相同的光线。然而,当放入公共场景时这些对象中的每一个将在位置、方向和大小上被变换的事实被遍历协处理器138考虑并加速。在非限制性示例性实施例中,从世界到对象空间的变换与世界空间包围盒一起存储在世界空间BVH中。遍历协处理器138通过将光线从世界(场景)空间变换到对象空间来加速变换过程,以便执行图4所示的测试。特别是,由于几何形状从对象空间到世界(场景)空间的变换是计算密集的,该变换留给图形管线图元引擎134和/或光栅引擎136以作为光栅化的一部分来执行。相反,遍历协处理器138将给定的光线从世界空间变换到由加速数据结构定义的每个对象的坐标系,并在对象空间中执行其测试。
图7A和图7B示出了遍历协处理器138如何将相同的光线变换到三个不同的对象空间。图7A示出了桌子上的三个对象:杯子、茶壶和水罐。这三个对象和一个桌子包含一个存在于世界空间中的场景。也在世界空间中定义的光线从视点发出并与三个对象中的每一个相交。
图7B示出了在对象空间中定义的三个对象中的每一个。这三个对象中的每一个都由存在于相应对象空间中的相应模型定义。在示例性非限制性实施例中,遍历协处理器138在针对对象执行相交测试之前将光线变换到每个对象的对象空间中。为了遍历协处理器138执行相交测试的目的,该“实例变换”节省了将每个对象的几何形状和加速数据结构的相关盒细分从对象空间变换到世界空间的计算工作量。
请求SM 132在一个对象隐藏另一个对象,在另一个对象上投射阴影和/或朝向另一个对象反射光的情况下追踪哪些对象相对于每个个体光线位于哪些其他对象前面并且解析可见性。请求SM 132可以使用遍历处理器138来加速这些测试中的每一个。
示例性树形BVH加速数据结构
图8A和图8B示出了3D场景(图8A)和相应的树形数据结构(图8B)的递归细分的包围盒,其可以由遍历协处理器138访问并且用于由遍历协处理器执行的硬件加速的操作。包围盒的划分可以用分层树形数据结构表示,其中图2B中所示的大包围盒由树的父节点表示,而较小的包围盒由父节点包含的树的子节点表示。最小的包围盒表示为树中的叶节点,并标识包含在这些最小包围盒内的一个或更多个几何图元。
树形数据结构可以存储在遍历协处理器138外部的存储器中,并且基于SM 132向遍历协处理器138发出的查询来检索。树形数据结构包括以层次布置的多个节点。树形结构的根节点N1对应于包围所有三角形O1-O8的包围盒N1。根节点N1可以识别包围盒N1的顶点和根节点的子节点。
在图8A中,包围盒N1被细分为包围盒N2和N3。图8B的树形结构的子节点N2和N3对应于并表示图8A中所示的包围盒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。图8B的树形结构的各个子节点N4、N5、N6、N8、N10和N11对应于并表示空间中的图8A的包围盒N4、N5、N6、N8、N10和N11。
图8B树仅有三到六层深,使得盒N4、N5、N6、N8、N10和N11构成“叶节点”-即,树中没有子节点的节点。图8A示出了叶节点包围盒N4、N5、N6和N8中的每一个都包含场景中的几何形状的两个三角形。例如,盒细分N4包含三角形O1和O2;盒细分N5包含三角形O3和O4;盒细分N6包含三角形O5和O6;以及盒细分N8包含三角形O7和O8。图8B中所示的树形结构通过将它们与场景几何形状中的适当的三角形O1-O8相关联来表示这些叶节点N4、N5、N6和N7。为了访问该场景几何形状,遍历协处理器138向下遍历图8B的树形数据结构直到叶节点。通常,树的不同部分可以并且将具有不同的深度并且包含不同数量的三角形。与不包含几何形状的盒细分相关联的叶节点不需要在树形数据结构中明确地表示(即,树被“修剪”)。
根据一些实施例,以N7为根的子树可以表示在与对应于节点N1-N3的包围盒不同的坐标空间中定义的一组包围盒或BVH。当包围盒N7与其父包围盒N3处于不同的坐标空间中时,提供遍历以N7为根的子树所必需的光线变换的实例节点N7'可以将树的其余部分连接到以N7为根的子树。实例节点N7'通过定义从N1-N3的坐标空间(例如,世界空间)到N7等的坐标空间(例如,对象空间)的变换,将对应于节点N1-N3的包围盒或BVH与对应于节点N7等的包围盒或BVH连接。
遍历协处理器138的内部结构和操作
图9示出了遍历协处理器138的示例性简化框图,其包括被配置为执行上述加速遍历操作的硬件(下面描述该遍历协处理器138的更详细的实现)。因为图9中所示的遍历协处理器138适于遍历诸如图8A、图8B所示的基于树的加速数据结构,所以它也可以被称为“树遍历单元”或“TTU”700(附图标记700用于指代图1中所示的遍历协处理器138的更详细的非限制性实现)。树遍历操作可以包括,例如,确定光线是否与包围盒和/或树形数据结构(例如,BVH树)的图元相交,这些测试可以涉及将光线变换到对象空间。
TTU 700包括用于确定光线是否与包围盒相交的专用硬件和用于确定光线是否与树形数据结构的图元相交的专用硬件。在一些实施例中,TTU700可以使用采用所支持的叶节点图元的相交测试的短堆栈遍历以及α图元和不支持的叶节点图元(项目)的中间遍历返回来执行包围盒层次的深度优先遍历。将参考三角形讨论图元的相交,但也可以使用其他几何图元。
更详细地,TTU 700包括相交管理块722、光线管理块730和堆栈管理块740。这些块中的每一个(以及图9中的所有其他块)可以构成由逻辑门、寄存器、硬件嵌入式查找表或其他组合逻辑等实现的专用硬件。
光线管理块730负责管理关于由SM 132指定的到光线管理块的光线的信息并执行关于其的操作。堆栈管理块740与遍历逻辑712结合工作以管理关于遍历BVH加速数据结构的信息并执行与其相关的操作。遍历逻辑712由光线-complet测试块710的结果指示,该光线-complet测试块710根据需要使用实例变换测试由光线管理块730指示的光线与由BVH表示的盒细分之间的相交。光线-complet测试块710经由作为TTU 700的一部分的L0完整缓存752从存储器140中检索关于BVH的附加信息。光线-complet测试块710的结果通知遍历逻辑712关于是否需要进一步递归遍历。当遍历逻辑712从BVH的一个级别遍历到另一个级别时,堆栈管理块740维护堆栈以追踪状态信息,当遍历逻辑遍历到BVH更深处时,堆栈管理块将项目推送到堆栈上,当遍历逻辑在BVH中向上遍历时,堆栈管理块将项目从堆栈中弹出。堆栈管理块740能够在SM请求的任何时间向请求SM 132提供状态信息(例如,中间或最终结果)。
相交管理块722根据需要使用实例变换来管理关于光线和图元之间的相交的信息并执行与其相关的操作。光线图元测试块720经由作为TTU 700的一部分的L0图元高速缓存754根据需要从存储器140中检索关于几何形状的信息。光线-图元测试和变换块720执行的相交测试的结果通知相交管理块722。因此,光线-图元测试和变换块720向相交管理块722提供相交结果,相交管理块722向请求SM 132报告几何碰撞和相交。
堆栈管理单元740检查遍历状态以确定需要检索什么类型的数据以及哪个数据路径(complet或图元)将消耗它。包围盒的相交在TTU 700的光线-complet测试路径中确定,包括一个或更多个光线-complet测试块710和一个或更多个遍历逻辑块712。complet指定包围盒的根节点或内部节点。因此,complet可以为光线-complet测试定义一个或更多个包围盒。TTU 700的光线-complet测试路径识别哪些包围盒与光线相交。需要进一步处理与光线相交的包围盒,以确定与相交的包围盒相关联的图元是否相交。在包括一个或更多个光线-图元测试和变换块720以及一个或更多个相交管理块722的光线-图元测试路径中确定图元的相交。
TTU 700从一个或更多个SM 132接收查询以执行树遍历操作。查询可以请求光线是否与包围盒和/或BVH数据结构中的图元相交。查询可以识别光线(例如,光线的原点、方向和长度)以及BVH数据结构和遍历状态(例如,短堆栈),其包括引用光线去访问的一个或更多个层次包围盒中的节点的一个或更多个条目。查询还可以包括关于光线在遍历期间如何处理特定类型的相交的信息。光线信息可以存储在光线管理块730中。可以基于光线-图元测试的结果更新存储的光线信息(例如,光线长度)。
TTU 700可以请求要从TTU 700外部的存储器中检索的在查询中识别的BVH数据结构。BVH数据结构的检索部分可以被高速缓存在TTU 700内的零级(L0)高速缓存750中,因此,该信息可用于其他时间相干的TTU操作,从而减少了存储器140的访问。光线-complet测试所需的BVH数据结构的部分可以存储在L0 complet高速缓存752中,并且光线-图元测试所需的BVH数据结构的部分可以存储在L0图元高速缓存754中。
在所请求的遍历步骤所需的complet信息在complet高速缓存752中可用之后,光线-complet测试块710确定与光线相交的包围盒。在执行该测试时,可以将光线从层次包围盒的坐标空间变换为相对于complet定义的坐标空间。针对与complet的子节点关联的包围盒测试光线。在示例性非限制性实施例中,不针对complet自己的包围盒测试光线,因为(1)TTU 700在测试引用该complet的父包围盒子项时,先前针对类似的包围盒测试了光线,并且(2)complet包围盒的目的是定义一个局部坐标系,其中子包围盒可以用压缩形式表示。如果光线与任何子包围盒相交,则结果被推送到遍历逻辑以确定相应的子指针将被推送到遍历堆栈的顺序(进一步测试可能需要遍历逻辑712向下遍历到BVH的下一级别)。递归地重复这些步骤,直到遇到BVH的相交叶节点。
光线-complet测试块710可以向遍历逻辑612提供光线-complet相交。使用光线-complet测试的结果,遍历逻辑712创建要被推送到堆栈管理块740的堆栈条目。堆栈条目可以指示需要通过光线-complet测试块710进一步测试光线相交的内部节点(即,包括一个或更多个子节点的节点)和/或需要通过光线-图元测试和变换块720测试光线相交的相交叶节点中识别的三角形。光线-complet测试块710可以重复在堆栈中识别的内部节点上的遍历,以确定与光线相交的BVH中的所有叶节点。在示例性非限制性实施例中,光线-complet测试块710执行的精确测试将由模式位、光线操作(见下文)和剔除碰撞来确定,并且TTU700可以将中间结果和最终结果返回到SM 132。
相交的叶节点识别可能或可能不与光线相交的图元。一种选择是TTU700向SM 132提供例如在相交的叶节点中识别的一系列几何形状以进行进一步处理。例如,SM 132自身可以基于TTU 700提供的信息确定所识别的图元是否与光线相交,作为TTU遍历BVH的结果。为了从SM 132卸载该处理并由此使用TTU 700的硬件加速它,堆栈管理块740可以发出对光线-图元和变换块720的请求以对TTU的光线-complet测试块710识别的相交叶节点内的图元执行光线-图元测试。在一些实施例中,SM 132可以发出对光线-图元测试的请求以测试特定范围的图元和变换块720,而不管如何识别该几何形状范围。
在确保所请求的光线-图元测试所需的图元数据在图元高速缓存754中可用之后,光线-图元和变换块710可以使用存储在光线管理块730中的光线信息来确定与光线相交的图元。光线-图元测试块720将确定为与光线相交的图元的标识提供给相交管理块722。
相交管理块722可以将光线-图元测试的结果返回给SM 132。光线-图元测试的结果可以包括相交图元的标识符,交点与光线原点的距离以及关于相交图元的属性的其他信息。在一些实施例中,相交管理块722可以基于来自光线-图元和变换块710的先前相交结果来修改现有的光线-图元测试(例如,通过修改光线的长度)。
相交管理块722还可以追踪不同类型的图元。例如,不同类型的三角形包括在相交时阻挡光线的不透明三角形和在相交时可能阻挡或可能不阻挡光线或者可能需要SM进行额外处理的α三角形。光线是否被透明三角形阻挡可以例如取决于映射到三角形上的一个或更多个纹理、纹理占据的三角形区域(参见图6A和图6B)以及纹理修改三角形的方式。例如,在一些实施例中,透明度(例如,彩色玻璃)需要SM 132追踪透明对象碰撞,因此它们可以以光线参数顺序进行分类和着色,并且通常实际上不阻挡光线。同时,α“修剪”允许基于映射到图元上的纹理的形状来修剪图元的形状-例如,从三角形裁剪出叶形(请注意,在光栅图形中,透明度通常被称为“α混合”,并且修剪被称为“α测试”)。在其他实施例中,TTU700可以将透明碰撞推送到存储器中的队列,以稍后由SM 132处理,并通过向纹理单元发送请求来直接处理经修剪的三角形。每个三角形可以包括指示三角形类型的指示符。相交管理块722被配置为维护用于追踪不同类型的相交三角形的结果队列。例如,结果队列可以将一个或更多个相交的不透明三角形标识符存储在一个队列中,并将一个或更多个透明三角形标识符存储在另一个队列中。
对于不透明三角形,可以在TTU 700中完全确定光线相交,因为不透明三角形的区域阻挡光线穿过三角形的表面。对于透明三角形,在一些实施例中,在TTU 700中不能完全确定光线交点,因为TTU 700基于三角形的几何形状执行相交测试,并且可能无法访问三角形的纹理和/或由纹理占据的三角形区域(在其他实施例中,可以通过图形管线的纹理映射块向TTU提供纹理信息)。为了完全确定三角形是否相交,可以将关于光线-图元和变换块710确定的透明三角形相交的信息发送到SM 132,以便SM完全确定三角形是否影响沿着光线的可见性。
SM 132可以解决光线是否与关联于透明三角形的纹理相交和/或光线是否将被纹理阻挡。在一些情况下,SM 132可以基于该确定将修改的查询发送到TTU 700(例如,如果光线被纹理阻挡则缩短光线)。
在一个实施例中,TTU 700可以被配置为将确定为与光线相交的所有三角形返回到SM 132以进行进一步处理。因为在接口和线程同步方面将每个三角形交点返回到SM 132以进行进一步处理是昂贵的,所以TTU 700可以被配置为隐藏三角形,该三角形是相交的但可证明能够隐藏而不会对结果场景产生功能影响。例如,因为TTU 700具有三角形类型信息(例如,三角形是不透明的还是透明的),所以TTU 700可以使用三角形类型信息来确定沿着光线被另一个相交的不透明三角形遮挡的相交三角形,因此它们不需要包括在结果中,因为它们不会影响沿光线的可见性。如上面参考图5A-图5C所讨论的,如果TTU 700知道一三角形沿着光线被一不透明三角形遮挡,则可以从结果中隐藏被遮挡的三角形而不影响所得场景的可视化。
相交管理块722可以包括结果队列,用于存储将三角形ID和关于光线碰撞三角形的点的信息相关联的碰撞。当确定光线与不透明三角形相交时,三角形的身份和交点到光线原点的距离可以存储在结果队列中。如果确定光线与另一个不透明三角形相交,则如果交点到光线原点的距离大于已存储在结果队列中的相交的不透明三角形的距离,则可以从结果中省略另一个相交的不透明三角形。如果交点到光线原点的距离小于已存储在结果队列中的相交的不透明三角形的距离,则另一个相交的不透明三角形可以替换存储在结果队列中的不透明三角形。在测试了查询的所有三角形之后,可以将存储在结果队列中的不透明三角形信息和交点信息发送到SM132。
在一些实施例中,一旦识别出不透明三角形交点,相交管理块722可以缩短存储在光线管理块730中的光线,使得在相交的不透明三角形(沿着光线)后面的包围盒(可以包括三角形)不会被识别为与光线相交。
相交管理块722可以将关于相交的透明三角形的信息存储在单独的队列中。存储的关于相交的透明三角形的信息可以被发送到SM 132以供SM解析光线是否与关联于三角形的纹理相交和/或纹理是否阻挡光线。SM可以基于该确定将该确定的结果返回到TTU 700和/或修改查询(例如,如果光线被纹理阻挡则缩短光线)。
示例性光线追踪着色管线
图10A示出了示例性光线追踪着色管线900,其可由SM 132执行并由TTU 700加速。光线追踪着色管线900由SM 132调用光线生成910并向TTU 700发出相应的光线追踪请求开始。光线追踪请求识别投射到场景中的单个光线,并要求TTU 700搜索具有SM 132也指定的加速数据结构的交点。TTU 700遍历(图10A的框920)加速数据结构,以确定光线与盒细分和加速数据结构所代表的关联三角形之间的交点或潜在交点。可以通过在加速数据结构中找到与光线相交的包围盒来识别潜在的交点。不需要检查非相交包围盒的后代。
对于相交的包围盒内的三角形,TTU 700光线-图元测试块720执行相交930过程以确定光线是否与图元相交。TTU 700将交点信息返回到SM132,其可以响应于交点确定执行“任何碰撞”着色操作940。例如,SM 132可以执行(或使其他硬件执行)针对相交图元的纹理查找,并且基于适当的纹理元素值来决定如何着色使光线可视化的像素。SM 132追踪这样的结果,因为TTU 700可以以任意顺序返回与场景中不同几何形状的多个交点。
或者,可以进一步处理TTU 700确定相交的图元以确定950它们是否应该被着色为未碰撞960或最近的碰撞970。SM 132可以例如指示TTU 700报告指定的几何形状中的最近的碰撞,或者它可以指示TTU报告指定几何形状中的所有碰撞。例如,可以由SM 132实现针对TTU 700基于所实现的环境查找确定相交的图元的“未碰撞”着色操作(例如,通过预先计算的纹理图像的平均来近似反射表面的外观),如图6A和图6B所示。SM 132可以响应于TTU700提供的针对特定对象几何形状的最接近的碰撞报告,基于材料评估和纹理查找来执行最接近的碰撞着色操作以确定最接近的相交图元。
图10B更详细的光线追踪管线流程图示出了用于代表性用例的组件之间的数据流和交互:追踪包含几何图元的场景的光线,其中实例变换在硬件中处理。在一个示例性非限制性实施例中,图10B的光线追踪管线基本上是软件定义的(在示例性实施例中意味着它由SM 132确定)但是通过TTU 700广泛使用硬件加速。关键部件包括SM 132(和计算管线的其余部分)、TTU 700(用作SM的协处理器)以及L1高速缓存和下游存储器系统,TTU从中获取BVH和三角形数据。
图10B中所示的管线示出了可以由开发系统提前执行层次包围盒创建1002。它还示出了光线创建和分发1004由示例性实施例中的SM 132或其他软件执行或控制,如着色(其可包括照明和纹理)。示例性管线包括“顶层(top level)”BVH树遍历1006、光线变换1014、“底层(bottom level)”BVH树遍历1018以及每个由TTU 700执行的光线/三角形(或其他图元)相交1026。不必按所示顺序执行,因为TTU 700和SM 132之间的握手(handshake)确定TTU 700做什么以及以什么顺序进行。
SM 132一次向TTU 700呈现一条或更多条光线。SM 132呈现给TTU700以进行遍历的每条光线可包括光线的几何参数、遍历状态以及光线的光线标记、模式标记和光线操作信息。在示例性实施例中,光线操作(RayOp)提供或包括辅助算术和/或逻辑测试以抑制、覆盖和/或允许存储交点。SM132还可以使用遍历堆栈来将某些状态信息传送到TTU 700以用于遍历。可以使用显式遍历堆栈启动新的光线查询。然而,对于某些查询,可以提供少量的堆栈初始化器来开始给定类型的新查询,例如:从complet开始的遍历;光线与一系列三角形的相交;光线与一系列三角形的相交,然后从complet开始的遍历;从三角形缓冲区中获取给定三角形的顶点。在一些实施例中,使用堆栈初始化器而不是显式堆栈初始化提高性能,因为堆栈初始化器需要更少的流式处理器寄存器并减少需要从流式处理器传输到TTU的参数的数量。
在示例性实施例中,SM 132与每个查询(例如,光线)一起呈现的一组模式标记可以至少部分地控制当查询与特定类型的包围盒相交或与特定图元类型的图元相交时TTU700将如何处理查询。SM 132提供给TTU700的模式标记使SM和/或应用程序能够例如通过RayOp指定辅助算术或逻辑测试来抑制、覆盖或允许存储交点。模式标记可以例如使遍历行为能够根据诸如与每个包围盒和/或图元相关联的深度(或距离)、与到原点或光线的距离相关的包围盒或图元的大小等方面而改变。应用程序可以使用此功能来动态地和/或选择性地启用/禁用相交测试的对象集与特定查询集或查询组,例如,以允许在应用程序状态改变时(例如,当门打开或关闭时)使用不同版本的模型,或者提供作为光线长度的函数选择的模型的不同版本以实现细节几何形状级别的形式,或允许来自某些光线类别的特定对象集使某些图层在特定视图中可见或不可见。
除了可以针对光线-complet交点和针对光线-图元交点单独指定模式标记集之外,光线数据结构可以指定其他与RayOp测试相关的参数,例如光线标记、光线参数和RayOp测试。TTU 700可以使用光线标记来控制遍历行为、背面剔除和各种子节点类型的处理的各个方面,这取决于可选的RayOp测试的通过/失败状态。RayOp测试增加了TTU 700容量的灵活性,但代价是复杂性。TTU 700为其正在处理的每个活动光线保留“光线槽”,并且可以在遍历期间将光线标记、模式标记和/或RayOp信息存储在TTU内的相应光线槽缓冲器中。
在图10B所示的示例中,TTU 700执行顶层树遍历1006和底层树遍历1018。在示例性实施例中,BVH的两层遍历使得能够对动态场景变化进行快速光线追踪响应。
光线变换1014通过变换光线提供从顶层树遍历1006到底层树遍历1018的适当过渡,其可以在第一坐标空间(例如,世界空间)中的顶层遍历到底层遍历的BVH的不同坐标空间(例如,对象空间)中使用。在先前的文献中描述了使用两层遍历的示例性BVH遍历技术,参见例如Woop,“动态场景的光线追踪硬件架构(A Ray Tracing Hardware Architecturefor Dynamic Scenes)”,萨尔大学,2004,但是实施例不限于此。
在一些实施例中,顶层遍历(在世界空间中)是在BVH中进行的,其可以响应于场景的变化而动态地重新计算(例如,通过SM 132),并且底层遍历在包围盒的BVH中进行,即使在场景发生变化时仍保持静态或基本静态。用于底层树遍历1018(在对象空间中)的BVH中的包围盒可以包含关于场景几何形状的更详细信息,而不是顶层树遍历1006中使用的相应包围盒,从而避免或至少减少响应于场景变化而修改底层遍历BVH。这有助于加速动态场景的光线追踪。
示例性顶层树遍历
TTU 700的顶层树遍历1006从L1高速缓存1012接收complet,并且向光线变换1014提供用于变换的实例或者向SM 132提供未碰撞/结束输出1013以用于由SM(此块也可以基于非叶节点/无碰撞条件递归地操作)处理的最接近的碰撞着色器1015。在顶层树遍历1006中,下一个complet获取步骤1008从存储器和/或高速缓存层次中获取要在步骤1010中测试光线相交的下一个complet,并且在该获取的complet中的包围盒上完成光线-包围盒相交测试。
如上所述,实例节点将一个BVH连接到处于不同坐标系中的另一个BVH。当相交的包围盒的子项是实例节点时,光线变换1014能够从L1高速缓存1016检索适当的变换矩阵。TTU 700使用适当的变换矩阵将光线变换为子BVH的坐标系。已经通过引用并入的美国专利申请No.14/697,480描述了将树中的第一组节点连接到第二组节点的变换节点,其中第一和第二组节点在不同的坐标系中。示例性实施例中的实例节点可以类似于美国申请No.14/697,480中的变换节点。在图10C中所示的TTU 700的替代非实例化模式中,TTU不执行“底”层树遍历1018,并且非实例化的树BVH遍历由框1008、1010执行,例如,仅使用一个堆栈。TTU700可以基于其从BVH和/或查询类型读取的内容在图10B实例化操作和图10C非实例化操作之间切换。例如,特定查询类型可以限制TTU仅使用非实例化操作。在这样的查询中,任何相交的实例节点都将返回给SM。
在一些非限制性实施例中,在获取下一个complet之前,对所获取的complet中的每个包围盒执行步骤1010中的光线-包围盒相交测试。其他实施例可以使用其他技术,例如以深度优先的方式遍历顶层遍历BVH。已通过引用并入的美国专利No.9,582,607描述了可以在示例性实施例中使用的一个或更多个complet结构和内容。美国专利No.9,582,607还描述了complet的示例性遍历。
当确定包围盒与光线相交时,对相交的包围盒的子包围盒(或对它们的参考)保持追踪,以便随后测试与光线的相交和遍历。在示例性实施例中,一个或更多个堆栈数据结构用于追踪随后要测试的子包围盒与光线的相交。在一些示例性实施例中,可以使用小尺寸的遍历堆栈来追踪要由顶层树遍历1006的操作遍历的complet,以及要测试相交的图元,并且可以使用更大的本地堆栈数据结构以追踪底层树遍历1018中的遍历状态。
示例性底层树遍历
在底层树遍历1018中,下一个complet获取步骤1022从存储器和/或高速缓存层次1020中获取要在步骤1024中测试光线相交的下一个complet,并在获取的complet中的包围盒上进行光线-包围盒相交测试。如上所述,底层树遍历可以包括其中的包围盒与在上层树遍历中遍历的包围盒处于不同的坐标系中的complet。底层树遍历还接收来自L1高速缓存的complet,并且可以基于无叶/无碰撞条件以及基于未碰撞/结束检测的顶层树遍历1006在其自身内递归地或迭代地操作。可以利用变换到所检索的较低层complet的坐标系的光线来确定光线与较低层BVH中的包围盒的交点。然后将发现与较低层树遍历中与光线相交的叶包围盒提供给光线/三角形交点1026。
底层树遍历1018的叶输出被提供给光线/三角形交点1026(其具有L0高速缓存访问以及经由L1高速缓存1028检索三角形的能力)。L0 complet和三角形高速缓存可以是TTU700内部的小的只读高速缓存。当到达某些叶节点而不遍历实例化的BVH时,光线/三角形交点1026还可以从顶层树遍历1006接收叶输出。
在处理了图元范围中的所有图元之后,交点管理单元检查结果队列的状态并制作分组以发送到堆栈管理单元和/或光线管理单元以更新光线的属性和遍历状态,设置光线的下一个遍历步骤,和/或将光线返回到SM 132(如有必要)。如果结果队列包含在处理图元范围期间发现的不透明或α交点,则交点管理单元将结果队列中最近的不透明交点的参数长度(t)发信号到光线管理单元,以记录为光线的上限以缩短光线。要更新遍历状态以设置光线的下一个遍历步骤,交点管理单元向堆栈管理单元发送一下信号:结果队列中是否存在与图元范围的不透明交点,结果队列中是否存在一个或更多个α交点,结果队列是否已满,是否在图元范围中找到了尚未返回到SM且在结果队列中不存在的额外α交点,以及在SM消耗结果队列的内容之后要测试的光线的图元范围中的下一个α图元的索引(α图元之后范围中的下一个图元的索引,具有来自结果队列中当前图元范围的最高存储器顺序)。
当堆栈管理单元740从交点管理单元722接收到分组时,堆栈管理单元740检查该分组以确定完成遍历步骤所需的下一个动作并开始下一个动作。如果来自交点管理单元722的分组指示在图元范围中已找到不透明交点并且光线模式位指示一旦找到任何交点则该光线将结束遍历,堆栈管理单元740将该光线及其结果队列返回到SM,遍历状态指示遍历已完成(完成标记设置和/或空顶层和底层堆栈)。如果来自交点管理单元722的分组指示结果队列中存在不透明交点或α交点,并且在图元范围(其尚未被返回到SM)处理期间图元范围中还有光线遇到的剩余α交点不存在于结果队列中,则堆栈管理单元740将光线和结果队列返回到SM,其中遍历状态被修改以设置剔除不透明位以防止进一步处理图元范围中的不透明图元并且最高α图元交点从图元范围返回到光线结果队列中的SM之后,图元范围开始索引前进到第一个α图元。如果来自交点管理单元722的分组指示当光线处理了图元范围时没有找到不透明交点或α交点,则堆栈管理单元740将堆栈顶部的条目(对应于完成的图元范围)从活动遍历堆栈中弹出。如果来自堆栈管理单元740的分组指示队列中的不透明交点或者结果队列中存在不透明交点,并且一旦找到任何交点和/或结果队列中存在α交点,则光线模式位不指示光线将完成遍历,但是在结果队列中不存在的图元范围中没有找到剩余的α交点,其尚未返回到SM,堆栈管理单元740从活动遍历堆栈弹出堆栈条目的顶部(对应于完成的图元范围)并修改结果队列的内容,以指示结果队列中存在的所有交点都来自其已完成处理的基本范围。
如果活动堆栈是底部堆栈,并且底部堆栈是空的,则堆栈管理单元740将活动堆栈设置为顶部堆栈。如果顶部堆栈是活动堆栈,并且活动堆栈为空,则堆栈管理单元740将光线及其结果队列返回到SM,其遍历状态指示遍历已完成(完成标记设置和/或空顶层和底层堆栈)。如果活动堆栈包含一个或更多个堆栈条目,则堆栈管理单元740检查顶部堆栈条目并开始下一个遍历步骤。具有与光线的交点的图元和/或图元范围的测试以及将结果返回到SM 132在以下申请中描述:共同未决的美国申请No.16/101,148,标题为“保守的水密光线三角交点(Conservative Watertight Ray Triangle Intersection)”(卷号6610-36(18-SC-0145)),和美国申请No.16/101,066,标题为“在没有着色器干预下对交点进行连续层次包围盒遍历的方法(Method for Continued Bounding Volume Hierarchy Traversalon Intersection without Shader Intervention)”(卷号6610-32(18-AU-0127)),其全部内容通过引用并入本文。
虽然以上公开内容在计算机图形和可视化的特定上下文中表达,但是光线追踪和所公开的遍历协处理器可以用于除图形和可视化之外的各种应用。非限制性示例性包括用于逼真声音合成的声音传播,声呐系统的模拟,光学元件和系统的设计,粒子传输模拟(例如,用于医学物理学或实验高能物理),一般波传播模拟,与LIDAR数据的比较,用于例如机器人或车辆定位等目的,OptiXTM过去已经用于其中一些应用领域。
具有确定性结果的示例性光线-图元遍历
如上所述,TTU 700包括专用硬件以确定光线是否与包围盒和专用硬件相交以确定光线是否与树形数据结构的图元相交。树形数据结构的图元可以包括在树形数据结构的叶节点中标识的不同几何图元(例如,点、线、三角形、四边形、网格等)。至少一些图元(例如,三角形)可以包括类型指示符以区分不同类型的图元。如参考图5A-图5C所讨论的,不同类型的三角形可包括不透明三角形和α三角形。
TTU 700包括被配置为完全确定某些类型的图元的交点的硬件,而对于其他图元,TTU 700可以自己确定可能的交点。例如,TTU可以完全确定光线与不透明三角形相交。对于α三角形,TTU可能仅能够确定相交是可能的并且将需要SM来解析(例如,基于纹理信息)光线是否与应用于透明三角形表面的纹理相交和/或纹理是否会阻挡光线。
在一个实施例中,TTU 700可以被配置为将确定为与光线相交的所有图元返回到SM 132以进行进一步处理。然而,在接口和线程同步方面,将每个相交的图元和可能相交的图元返回到SM 132是昂贵的。另外,SM 132将需要资源来处理至少一些返回的图元,以例如基于纹理映射信息确定光线是否与应用于透明三角形的纹理相交和/或光线是否将被纹理阻挡。
TTU 700提供硬件解决方案以确定可以从提供给SM 132的结果中省略哪些相交的图元,而不会对结果场景的可视化产生功能性影响。这允许TTU 700继续遍历BVH而无需在有或没有其他相关硬件的SM中实现着色器的干预。例如,TTU 700可以被配置为省略相对于光线原点位于不透明图元后面的那些图元,因为如参考图5A-图5C所讨论的,场景中的光线将被不透明图元阻挡并且即使光线在空间上与它们相交,也不会到达其他图元。
TTU 700可以被配置为在利用TTU 700中的小结果队列时省略相交图元而不对结果场景的可视化产生功能性影响。当用于查询的相交图元的数量(例如,相交的α图元)超过结果队列的大小时,TTU 700可能需要执行到SM 132的多次返回。当向SM 132提供相交结果时,可能需要以确定性的方式提供结果,使得SM 132可以提供一致的可视化结果。
TTU 700可以被配置为向SM 132产生确定性相交结果。TTU 700可以被配置为即使在针对交点测试的图元范围分布在多个高速缓存线大小的块(其以随机顺序提供给TTU700)上时也产生确定性相交结果。因此,TTU 700可以被配置为向SM 132提供确定性结果,而不管存储器140将具有图元信息的块返回到TTU 700以进行处理的顺序,同时机会性地从结果中省略被证明能够被省略而不会对可视化虚拟场景产生功能性影响的图元。
确定性结果可以帮助SM有效地产生稳定的图像而没有令人讨厌的伪像。例如,期望TTU 700以SM已知的顺序向SM提供结果。例如,如果SM多次向TTU 700发送相同的查询,则TTU 700应该每次以相同的顺序向SM提供相同的结果,而不管诸如TTU 700从存储器接收数据的顺序或内部预定工作等因素。确定性结果允许SM以有效的方式基于所接收的结果执行附加处理并发出适当的请求(例如,附加的交点查询)。在一个示例中,如果TTU 700不提供确定性结果,则SM可以发布可能不需要发布的后续查询,或者发布不准确地反映接下来需要针对交点测试的内容的查询。不准确地标识数字和/或与哪些图元相交可以例如在系统生成场景的图像中引入视觉伪像。
同时,TTU 700通常基于可变因素(例如,存储器系统检索TTU 700请求的遍历信息的顺序,图中的几何形状的特征,对TTU 700的SM查询的规范,TTU 700内的内部调度等等)以预先无法预测的顺序计算其结果。
图11是用于加速光线-图元相交测试的示例非限制性方法的流程图。该方法可以由本申请中公开的TTU 700执行,但不限于此。
该方法包括接收请求1110。该请求可以是请求查询数据结构和图元范围之间的最近交点的查询。查询可以从SM接收,或者可以是由TTU的光线-complet测试路径执行的光线-complet测试的结果。在一些实施例中,查询数据结构可以是由其三坐标原点、三坐标方向以及沿着光线的t参数的最小值和最大值给出的光线。可以在TTU中的堆栈管理块的一个或更多个堆栈条目中标识查询的图元范围。可以基于在TTU的光线-complet测试路径中找到BVH的相交叶节点的结果来制作堆栈条目。
从存储器1112检索图元范围。可以从TTU存储器(例如,L0高速缓存750的三角形高速缓存754)或TTU外部的存储器检索图元范围。图元范围可以例如在连续的一组高速缓存线大小的块中提供。每个高速缓存线大小的块可以包括标识块内表达的几何类型的报头和块中每个图元的图元类型。例如,报头可以标识该块包括三角形并指示每个三角形是α图元还是不透明图元。报头可以包括用于每个图元的α位,以指定相应图元是α图元还是不透明图元。
图12A示出了根据本公开的示例性实施例的标识图元范围的多个块0-N。每个块可以包括报头1250和图元1260的几何数据。每个块可以与物理或虚拟存储器中的相应存储器地址(例如,K,K+1,K+N)相关联。图元的几何数据可以包括图元的顶点(例如,三角形包括三个顶点,每个顶点由坐标X0,Y0,Z0标识)。在一些实施例中,可以压缩几何数据。如图12A所示,报头可以包括在块内表示的几何类型和编码方案(例如,压缩三角形),块中的图元数量(减1),和/或一组ForceNoCull位,其指示是否应该对块中的每个图元禁用剔除,和/或一组α位,其指示针对块中的每个图元,该图元是α图元还是不透明图元。包括在报头1250中的信息不限于图12A中所示的信息,并且可以包括其他信息,诸如用于图元的应用程序特定元数据,和/或与块中的一个或更多个特定图元相关联的其他图元元数据值。
每个块可以存储多个图元的几何数据。在一些实施例中,一个或更多个块可以包括一个或更多个不透明图元和一个或更多个α图元。每个块的大小可以对应于TTU 700存储器的高速缓存线(例如,L0高速缓存750)。在一些实施例中,可以将任意数量的图元的信息存储在任何一个块中。存储在给定压缩块内的图元的数量可以是相关图元的几何数据值的数据相似性的函数。可以通过块编号来标识块,其中顺序块具有对应的顺序块编号。此外,顺序块可以为顺序标识的图元提供存储。
压缩块和未压缩块的示例以及可包括在报头中的信息在美国专利申请公开2016/0071234中公开,其通过引用并入本文。
该方法包括测试图元范围中的图元与光线1114的相交。测试图元可以包括确定光线是否与由图元标识的区域相交(例如,通过对象空间坐标中的三角形的顶点)。可以测试图元范围中的每个图元与光线的相交。为了针对由顶点标识的区域测试光线,TTU 700的光线-三角形测试路径可以使用实例变换将光线变换为图元范围的对象空间坐标。
该方法包括省略可以被确定为对可视化结果场景1116没有功能性影响的相交的图元。在一个实施例中,相交管理块722(参见图9)可以确定可以从提供给SM 132的结果中省略哪些空间上相交的图元。TTU 700可以确定图元范围中的一个或更多个空间上相交的图元沿着光线被另一个更接近光线原点的相交不透明三角形遮挡。由于场景中较近的不透明图元会阻挡光线穿过图元,因此不透明三角形相对于光线原点遮挡的空间上相交的图元不需要包含在相交图元的结果中,并且如果先前已添加,可以从报告给SM 132的结果中移除。
参考图5A,当TTU确定光线与不透明的前面图元相交时,TTU可以从结果中省略不透明图元后面的空间上相交的图元。在图5B中,前面的空间上相交图元是α图元,其可以允许光线通过并碰撞其他图元。不应该从报告的结果中省略α图元背后的图元,因为根据纹理的位置和/或类型,光线可以通过α图元并碰撞α图元后面的其他图元。在一些示例中,TTU可能不能自己确定(例如,没有SM的干预)空间上相交的α三角形是否将阻挡光线或允许光线传递到其他图元。
因此,当TTU确定光线在空间上与α图元相交时,TTU将相交的α图元添加到结果并继续光线-图元相交测试以确定图元范围中的任何其他空间上相交的图元,这可以是参考光线的方向在α图元的后面或前面。参考图5C,因为前两个空间上相交的图元是α图元,所以两个α图元将与不透明图元一起被添加到结果中。
在一个实施例中,仅当该范围中的所有相交图元都是不透明的时,TTU可以省略空间上相交的不透明图元后面的图元。在另一个实施例中,TTU可以忽略空间上相交的不透明图元后面的图元,而不管其他空间上相交的图元是不透明图元还是α图元。在该示例中,从结果中排除的空间上相交的图元可以包括不透明图元和/或α图元。
可以对结果场景具有功能性影响的空间上相交的图元可以存储在结果队列中(例如,在相交管理单元722中)。结果队列在TTU协处理器700内提供数据结构,用于存储在遍历期间找到的一个或更多个不透明或α图元交点。在一个实施例中,结果队列允许协处理器推迟SM的α测试,并且如果更近的不透明交点遮挡α交点,则可能完全避免它们。
图12B示出了根据本公开的示例性实施例的结果队列1200。结果队列1200可以包括用于一个不透明图元交点或一个α图元交点的条目1210。结果队列1200可以选择性地包括用于额外的α交点的一个或更多个附加条目1220、1230。
在一个示例性实施例中,每个结果队列条目指定碰撞类型和参数长度,其指定沿着光线发生碰撞的点和碰撞的属性,例如实例ID、材料ID或图元ID,其可以由SM用于选择特定材料着色器和一组资源绑定,以及图元ID和(u,v)坐标,其可以由SM在着色期间用来检索和内插属性或样本纹理。
在其他实施例中,结果队列可以包括用于不透明图元和α图元的单独队列。例如,结果队列可以包括用于不透明图元交点的单个条目和用于α图元交点的一个或更多个条目。
该方法包括将相交的图元的结果返回到SM 1118。当查询完成时或者在中间遍历中,如果需要SM干预,结果可以返回到SM(例如,如果在单个三角形范围内找到的α碰撞数目超过了结果队列的α碰撞的存储容量)。如果查询中的所有图元都是不透明的,则TTU可以仅将最接近的不透明图元返回给SM。然而,如果图元包括不透明图元和α图元的混合,则多个α图元可以与光线相交。可以将每个相交的α图元返回到SM以进行进一步处理(例如,以基于与α图元相关联的纹理信息来确定是否存在碰撞)。
TTU 700可以将相交的α图元返回到SM,使得结果是确定性的,而不管图元范围中的图元由TTU 700处理的顺序。例如,TTU 700可以按照从存储器系统140返回的高速缓存线大小的块的顺序处理图元范围中的图元,但是以SM已知的顺序将结果返回到SM。
高速缓存线大小的块被提供给TTU 700的顺序可以取决于所请求的块位于存储器系统140的层次中的何处。因此,每个块的延迟可以不同。例如,所请求的块之一可以位于TTU的L0高速缓存中,而其他块可以位于存储器层次的L1高速缓存或L2高速缓存中。另外,如在共同未决的共同转让[美国申请标题:对用于数据路径调度的高速缓存请求进行有效分组的方法(Method for Efficient Grouping of cache Requests for Data pathScheduling):参考:18-AU-012;6610-33],TTU L0高速缓存750不一定以先到先服务的顺序处理请求,而是对其响应进行分组或分束。如果L0高速缓存750忙于提供对一组光线的响应,则它可以将其对“单体”的响应延迟。至少由于这些原因,TTU中的光线处理接收BVH的请求部分以进行测试的顺序可能是不可预测的。然而,在示例非限制性实施例中,TTU 700可以通过按照存储图元的存储器地址顺序(例如,升序或降序),而不是按照它们位于场景中的空间顺序或者按照TTU 700确定交点的顺序返回某些类型的图元(例如,α图元)以确定性方式向SM提供相交的图元。
通过加速数据结构(例如,BVH)在物理存储器或虚拟存储器中存储图元的地址顺序来提供图元的存储器顺序。如上所述,叶节点标识存储在多个连续高速缓存线大小的块中的图元范围。图元范围可以通过包含该范围中的第一图元的第一块的地址、该第一块中的第一图元的索引、该范围中的块的总数以及最后一个块中的最后一个图元的索引来在加速结构的叶数据中表示。在加速数据结构中,与图元范围相关联的块以特定顺序存储,并且每个块内的图元按特定顺序排列。图元的存储器地址顺序由块的顺序和每个块内的图元的顺序提供。在一些实施例中,图元的顺序特定于特定加速数据结构。
SM可以使用结果来构建场景,向TTU发出附加查询,和/或修改先前向对TTU发出的查询。在一个实施例中,即使遍历尚未完成,具有α位集的空间相交图元也返回到SM。如果软件确定三角形实际上是透明的,则可以将具有遍历堆栈信息的空间相交图元返回到SM,该遍历堆栈信息包含继续遍历所需的状态。在一个实施例中,TTU可以在已经测试了图元范围中的所有图元之后将结果返回到SM。在该实施例中,结果队列的大小需要足以存储所有结果。
在一些实施例中,由于物理约束,结果队列大小可以限于单个条目或几个条目。例如,结果队列可以包括用于不透明交点或α交点的单个条目。在另一示例中,结果队列可包括用于不透明交点的单个条目和用于α交点的多个条目(例如,四个条目)。当标识出不能丢弃的交点并且结果队列已满时,TTU 700可以将结果队列中的结果返回给SM,采用信息SM能够在处理结果中标识的一个或更多个图元之后重新提交光线测试查询。例如,SM可以重新提交光线测试查询,该查询跳过已经返回到SM的一个或更多个图元。因此,如果多个α图元在光线中相交,则每个相交的α图元可以一个接一个地返回到SM。
TTU 700可以被配置为按照它们存储在存储器中的顺序提供被确定为相交的多个α图元至SM,以提供确定性结果。在一个示例中,当标识出不能省略的α图元交点并且结果队列已满时,TTU 700可以用新的α图元交点替换结果队列中的条目之一。如果新的α图元交点位于存储器顺序中的位置早于存储在结果队列中的α图元交点之一,则TTU 700可以替换结果队列中的一个条目。
没有着色器干预且具有确定性结果的示例性光线三角形遍历
在更具体的示例中,TTU通过追踪通过生成的BVH的光线来进行操作,该BVH包括内部节点、实例变换、项目范围和三角形范围。内部节点交点进一步遍历层次。实例节点交点可以执行硬件加速实例转换,然后在实例化子BVH上继续遍历。项目范围被返回到SM。三角形范围可以使用光线三角形测试(RTT)块中的TTU内部的特定硬件加速来确定光线和特定三角形之间的交点。通常,查询关注与光线原点最接近的交点,或者仅仅涉及存在交点。
TTU具有两种类型的三角形,它们相交:不透明和α。三角形的类型可以由标志(例如,α三角形标志)指定。TTU可以被配置为完全确定TTU的光线-三角形测试路径中的不透明三角形的交点。TTU可能无法完全确定α三角形的交点。对于α三角形,TTU的光线-三角形测试路径确定可能存在交点,并且关于可能的交点的信息被发送到SM以确定是否存在实际交点。使用α三角形的示例在叶子中,其中叶子可以由单个三角形表示,纹理被应用于该三角形以定义围绕实际叶子形状的更紧密的边界。该概念在图6A和图6B中示出,其中叶子的纹理615被应用于三角形610的一部分。α三角形标志也可以应用于其他不透明的三角形,使得TTU返回与光线相交的每个三角形。
TTU包括相交管理单元(IMU)和结果队列,其允许TTU处理不同的图元碰撞类型而不必将所有相交的三角形返回到SM。减少这些返回是合乎需要的,因为返回至SM需要整个线程束同步。相交结果存储在结果队列中,并在查询完成时返回到SM,或者如果需要SM干预,则在中间遍历中返回至SM(例如,如果在单个三角形范围内找到的α碰撞数超过结果队列的α碰撞的存储容量)。
图13是用于加速的光线-三角形相交测试的示例非限制性方法的流程图。该方法可以由本申请中公开的TTU 700执行,但不限于此。
TTU可以被配置为处理TTU的光线-图元测试路径中的某些几何类型图元。在一些实现中,在TTU的光线-图元路径中可能不支持其他图元类型。TTU的光线-图元路径中不支持的图元类型可以返回到SM进行处理(例如,在TTU的光线-complet测试路径中标识之后或者在TTU的光线相交测试路径中遇到它们时)。参考配置为处理光线-图元测试路径中的三角形的TTU来解释图13中的流程图,但不限于此。TTU的光线-图元测试路径可以被配置为确定其他图元的交点,并且可以被配置为确定多个不同图元的交点。在一些实施例中,TTU可以包括多个光线-图元测试路径,每个测试路径被配置为处理不同的图元。
图13中所示的流程图包括TTU 700接收请求光线和图元范围之间的最近交点的查询(步骤1310)。可以从SM 132接收查询,或者可以基于由TTU的光线-complet测试路径执行的光线-complet测试的结果来启动查询。
可以通过其三坐标原点、三坐标方向以及沿着光线的t参数的最小值和最大值来标识光线。可以在TTU中的堆栈管理块740的一个或更多个堆栈条目中标识查询的图元范围。在一个实施例中,光线-complet测试可以标识树的一个或更多个相交的叶节点,其指向图元范围或项目。图元范围可以是一组连续的图元,其从存储器块中的第n个图元开始并且运行零个或更多个块直到最后一个块的第m个图元。块可以是高速缓存线(例如,128B)。图元可以在高速缓存线中压缩,每个高速缓存线中具有不同数量的图元。图元范围可跨越不同数量的高速缓存线。
从存储器中检索图元范围(步骤1312)。可以从TTU存储器(例如,L0高速缓存750的三角形高速缓存754)或TTU外部的存储器140检索图元范围。可以在高速缓存线大小的块的连续组中提供图元范围。每个高速缓存线大小的块可以包括标识块内表达的几何形状类型和块中每个图元的图元类型的报头。
该方法包括测试图元范围中的图元与光线的相交(步骤1314)。因为具有图元范围的块可以以任何顺序编码多个不透明图元或α图元,并且图元范围可以跨越由TTU的存储器子系统以任意顺序返回的多个块,所以第一个测试的图元可能不是与光线原点最接近的图元。出于类似的原因,第一个测试的图元可能不是图元范围的存储器顺序中的第一个图元。
光线-三角形测试和变换块720可以测试图元与光线的相交。如果光线-三角形测试和变换块720确定交点,则光线-三角形测试和变换块720可以将关于交点的信息传递给IMU 722。测试图元的相交可以包括确定光线是否与由图元的顶点标识的区域相交。光线-三角形测试和变换块720可以在执行相交测试之前将光线变换到图元的对象空间坐标。
如果在图元和光线之间没有交点(步骤1316中为否),则可以从结果中省略图元,并且确定在待测范围内是否存在另一个图元(步骤1318)。如果在图元范围内存在要测试的另一个图元(步骤1318中为是),则在相同的块或与图元范围相关联的另一个块中,可以对下一个图元执行三角形-光线测试(步骤1314)。如果要测试的图元范围中没有其他图元(步骤1318中为否),则完成光线-三角形测试,并且可以将光线-三角形测试的结果发送到SM或TTU 700内部或外部的另一块启动查询(步骤1320)。返回结果(步骤1320)可以提供最接近光线原点的图元范围中的参数不透明交点和/或存储在队列中的一个或更多个α交点。对于确定相交的每个图元,结果可以包括三角形ID,以及t值和交点的坐标(例如,交点的重心坐标)。如果在图元范围中未标识出交点,则SM的结果将指示未找到交点。
如果在图元和光线之间存在交点(步骤1316中为是),则确定该图元是否是不透明图元(步骤1322)。该确定可以由IMU 722基于与图元相关联的α位来执行。如果交点是与不透明图元的交点(步骤1322中为是),则IMU 722可以确定不透明图元交点是否比存储在结果队列中的不透明交点更接近光线原点(步骤1324)。如果输入的不透明图元交点比先前在结果队列中存储的不透明图元交点更靠近光线原点(步骤1324中为是),则不透明图元交点将替换结果队列中先前存储的不透明图元交点(步骤1326)。类似地,如果在结果队列中没有存储不透明图元交点并且结果队列中没有α交点,则输入的不透明交点是与光线原点最近的交点并且将被存储在队列中(步骤1326)。
确定输入的不透明交点是否比存储在结果队列中的不透明交点更接近光线原点可以包括:IMU 722比较表示沿着光线的参数长度的交点的t值(沿着光线发生相交的点)。具有较小t值的交点可以存储在结果队列中,因为它更靠近光线原点并且沿着光线隐藏来自观察者的其他图元。将剔除具有较大参数长度的图元。
在确定哪个交点更近时(步骤1324),两个图元可以具有相同的参数交点值。“T-fighting”可能存在于相同三角形范围的两个三角形块中。在一个实施例中,无论哪个图元按存储器顺序先行,都将获胜并存储在结果队列中。其他实施例可以使用不同的机制来确定哪个三角形赢。
在一些示例性实施例中,当用于不透明图元的新交点存储在结果队列中时(步骤1326),可以将光线的长度缩短到不透明图元的交点的参数长度。以这种方式,当对其他图元重复光线相交测试时,如果输入的不透明或α交点的t值超出存储在结果队列中的不透明交点的t值,则TTU将不会在结果队列中记录输入的不透明或α交点。为了提供确定性结果(例如,当两个图元具有相同的t值时),可以仅在处理了整个图元范围之后缩短光线。在该实施例中,最近相交测试(步骤1324)可足以剔除更远的图元而不需要缩短光线,直到测试了图元范围中的所有图元的交点为止。
当新的不透明图元交点存储在结果队列中时(步骤1326),存储在结果队列中的任何α交点(其在参数上更远离光线的原点)可以在结果队列中无效(步骤1328)。可以基于相交图元的t值确定哪些α交点无效。例如,可以从结果队列中移除比新存储的不透明交点的t值具有更大的t值的结果队列中的α交点。在基于不透明交点的t值更新结果队列之后,如果存在任何剩余的α交点,则它们必须在参数上比存储在结果队列中的相交不透明交点更接近。
如果相交的不透明图元不比结果队列中先前存储的不透明交点更接近光线原点(步骤1324中为否),则从结果队列中省略相交的不透明图元并且确定是否存在任何额外的该范围内的图元(步骤1318)。如果在相同的块或与图元范围相关联的另一个块中图元范围中存在要测试的另一个图元(步骤1318中为是),则可以对下一个图元执行三角形测试(步骤1314)。如果图元范围中没有要测试的其他图元(步骤1318中为否),则完成图元范围的处理,并且可以将光线-三角形测试的结果发送到SM或发出查询的TTU的内部或外部的另一个块(步骤1320)。
因此,在不透明图元的交点之后,IMU单元不是返回由SM记录的图元交点,而是存储图元信息和图元被碰撞的距离。可以在TTU内部缩短光线,使得超出该不透明图元的任何项目或图元被剔除。在参数上位于不透明图元后面的任何先前相交的α图元都是无效的。在其他示例中,光线的长度可以由TTU维持,直到范围被测试并且在随后的查询中由SM缩短为止。
如果交点是与α图元的交点(步骤1322中为否),则IMU确定结果队列是否已满(步骤1330)。如果结果队列未满(步骤1330中为否),则可以将α交点添加到结果队列中(步骤1332)。当来自相同图元范围的其他α交点已经存储在结果队列中时,新的α交点可以基于在BVH中提供图元的存储器顺序存储在结果队列中。如果结果队列已满,如果输入的α交点在存储器顺序上比α交点更早,则输入的α交点可以替换来自相同图元范围的该α交点。
在将α交点添加到结果队列之后,确定该范围中是否存在任何额外的图元(步骤1334)。如果在图元范围中(在相同的块或与该图元范围相关联的另一个块中)有另一个图元要测试(步骤1334中为是),则可以对下一个三角形执行三角形-光线测试(步骤1314)。如果在图元范围中没有要测试的其他图元(步骤1334中为否),则可以将光线-三角形测试的结果发送到SM或TTU内部或外部的另一个块(步骤1336)。因此,在一个示例性实施例中,结果队列中的交点信息将不被返回到SM,直到处理了与该图元范围相关联的所有块。
如果结果队列已满(步骤1330中为是),则IMU确定新的α图元相交的存储器地址顺序是否早于已经存储在结果队列中相同图元范围内的任何α交点的存储器地址顺序(步骤1338)。如果输入的α交点的存储器地址顺序早于存储在结果队列中的相同图元范围的任何α交点的存储器地址顺序(步骤1338中为是),则IMU将用新的α交点替换结果队列中存储的α交点之一(步骤1340)。在存储新的α交点时,可以替换具有较高存储器地址的α图元的交点。因此,IMU将在存储器地址顺序中稍后出现的相同图元范围的相交的α图元之前插入来自存储器地址顺序中较早输入的相交α图元,而不管输入的α交点是否在参数上比之前存储在存储器地址顺序中的α交点更近或者更远。
在结果队列中存储相交的α图元之后(步骤1340),设置剩余α标志以指示在图元范围中存在未存储在结果队列中的额外α交点(步骤1350)。如果设置剩余α标志,则除了结果队列中存在的α碰撞之外,在图元范围中稍后按照存储器顺序找到其他α碰撞。在SM消耗结果队列中的α碰撞集之后,可能需要处理那些剩余的α碰撞。
在将α交点存储在结果队列中(步骤1340)并设置剩余α标志之后(步骤1350),确定该范围内是否存在任何额外的图元(步骤1334)。如果在相同的块或与该图元相关联的另一个块中在图元范围中存在要测试的另一个图元(步骤1334中为是),则可以对下一个图元执行光线-三角形测试(步骤1314)。如果要测试的图元范围中没有其他图元(步骤1334中为否),则完成图元范围的处理,并且可以将光线-三角形测试的结果发送到SM(步骤1336)或遍历可以继续。在一个实施例中,在对所述块组的一个块中的图元全部进行相交测试之后,递减待处理高速缓存线计数器。当待处理高速缓存线达到零时,已经处理了该组块的所有块。
如果输入的α交点的存储器地址不早于存储在结果队列中的相同图元范围的任何α交点的存储器地址顺序(步骤1338中为否),则存储在结果队列中的α交点将保持并且设置剩余α标志以指示图元范围中存在未存储在结果队列中的一个或更多个额外的α交点(步骤1350)。如果设置了剩余α标志,则除了结果队列中存在的α碰撞之外,在图元范围中稍后以存储器顺序找到其他α碰撞。
可以重复图13中所示的操作,直到测试了图元范围中的所有三角形与光线的相交。在测试了图元范围中的所有三角形之后,可以将结果提供给SM或另一个块以进行进一步处理(步骤1336)。如图13所示,如果所有相交的α三角形都不能适合结果队列,则TTU可以返回相交的α三角形的信息,从先前以存储器地址顺序找到的相交的α三角形开始,而不管其他α交点是否在参数上更接近或远离光线原点。TTU以存储器地址顺序向SM提供当前交点信息以及光线和堆栈信息,以便SM在接收到结果后可以发出另一个查询。
TTU可以基于图13中所示的操作的进度来修改堆栈中的遍历状态。当测试了该范围内的所有三角形时,顶部堆栈条目(参考当前图元范围)可以将剔除不透明(cullOpaque)设置为真(TRUE)并且将起始图元索引前进到1+来自当前图元范围的存储在结果队列中的最大α图元索引(步骤1318中为否或步骤1334中为否)。可以利用结果队列将修改的顶部堆栈条目和光线发送到SM(步骤1336或1320),以提供堆栈条目信息以及SM对TTU问题的后续查询。
将光线-三角形测试的结果返回到SM 132(步骤1336)可以包括向SM 132指示在图元范围中存在因为队列有限的大小未被包括在结果队列中的额外α交点。IMU可以被配置为在以下情况下设置剩余α位:当由于标识出存储器顺序中较早的α交点而从结果队列中移除α交点的结果时,或者当已标识出α交点但由于在存储器顺序中位于靠后然后已经在结果队列中存储了α交点而未添加到结果队列中时(步骤1350)。剩余的α位被发送到SM 132,使得SM 132可以发出另一个光线-三角形相交查询。结果队列连同遍历堆栈信息被发送到SM132,其包含继续遍历以确定图元范围中的任何剩余α交点所需的状态。
SM 132可以基于与返回结果相关地执行的处理或不执行任何处理来发出后续查询。由SM 132发出的后续查询将包括从TTU接收的堆栈信息,其将确保后续查询中的图元范围不包括已经返回到SM 132的相交的α图元。如果SM确定一个或更多个相交的α图元将在比不透明图元交点更接近光线原点的参数距离处阻挡光线,则后续查询可以更新光线长度为不透明交点的参数长度或者α交点之一。如果SM 132确定相交的α三角形没有阻挡光线,则SM 132可以在后续查询中保持相同的光线参数,但是修改要测试的三角形的范围。
在具有包括α交点和不透明交点的一系列三角形的一个实施例中,返回到SM 132的光线-三角形测试的结果(步骤1336)可以包括一个不透明交点和一个或更多个α交点。返回到SM 132的不透明交点将比图元范围中的任何其他不透明交点在参数上更接近光线原点。返回到SM 132的一个或更多个α交点在参数上将比结果队列中的任何不透明交点更接近,但是将按照存储器顺序存储在结果队列中,它们在树形数据结构中提供。
在一个实施例中,其中结果队列包括用于不透明交点或α交点的单个条目,如果确定具有α图元的交点(步骤1322中为否)并且不透明交点存储在结果队列的单个条目中,然后结果队列可以与在将α交点存储在结果队列中之前如何继续遍历的信息一起返回到SM132。在将不透明交点返回到SM 132之后,TTU 700可以从SM 132接收另一个查询。另一个查询可以包括修改的查询,其将不考虑该范围中的任何不透明三角形,因为已经向SM提供了最接近的碰撞不透明图元。另一个查询还可以将光线的长度更新为交点的参数长度,使得空间上位于不透明图元后面的任何图元不与光线相交。
在该示例中,TTU 700将存储的交点返回到调用线程,其请求再次询问光线-三角形查询,因为存在需要测试的更多三角形。SM 132可以使用关于如何继续遍历的信息来向TTU 700发出查询以继续针对图元范围的光线相交测试,其从存储器中返回的不透明图元交点后面的图元开始。以这种方式,TTU 700将再次标识α图元交点,但是这次将不存在存储在结果队列中的不透明交点,并且可以将α交点返回到SM 132以进行进一步处理(例如,以确定是否存在真实碰撞)。
一些实现方式可以使用IMU中的大缓冲器来在返回到SM之前累积单个不透明交点和/或多个α交点。鉴于不透明图元的性质,永远不必累积多于一个图元。这进一步减少了TTU和SM之间的返回次数。一些实现也可以使用大缓冲区来记录项目范围交点并继续遍历超出第一个标识的项目范围,否则在遇到项目范围时可以在遍历中途返回。
主要差异以及硬件解决方案的使用使得我们能够隐藏那些可证明能够被隐藏而对结果场景没有功能性影响同时提供确定性结果的项目或三角形。可以基于在BVH的中途遍历执行的基于α的处理来确定可以隐藏哪些图元而对结果场景没有功能性影响。通过在遍历中途处理基于α的处理,不必每次都从头开始重新发射光线。
本公开的实施例不同于软件实现的方法,其中仅在针对整个三角形范围确定BVH中的最接近碰撞之后评估纹理或着色函数。在软件实现的方法中,评估最接近的碰撞以确定是否有任何东西阻挡光,然后着色器启动新的光线。相反,本发明的实施例提供中间遍历α处理,其可减少需要进行的光线-投射查询的数量。
在一个示例性实施例中,TTU可以被配置为在处理α图元以确定可能的交点之前处理所有不透明图元以确定最接近的不透明碰撞。在该实施例中,在测试所有不透明图元之后,可以将光线缩短到最接近的不透明碰撞的参数长度,并且将确定与不透明交点相比在参数上位于更远离原点的任何α图元将不与光线相交。
在处理图元范围中的图元之后,TTU可以继续遍历并停留在TTU中,而不是每次完成找到碰撞的图元范围处理时将结果队列返回到SM。在一些实施例中,将存储在结果队列中的交点信息发送到可以至少保持到已经处理了图元范围的最后一个块的最后一个图元之后。在以下情况下TTU可以继续遍历并推迟将结果队列(其中具有碰撞)返回到SM:当结果缓冲区中只有不透明碰撞并且没有标志指示图元范围中找到的交点因为结果队列已满而被丢弃或无效(例如,剩余α)时,或者当结果队列中有α并且没有标志指示图元范围中找到的交点因为结果队列已满(例如,剩余α
(remainingAlphas))且结果缓冲区当前未满而被丢弃或无效时。在一些实施例中,TTU可以继续遍历并推迟将结果队列(其中具有碰撞)返回到SM,只要模式位表示可以继续遍历(例如,没有设置第一碰撞标志上终止(terminateOnFirstHit)标志),并且当遍历完成时TTU返回结果队列。
参考基于图元的升序存储器地址顺序以确定性方式提供相交结果来讨论图13。在其他示例性实施例中,可以通过以降序存储器地址顺序返回图元交点来确定性地提供结果。在其他示例性实施例中,可以通过以α图元在空间上位于空间的顺序返回图元交点来确定性地提供结果,而不管存储器子系统将块返回到TTU以进行处理的顺序。
在一些示例性实施例中,查询可包括用于修改如何处理不透明和/或α三角形的信息。例如,查询可以指示TTU将不透明三角形视为α三角形和/或将α三角形视为不透明三角形。
在一些示例中,通过提供每光线光线操作集(每个光线操作被称为“RayOp”)、相关光线参数、光线标志和模式标志(基于该标志,可以在每光线和/或每交点的基础上改变TTU遍历的默认行为)可以在遍历过程中包括查询特定的动态和可编程变化。关于设置每光线操作的更多细节在题为“树遍历的查询特定行为修改(Query-Specific BehavioralModification of Tree Traversal)”的共同未决的美国申请No.(卷号:6610-0035/18-SC-0144)中提供,其在此通过引用并入本文。光线标志设置可以确定如何处理α三角形和/或不透明三角形。光线标志设置可以覆写三角形块中的α位设置。因此,三角形块中的位可能不是用于指定在RTT内是否应将三角形视为不透明或α的确定位。如何处理三角形可以通过每光线模式位来修改以具有不同的行为。
光线标志设置可以指示TTU将所有不透明三角形视为给定查询的α三角形,使得相交结果将每个相交的α三角形和不透明三角形返回到SM。在另一示例中,光线标志设置可以指示TTU将所有α三角形视为给定查询的不透明三角形以返回最接近的相交三角形(不管最近的交点是否是与不透明三角形或α三角形的交点)。
示例性光线三角形遍历提供确定性结果
图14、图15A-图15C、图16A-图16C和17A-图17D示出了返回在存储在存储器中的多个块中标识的一系列三角形的相交结果的非限制性示例性实施例。在图14所示的示例中,三角形范围内的相交三角形的数量不超过结果队列中的条目数。在图15A-图15C和图16A-图16C所示的示例中,三角形范围中的相交三角形的数量超过结果队列中的条目的数量,并且需要多个中间遍历返回以将相交结果返回到SM。图14、图15A-图15C和图16A-图16C示出了用于存储不透明和α相交结果的独立队列。在其他实施例中,结果队列可以实现为具有不透明/α标记的单个队列。图17A-图17D示出了具有单个条目结果队列的示例性实施例。
参考图14,在存储在存储器系统中的三个高速缓存线大小的块(块0,块1和块2)上标识要测试与光线相交的一系列三角形。TTU的光线-三角形相交测试单元响应于对块的请求从存储器系统接收块。从存储器系统提供块的顺序可以取决于所请求的块位于BVH的层次中的何处和/或所请求的块位于存储器系统的层次中的何处。在图14所示的例子中,首先提供块1,然后提供块2,最后提供块0到TTU的光线-三角形相交单元。TTU被配置为按照从存储器系统接收的顺序处理块中标识的三角形,以避免与等待接收三角形范围的每个块相关联的延迟。在示例性实施例中,TTU中的光线-三角形相交测试单元按照从TTU的L0高速缓存接收它们的顺序处理在块中标识的三角形。
如图13所示,首先从存储器系统接收块1,并且处理块1中标识的三角形(例如,按照它们在块中排列的顺序)以确定是否有任何三角形与光线相交。TTU确定不透明三角形TriO_b1和α三角形TriA_b1在块1中相交。TTU在结果队列中存储不透明三角形TriO_b1和α三角形TriA_b1的交点,并继续处理在下一个接收块中标识的三角形(即块2)。
由于α三角形TriA_b1在空间上位于光线的原点和相交的不透明三角形TriO_b1之间,因此将α三角形TriA_b1添加到结果队列中。如果α三角形TriA_b1位于不透明三角形TriO_b1后面,则它不会被添加到结果队列中。可以在空间上与光线相交但在空间上位于不透明三角形TriO_b1后面的任何α三角形都不包括在结果队列中。
处理块2中标识的三角形以确定是否有任何三角形与光线相交。TTU确定α三角形TriA_b2与块2中的光线相交。TTU在结果队列中存储α三角形TriA_b2交点,并继续处理在下一个接收块(即块0)中标识的三角形。
处理块0中标识的三角形以确定是否有任何三角形与光线相交。TTU确定α三角形TriA_b0与块0中的光线相交。TTU在结果队列中存储α三角形TriA_b0交点。α三角形TriA_b0是一个三角形,它在空间上位于光线的原点和相交的不透明三角形TriO_b1之间。
在处理了所有块和块中标识的三角形之后,可以将结果队列中的相交结果提供给SM以进行进一步处理。相交结果包括单个不透明三角形交点(不透明三角形TriO_b1),其是与光线原点最接近的相交不透明三角形,以及多个α三角形,其在空间上位于光线原点和不透明三角形之间。如图14所示,可以以存储器地址顺序将α三角形返回到SM。返回到SM的α三角形可能需要由SM进一步处理,以基于与α三角形相关联的纹理信息来确定是否存在碰撞。
在图14所示的示例中,结果队列包括足够的空间来存储所有相交结果。然而,在一些示例性实施例中,结果队列大小可以被限制(例如,为单个条目或几个条目)以节省芯片面积,和/或相交结果可以超过队列的大小。在这些情况下,TTU将需要执行多次中间遍历返回至SM以提供所有相交结果。
如果以由TTU确定它们的顺序提供相交结果,则提供给SM的相交结果的顺序可以基于标识三角形范围的哪些块首先由TTU处理而变化。基于它们被确定的顺序返回相交结果可以不仅改变相交三角形被提供给SM的顺序,而且还改变哪些三角形返回到SM。例如,如果块2包括五个α三角形,并且块0在块1之前被处理,则在确定不透明三角形Tri0_b1将阻挡来自到达大多数三角形的光线之前,可以将四个α三角形添加到队列并返回到SM。
图15A-图15C、图16A-图16C和17A-图17D示出了使用针对图14中所示的相同三角形范围的小结果队列返回相交结果的方法。在图15A-图15C和图16A-图16C中,结果队列包括不透明三角形交点的单个条目和α三角形交点的单个条目。图17A-图17D示出了具有单个条目的结果队列。图15A-图15C和图16A-图16C示出了从存储器接收块但是向SM提供相同的最终结果的不同顺序。
在图15A所示的示例中,首先提供块1,然后提供块2,并且最后将块0提供给TTU的光线-三角形相交单元。如图15A所示,首先从存储器系统接收块1,并且处理块1中标识的三角形以确定是否有任何三角形与光线相交。TTU确定不透明三角形TriO_b1和α三角形TriA_b1在块1中相交。TTU在结果队列中存储不透明三角形TriO_b1和α三角形TriA_b1交点,并继续处理在下一个接收块中标识的三角形(即块2)。
处理块2中标识的三角形以确定是否有任何三角形与光线相交。TTU确定α三角形TriA_b2与块2中的光线相交。但是,因为结果队列中没有空间用于额外的相交结果,并且以存储器顺序稍后找到α三角形TriA_b2(例如,在块1之后),α三角形TriA_b2未添加到结果队列中,并且处理下一个三角形/块的相交。由于标识出α三角形交点但未添加到结果队列中,因此设置剩余α标志以指示未包括在结果队列中的相交的α三角形仍然存在于三角形范围内。
在处理块2中的三角形之后,TTU继续处理在下一个接收块(即块0)中标识的三角形。TTU确定在块0中α三角形TriA_b0与光线相交。因为按照存储器顺序α三角形TriA_b0位于存储在结果队列中的α三角形TriA-b1之前,所以结果队列中的α三角形TriA-b1的交点信息被替换为α三角形TriA_b0的交点信息。
在处理了块中标识的所有块和三角形之后,可以将结果队列中的相交结果提供给SM以进行进一步处理。相交结果包括单个不透明三角形交点(不透明三角形TriO_b1),它是与光线原点最接近的相交不透明三角形,以及单个α三角形,它是存储器顺序中的第一个相交的α三角形。相交结果提供有遍历堆栈信息,其包含继续遍历以确定三角形范围中的任何剩余的α三角形交点所需的状态。基于遍历堆栈,SM向TTU发出查询以找到三角形范围中的其他α三角形交点。在查询中,三角形范围不包括已经提供给SM的相交的α三角形。查询可以为该图元范围设置剔除不透明(cullOpaque)标志,以便不再测试不透明三角形,因为最近的不透明交点已经返回到SM。
图15B示出了第二查询,其中对块1和块2中标识的三角形范围测试相交。在这种情况下,块0未被测试,因为从块0返回到SM的相交的α三角形可能是存储器顺序中的块0的最后三角形,并且遍历堆栈不再包括块0。在图15B所示的示例中,首先提供块1,然后提供块2到光线-三角形测试单元。处理块1中标识的三角形以确定是否有任何三角形与光线相交。TTU确定在块1中相交的α三角形TriA_b1。此时可能不会测试不透明三角形,因为设置了cullOpaque标志。TTU将α三角形TriA_b1交点存储在结果队列中,并继续处理在下一个接收块(即,块2)中标识的三角形。
处理块2中标识的三角形以确定是否有任何三角形与光线相交。TTU确定α三角形TriA_b2与块2中的光线相交。但是,如前所述,因为结果队列中没有空间用于额外的相交结果,并且以存储器顺序稍后找到α三角形TriA_b2(例如,在块1之后),α三角形TriA_b2未添加到结果队列中。同样,因为标识出α三角形交点但未添加到结果队列中,所以设置剩余α标志以指示未包括在结果队列中的相交的α三角形仍然存在于三角形范围中。
在处理了块中标识的所有块和三角形之后,将结果队列中的相交结果提供给SM以进行进一步处理。相交结果包括单个α三角形TriA-b1,它是存储器顺序中的第二个相交的α三角形。相交结果提供有遍历堆栈信息,其包含继续遍历以确定三角形范围中的任何剩余的α三角形交点所需的状态。基于遍历堆栈,SM向TTU发出另一个查询以找到三角形范围内的其他α三角形交点。
图15C示出了第三查询,其中测试在块1和块2中标识的三角形范围的相交。在α三角形TriA-b1之前的三角形未在块1中进行测试,因为随着新查询返回的遍历堆栈将指向刚刚在TriA_b1后面返回到SM的三角形。在图15C所示的示例中,首先提供块1,然后提供块2。处理块1中标识的三角形以确定是否有任何三角形与光线相交。因为已经标识了块1中的所有相交的三角形并且返回到SM,所以在块1中没有标识出其他相交的三角形,并且TTU继续处理在下一个接收的块(即,块2)中标识的三角形。处理块2中标识的三角形以确定是否有任何三角形与光线相交。TTU确定在块2中α三角形TriA_b2与光线相交,并且没有其他三角形相交。此时,未设置剩余α(remainingAlphas)标志,并将结果队列返回给SM进行进一步处理。
图15A-图15C示出了用于存储不透明相交和α相交结果的独立队列,但是本公开的实施例不限于此。在一些实施例中,结果队列可以实现为具有不透明/α标记的单个队列。例如,图15B中具有两个条目的结果队列可以将来自块1(TriA_b1)的相交结果存储在结果队列的第一条目中,并将来自块2(TriA_b2)的相交结果存储在结果队列的第二条目中。为每个条目设置的标志可以指示该条目是不透明交点还是α交点。
图16A-图16C示出了与图15A-图15C相比以与存储器不同的顺序接收的多个块中标识的三角形的处理。在图16A-图16C中,首先接收块0,然后接收块2,最后接收块1。如图16A-图16C所示,当以不同的顺序接收和处理块时,提供给SM的相交结果以与图15A-图15C所示的示例相同的顺序提供。在图16A-图16C中执行以上关于图15A-图15C描述的类似过程。图16A-图16C示出了用于存储不透明相交和α相交结果的独立队列,但是本公开的实施例不限于此。在一些实施例中,结果队列可以实现为具有不透明/α标记的单个队列。例如,图16B中具有两个条目的结果队列可以将来自块1(TriA_b1)的相交结果存储在结果队列的第一条目中,并将来自块2(TriA_b2)的相交结果存储在结果队列的第二条目中。为每个条目设置的标志可以指示该条目是不透明交点还是α交点。
图17A-图17D示出了以参考图16A-图16C接收的顺序接收的多个块中标识的三角形的处理。在参考图17A-图17D所示的实现中,结果队列中的单个条目用于不透明和α结果。向结果队列中的条目提供不透明或α标记,以指示结果是α交点还是不透明交点。
在图17A中,首先从存储器系统接收块0,并且处理块0中标识的三角形以确定是否有任何三角形与光线相交。TTU确定α三角形TriA_b0在块0中相交。TTU将α三角形TriA_b0交点存储在结果队列中,并按照它们从存储器接收的顺序继续处理剩余块(即块1和块2)中标识的三角形。在块1和块2中标识其他α交点和不透明交点。当处理每个块时,块中的各个图元按存储器顺序处理。当每个α交点到达时,只要有容量,就会将其插入到结果队列中。如果当块1和块2的交点到达时结果队列已满,则这些交点不会替换块0中的α交点(已存储在结果队列中,因为块1和块2的交点来自存储器顺序中靠后的图元)。如图17A所示,块1中的不透明交点(TriO_b1)可以替换存储在结果队列中的α三角形交点,即使它按照存储器顺序较早找到。
在处理块0-2之后,结果队列中的相交结果被提供给具有遍历堆栈信息的SM,其包含继续遍历以确定三角形范围中的任何剩余的α三角形交点所需的状态。相交结果可以包括在返回时指向TriA_b0(下一个标识的交点)的堆栈条目。基于遍历堆栈,SM向TTU发出查询以找到三角形范围中的其他三角形交点。在查询中,可以为该图元范围设置cullOpaque标志,以便不再测试不透明三角形,因为最近的不透明交点已经返回到SM。
图17B示出了第二查询,其中从块0中的条目TriA_b0开始的三角形范围被测试,接着是块1和块2中的三角形。此时,可以不测试不透明三角形,因为设置了cullOpaque标记。TTU从TriA_b0开始测试块0中的三角形。TTU将α三角形TriA_b0交点存储在结果队列中,并按照它们被接收的顺序继续处理在其他接收块(即块1和2)中标识的三角形。由于按照存储器顺序未找到更早的其他块中的α交点,因此结果队列中已存储的结果不会被其他已标识的交点替换,并且设置remainingAlphas标志。
结果队列(即,TriA_b0)中的相交结果被提供给具有遍历堆栈信息的SM,其包含继续遍历以确定三角形范围中的任何剩余的α三角形交点所需的状态。相交结果可以包括在返回时指向TriA_b0或TriA_b1(例如,下一个标识的α交点)的堆栈条目。基于遍历堆栈,SM向TTU发出另一个查询以找到三角形范围中的其他三角形交点。
图17C示出了第三查询,其中在块1和块2中标识的三角形范围被测试相交。在图17C所示的示例中,首先提供块2,然后提供块1到光线-三角形测试单元。处理块2中标识的三角形以确定是否有任何三角形与光线相交。TTU确定α三角形TriA_b2在块2中相交并将α三角形TriA_b2交点存储在结果队列中。TTU处理块2中的剩余三角形和下一个接收块(即块1)中标识的三角形。TTU确定三角形TriA_b1在块1中相交。TTU将α三角形TriA_b1存储在结果队列中(通过替换已经存储的α交点TriA_b2),因为与TriA_b2相比,按照存储器顺序更早找到α三角形TriA_b1。
结果队列的相交结果(即,TriA_b1)被提供给具有遍历堆栈信息的SM,其包含继续遍历以确定三角形范围中的任何剩余的α三角形交点所需的状态。相交结果可以包括在返回时指向TriA_b1或TriA_b2(例如,下一个标识的α交点)的堆栈条目。基于遍历堆栈,SM向TTU发出另一个查询以找到三角形范围中的其他三角形交点。
图17D示出了第四查询,其中块2中标识的三角形范围被测试相交。在图17D所示的示例中,查询指向在先前查询中标识的下一个交点(TriA_b2)。TTU处理块2中标识的三角形以确定相交的三角形。TTU将标识的α三角形交点(TriA_b2)存储在结果队列中。TTU处理块2中的剩余三角形。因为块2中没有其他三角形与光线相交并且处理了范围内的所有块,此时未设置remainingAlphas标志且光线已完成处理图元范围。如果结果队列已满或结果队列包含光线的α交点,则结果可以返回到SM以进行进一步处理。否则,如果需要,可以缩短光线并且光线可以停留在TTU内并开始下一个遍历步骤。在参考图17A-图17D所示的示例中,将按以下顺序返回四个:TriO_b1,TriA_b0,TriA_b1和TriA_b2。
如果在图元范围内找到的α交点在继续遍历之前返回到SM,如以上示例中所示,则TTU接收块的顺序和/或结果队列中条目的数量不改变通过示例性实施例将相交结果提供给SM的顺序。队列中的条目数可以改变返回的数量,但是向SM提供三角形相交的顺序可以保持不变。因为本申请中公开的示例性实施例即使在结果队列中具有不同数量的条目也可以提供确定性结果,在一些示例性实施例中,可以基于可用资源动态地改变结果队列的大小而不改变SM将如何看到结果。如果在图元范围内找到的α交点保留在结果队列中,而不是在图元范围处理完成时将它们返回到SM,后续遍历可能会产生更接近的不透明交点,这会使α碰撞无效并且无需将它们返回到SM。在这些情况下,队列中的条目数将影响返回的数量和返回到SM的交点的数量,但是,这种消除被遮挡的图元将不会对可视化虚拟场景产生功能性影响。
在图15A-图15C、图16A-图16C和图17A-图17D中,每次执行查询时,接收块的顺序被示出为相同,但不限于此。在一些实施例中,顺序可以根据处理查询时存储器系统的不同部分中的块的可用性而改变。
此外,参考图15A-图15C、图16A-图16C和图17A-图17D描述的过程不包括在向TTU发出后续查询之前处理在遍历中途返回的α图元的描述。在一些非限制性示例性实施例中,在向TTU发出后续查询之前,SM可以执行与α三角形相关的处理以确定该光线是否将被α三角形阻挡。如果确定光线被阻挡,则SM可以在随后的查询中修改光线的长度。如果SM执行与α交点相关的处理并且发出基于处理结果的查询,则上面参考图15A-图15C、图16A-图16C和图17A-图17D描述的操作将类似地提供确定性结果。
在参考图14、图15A-图15C、图16A-图16C和图17A-图17D讨论的示例中,通过以升序存储器地址顺序返回相交的α三角形来向SM提供确定性结果。在其他非限制性示例性实施例中,可以应用类似的操作以基于其他标准提供确定性结果。例如,通过基于降序存储器地址顺序返回结果,可以向SM提供相交三角形的确定性结果,而不管TTU处理三角形的顺序如何。在另一示例中,通过基于三角形相对于光线原点的空间位置返回结果,可以向SM提供相交三角形的确定性结果,而不管TTU处理三角形的顺序如何。
在提供可以存储多个交点的结果队列并且在不超过结果队列容量的情况下找到α碰撞的实施例中,TTU可以被配置为保留α交点而不是立即将它们返回到SM。这样做的动机是随后的遍历可能会遇到更接近的不透明碰撞,这会使保留的α碰撞无效,从而消除不必要的同步。在该实施例中,当在结果队列已满时处理输入的α碰撞时,如果输入的α碰撞按照存储器顺序较早出现,则输入的α碰撞可以替换结果队列中来自相同的图元范围的交点作为输入的α碰撞。在图元处理由于在遍历中后面发现的不透明碰撞而被消除之后保留了α碰撞的情况下,结果队列大小的改变将改变返回的数量和返回的交点的数量,但不影响结果图像的功能正确性。
具有确定性结果的更具体的示例性光线图元遍历
如上所述,不透明图元的光线交点明确地遮挡其他进一步沿着光线的潜在交点。α图元的光线交点可能需要额外的流式处理器计算来计数或解决透明度、修剪、位移、构造实体几何或其他效果。当计算光线和由可以包含不透明图元和α图元的多个连续存储器块组成的图元范围之间的最近交点时,期望提供确定性结果,同时从结果中消除对于对可视化虚拟场景没有功能影响的结果。本公开的示例性实施例提供了硬件电路,其被配置为产生确定性结果,而不管存储器子系统将图元范围块返回到TTU的顺序,同时机会性地消除位于沿着光线长度更远的α交点而不是更近的不透明交点。
虽然其他光线追踪渲染架构支持透明度或修剪效果(其需要在从修剪点或透明点着色之后发射光线),但是本申请的示例性实施例允许具有可编程透明度的内容或在遍历中途评估的修剪效果。示例性实施例提供固定功能遍历的性能而不牺牲上下文灵活性或性能,或者需要追踪额外的光线。示例性实施例改善了光线追踪的渲染性能并确保具有α图元和不透明图元的场景中的可靠图像质量和稳定性。结果队列允许产品规划人员交换性能区域(较大的结果队列允许TTU延迟并可能避免昂贵的同步)。通过在遍历中途评估图元的修剪或透明度,我们避免了在修剪或透明着色片段时重新发出光线的开销。
在压缩加速数据结构中,一个或更多个逻辑I节点或叶节点存储在高速缓存线大小的压缩块(Complet)中,每个压缩块编码公共叶型(LeafType),子Complet指针(CompletPointer),子叶指针(LeafPointer),第一子叶的第一图元的索引,以及编码定义几何形状的系数的每子数据,其限定子叶数据或后代叶数据的范围,以及枚举在相对于LeafPointer(或前一个子叶的末尾)表示的连续的一组块中编码的图元范围的数据。图元范围就是一个这样的叶型。如果LeafType=图元范围,那么每子位包括一个α位(指示该范围中是否存在任何α图元),高速缓存线的数量以及下一个叶节点的第一图元开始索引。
图元范围内的每个高速缓存线大小的块具有报头,该报头标识在块内表达的几何的类型和编码方案(例如,压缩的三角形),块中的图元的数量(减1),以及一组ForceNoCull位,其指示是否应该对块中的每个图元禁用剔除,以及一组α位,其针对块中的每个图元,指示该图元是α图元还是不透明图元。
当光线-complet测试(RCT)找到其边界几何被光线碰撞的第一叶节点子节点时,RCT中的遍历逻辑将第一堆栈条目推送到光线堆栈的顶部,其内容:
·将堆栈条目标识为图元范围
·指定
o addrLast(图元范围的最后一条线的地址),
o triIdx(范围的第一个高速缓存线中的第一个图元的索引),
o triEnd(1加最后一个高速缓存线中最后一个图元的索引,或者一个零,以指示该范围运行到最后一个高速缓存线的末尾),以及
o线(范围中连续的高速缓存线的数量加1,除非triEnd=0,在这种情况下,线是三角形范围所触及的连续高速缓存线的数量)。
每个堆栈条目还可以包括位co(剔除不透明碰撞,Cull Opaque Hits)。
如果协处理器采用短堆栈遍历,则它将仅将直接引用图元范围的堆栈条目推送到堆栈的顶部或者在相同的遍历步骤中将下面其他叶子节点推送到堆栈顶部。如果查询规定应该在一个或更多个I节点(其后代可能推送足够的堆栈条目以溢出堆栈)之后推送图元范围,或者如果推送图元范围将超过堆栈的容量并导致剩余的I-节点要“丢失”,协处理器反而将推送间接引用图元范围的延续节点(continuation node)(作为其父I节点的第N个子节点),因为与图元范围不同,父I节点具有父指针,如果必要的话,其可以用于在图元范围和堆栈顶部的所有叶节点完成处理后继续遍历。
当堆栈管理单元(SMU)从遍历堆栈的顶部弹出图元范围堆栈条目时,SMU通过发送激活请求到图元调度器来通知图元调度器光线已准备好被调度用于针对图元范围的相交测试。图元调度器记录一个位,其指示已请求图元激活。当图元调度器具有足够的SMU和分派条目信用(Dispatch Entry Credits)时,图元调度器将向栈管理单元发送堆栈顶部叶查询。堆栈管理单元将向图元调度器发送顶部叶返回(TopLeafReturn),其包括光线的光线槽索引,addrLast,triIdx,triEnd,lines,rayOpPass,剔除不透明(CullOpaque)和剔除α(CullAlpha)。图元调度器将这些值记录到图元调度器分派队列中的条目中。
出于由于RayOps而进行剔除的目的,将RayOp测试结果与来自光线管理单元(RMU)中存储的光线标志的那些模式位一起传递到光线-三角形测试块(RTT)。堆栈条目中的剔除不透明和剔除α位可以不同地使用。如果complet没有为该子项设置'α'标志,则可以设置Cull Alpha(ca)。在RTT执行后可以设置Cull Opaque(co),并且返回不透明的三角形与剩余α设置。最后一个条件是在光线-complet测试/遍历逻辑(RCT/TL)中设置Cull Alpha和Cull Opaque,其由SMU解释为图元范围,该图元范围应返回至SM而不是本地处理。在处理图元范围的过程中,当将光线返回到流式处理器以传递α交点时,IMU可以覆盖TriIdx或CullOpaque字段的值,以便当流式处理器重新提交光线到TTU时,如果已经由三角形范围处理了所有不透明图元,交点测试会跳过任何已经返回到流式处理器的α图元或所有不透明图元。
为了处理不同的图元碰撞类型,TTU的相交管理单元维护结果队列数据结构,该结构包含用于一个不透明图元交点或一个α图元交点的每个光线的存储,以及用于额外α交点的零个或多个附加条目。如果需要SM干预(例如,如果在单个三角形范围内找到的α碰撞数超过结果队列的α碰撞的存储容量),则在查询完成时或在遍历中途时可以将结果队列返回到SM。
每个结果队列条目指定碰撞类型和参数长度,其指定沿着光线发生碰撞的点和碰撞的属性,例如SM可以使用的实例ID、材料ID或图元ID,以选择特定的材质着色器和一组资源绑定,以及在着色期间SM可以使用的图元ID和(u,v)坐标,以检索和内插属性或样本纹理。
因为图元块可以以任何顺序编码多个不透明图元或α图元,并且因为图元范围可以跨越由存储器子系统以任意顺序返回的多个块,所以TTU具有确保查询产生确定性结果的机制,而不管图元范围中块的存储器返回顺序:
o TTU维护每个查询的状态,该状态追踪图元块的处理进度。
■初始化的标志在图元范围之间被设置为假,并在结果队列从基本范围接收到第一图元时设置为真。
■待处理高速缓存线的计数被初始化为要在图元范围中处理的剩余块的数量。
■remainingAlphas标志指示除了存储在结果队列中的那些之外,图元范围中是否还有其他α碰撞。
■碰撞更新标志指示是否在图元范围内找到了碰撞。
o如果t值超出不透明交点的t值,TTU将不会在结果队列中记录输入的不透明交点或α交点。
o TTU将图元范围中按照存储器地址顺序出现较早的输入α碰撞插入到相同的图元范围中按照存储器地址顺序中出现较晚的α碰撞之前,而不管输入的α碰撞比时间上较早但按照存储器地址顺序较晚的碰撞在参数上更近或更远。
o如果没有可用的条目来存储输入的按照存储器地址顺序较早的α碰撞,则输入的碰撞将替换在时间上较早但按照存储器地址顺序较晚的α碰撞,并将remainingAlphas设置为真。
o如果输入的α碰撞比同一个图元范围中的不透明碰撞在参数上更近,但是没有可用的条目来存储输入的α碰撞(即它们被存储器顺序中较早的α碰撞占用),TTU将会丢弃输入的α碰撞,保留不透明碰撞,并将remainingAlphas设置为真。
o如果输入的不透明碰撞在参数上比结果队列中的任何α碰撞更近,则TTU将使结果队列中的那些α碰撞无效,其在参数上比输入的不透明碰撞更远。TTU将存储输入的不透明碰撞。但是,在这种情况下,不会清除remainingAlphas标志。
o如果输入的不透明碰撞的参数长度与存储在结果队列中的不透明碰撞的参数长度相同,则图元范围中存储器排序较早的碰撞将赢得打破平局替换存储器排序中较晚的不透明碰撞。
o每个块完成后,待处理高速缓存线将递减。
o当待处理高速缓存线达到零时,所有块都已处理完毕,
■此时,如果结果队列中存在不透明碰撞,则它将是遍历期间遇到的参数上最近的不透明碰撞。
■如果结果队列中有任何α碰撞,它们将比结果队列中的任何不透明碰撞参数上更接近,但将按存储器顺序存储在结果队列中。
·如果设置了remainingAlphas,那么除了结果队列中存在的α碰撞之外,在图元范围中会找到存储器顺序中靠后的其他α碰撞。在SM消耗结果队列中的α碰撞集之后,必须处理剩余的α碰撞。TTU修改遍历状态,以便顶部堆栈条目(引用当前图元范围)将cullOpaque设置为真,并将起始图元索引前进到1+来自存储在结果队列中的当前图元范围的最大α三角形索引。
·TTU将光线、其结果队列和遍历状态返回到流式处理器。
·流式处理器执行任何所需的α测试操作,并过滤掉未通过α测试的任何α交点,以及超出通过α测试的最近α交点的任何不透明交点或α交点,并在查询的父线程可访问的寄存器或存储器中记录任何有效碰撞,然后重新提交查询以恢复遍历。
■如果未设置remainingAlphas
·如果查询在结果队列中仍有未分配的条目,则TTU可以继续遍历而不返回SM。
·如果查询在结果队列中没有剩余的未分配条目,并且结果队列中有一个或更多个α碰撞,则TTU将查询及其关联的遍历状态返回给SM,以便SM可以:
o执行任何α测试
o过滤掉未通过α测试的任何α碰撞,并过滤掉超出通过α测试的最接近的不透明碰撞或α碰撞的任何不透明碰撞或α碰撞。
o使用可能缩短的光线(如有必要)重新提交查询以恢复遍历。
结果队列执行可见表面合成功能,类似于光栅图形中的深度缓冲器以可见性顺序对光栅化片段进行排序的方式。结果队列的容量允许架构交换区域以提高效率,从而降低向SM返回α碰撞(或者也可能是项目范围碰撞)所需的昂贵同步的频率。通过以存储器地址顺序而不是存储器子系统返回块的顺序处理图元块中的α碰撞,TTU能够产生确定性结果而不约束存储器子系统性能。
加速结构层次中的每个压缩块具有一个或更多个子节点,其中一些可以是树中的其他内部节点,并且一些是由存储器的多个块组成的TTU遍历的加速数据结构的上下文中的叶节点,包含两个不透明图元(其光线交点明确地遮挡进一步沿着光线的其他潜在交点)和α图元(其交点需要流式处理器计算以考虑或解决透明度、修剪、位移、构造实体几何或其他效果)。
在示例非限制性实施例中,图元范围提供了在加速数据结构内指定由协处理器支持的一组几何类型的图元的方法,其被编码在压缩或未压缩的存储器块的序列内,其中协处理器将测试到达加速数据结构的遍历空间中的特定点(或多个特定点)的任何光线。在图元范围内,每个图元指示它是否被指定为不透明(指示光线和图元之间的任何交点明确地遮挡沿光线参数上更远的任何交点)或α(指示几何交点可被抑制、扰动或者通过SM上的α测试操作增强)。
在示例非限制性实施例中,图元范围可以放置在加速结构的上下文内(在加速结构的遍历中的特定点处)以指定针对在加速结构的遍历中到达特定点的任何光线要测试的公共类型的图元阵列。
因此,在加速结构内,图元范围可以在加速结构的叶数据内表示包含该范围中的第一个三角形的第一个块的地址,该第一个块内的第一个三角形的索引,范围中的块的总数,以及最后一个块中最后一个图元的索引。加速结构内的多个图元范围可以引用块中的三角形的不同子集。例如,在TTU中,当光线与关联于图元范围子块的子包围盒相交时,TTU将堆栈条目推送到包含一个或更多个以下位域的遍历堆栈:
o addrLast-图元范围中最后一个块的地址
o triIdx-第一个高速缓存线中图元范围中第一个图元的(包含)索引o triEnd-范围中最后一个高速缓存线中最后一个图元的(独占)索引,或者指示在前一个高速缓存线中结束的范围的零
o lines-包含图元范围的块数-1(除非triEnd=0,然后线是块数)一个co标志,指示要剔除的不透明图元碰撞
加速结构内的多个图元范围可以引用相同的块,因此,包含图元范围中的图元的块可能不具有父指针。
当光线在遍历加速数据结构期间遇到图元范围时(例如,当光线与其子数据指定图元范围的叶节点的包围盒相交时),协处理器可以将图元范围推送到用于立即测试的遍历堆栈的顶部,或者可以根据查询指定的标准将条目放在堆栈中更深的位于同一遍历步骤中之前推送的其他图元范围之下(例如,首先测试参数上更接近的图元范围或节点)。
在示例非限制性实施例中,光线图元范围处理提供了用于从流式处理器卸载针对跨越多个块的加速数据结构所引用的图元范围测试光线的任务的机制。
在示例非限制性实施例中,项目范围提供了在加速数据结构内指定一组几何类型的图元的方法,该组图元可以由协处理器支持或不支持,其在存储器的块序列内被编码。
在示例非限制性实施例中,项目相交测试委托提供了一种机制,用于协处理器将包含协处理器的光线图元-处理不支持的类型的图元的图元范围的中间遍历相交测试委托给流式处理器以可编程功能执行,然后在协处理器中有条件地恢复遍历。
在示例非限制性实施例中,α测试委托提供了一种机制,用于协处理器将在特定配置的光线和图元范围内的特定配置的图元之间发现的交点返回到流式处理器,使得流式处理器可以利用诸如α测试之类的可编程功能(或熟悉现有技术的人员已知的其他特征)来覆盖、抑制或增加相交测试的结果,然后在协处理器中有条件地恢复遍历。
在示例非限制性实施例中,结果队列在协处理器内提供数据结构,用于存储在遍历期间找到的一个或更多个不透明或α图元交点。结果队列允许协处理器推迟α测试,并且如果更近的不透明交点遮挡α交点,则可能完全避免它们。
在示例非限制性实施例中,无序块处理提供用于光线/图元范围处理的一组规则,以确保在测试图元范围时查询产生鲁棒的确定性结果,而不是跨越由存储器子系统以任意顺序返回的多个块,无论发现的α交点和不透明交点的顺序和数量如何。
协处理器可以被配置为产生稳定图像而没有遍历产生的令人讨厌的伪像,该遍历在给定光线和图元范围(包含跨越多个块的不透明图元和α图元的混合)的情况下产生查询的确定性结果,而不管存储器子系统将这些块返回给协处理器的顺序如何。
为了实现该结果,协处理器可以执行多个中间遍历返回到SM以处理其数量和内容可以随着运行而变化的α交点,因为返回到TTU的块的顺序的变化产生不透明交点的不同排序,可以掩盖或不掩盖在同一图元范围内找到的不同α交点集,但结果队列和无序块处理规则确保从完成的图元范围的处理产生的副作用将在运行期间保持一致。
示例性图像生成管线包括光线追踪
上述光线追踪和其他能力可以以各种方式使用。例如,除了用于使用光线追踪来渲染场景之外,它们还可以与扫描变换技术结合实现,例如在扫描变换3D模型的几何构建块(即,诸如三角形的多边形图元)以用于生成用于显示的图像(例如,在图1中所示的显示器150上)的上下文中。图18示出了根据实施例的用于处理图元以提供图像的图像像素值的示例性流程图。
如图18所示,可以响应于接收到用户输入而生成3D模型的图像(步骤1652)。用户输入可以是显示图像或图像序列的请求,诸如在与应用程序(例如,游戏应用程序)交互期间执行的输入操作。响应于用户输入,系统使用传统的GPU 3D图形管线执行场景的3D模型几何图元的扫描变换和光栅化(步骤1654)。几何图元的扫描变换和光栅化可以包括例如处理3D模型的图元以使用传统技术(诸如本领域技术人员所公知的照明、变换、纹理映射、光栅化等)来确定图像像素值,下面结合图22讨论。生成的像素数据可以写入帧缓冲器。
在步骤1656中,可以使用TTU硬件加速从光栅化图元上的一个或更多个点追踪一个或更多个光线。可以根据本申请中公开的一种或更多种光线追踪能力来追踪光线。基于光线追踪的结果,可以修改存储在缓冲器中的像素值(步骤1658)。在一些应用中,修改像素值可以例如通过应用更逼真的反射和/或阴影来改善图像质量。使用存储在缓冲器中的修改的像素值显示图像(步骤1660)。
在一个示例中,可以使用关于图19、图21、图23、图24、图25和/或图26描述的处理系统来实现几何图元的扫描变换和光栅化,并且可以由SM 132使用关于图9描述的TTU架构来实现光线追踪,以添加进一步的可视化特征(例如镜面反射、阴影等)。图18仅仅是非限制性示例-SM 132可以自己使用所描述的TTU而无需纹理处理或其他传统3D图形处理来产生图像,或者SM可以采用纹理处理和其他传统3D图形处理而无需所描述的TTU来产生图像。SM还可以根据应用在软件中实现任何期望的图像生成或其他功能,以提供不受纹理映射硬件、树遍历硬件或其他图形管线硬件提供的硬件加速特征界定的任何期望的可编程功能。
包括光线追踪的示例性并行处理架构
上面描述的TTU结构可以在示例性非限制性并行处理系统架构中实现,或者与其相关联,例如下面结合图19-图26所描述的。这种并行处理架构可用于例如实现图1的GPU130。
示例性并行处理架构
图19示出了示例非限制性的并行处理单元(PPU)1700。在一个实施例中,PPU 1700是在一个或更多个集成电路器件上实现的多线程处理器。PPU 1700是设计用于并行处理许多线程的延迟隐藏架构。线程(即,执行线程)是被配置为由PPU 1700执行的指令集的实例化。在一个实施例中,PPU 1700被配置为实现用于处理三维(3D)图形数据的图形渲染管线,以便生成二维(2D)图像数据,用于在显示设备(诸如液晶显示(LCD)设备、有机发光二极管(OLED)设备、透明发光二极管(TOLED)设备、场发射显示器(FED)、场顺序显示器、投影显示器、头戴式显示器或任何其他所需显示器)上显示。在其他实施例中,PPU 1700可以用于执行通用计算。尽管为了说明的目的本文提供了一个示例性并行处理器,但应特别指出的是,该处理器仅出于说明目的进行阐述,并且可使用任何处理器来补充和/或替代该处理器。
例如,一个或更多个PPU 1700可以被配置为加速数千个高性能计算(HPC)、数据中心和机器学习应用。PPU 1700可被配置为加速众多深度学习系统和应用,包括自动驾驶汽车平台、深度学习、高精度语音、图像和文本识别系统、智能视频分析、分子模拟、药物发现、疾病诊断、天气预报、大数据分析、天文学、分子动力学模拟、金融建模、机器人技术、工厂自动化、实时语言翻译、在线搜索优化和个性化用户推荐等。
PPU 1700可以包括在台式计算机、膝上型计算机、平板计算机、服务器、超级计算机、智能电话(例如,无线、手持设备)、个人数字助理(PDA)、数码相机、车辆、头戴式显示器、手持电子设备等中。在一个实施例中,PPU 1700体现在单个半导体衬底上。在另一个实施例中,PPU1700与一个或更多个其他器件(例如,附加PPU 1700、存储器1704、精简指令集计算机(RISC)CPU、存储器管理单元(MMU)、数模转换器(DAC)等)一起被包括在片上系统(SoC)中。
在一个实施例中,PPU 1700可以被包括在包括一个或更多个存储器器件1704的图形卡上。图形卡可以被配置为与台式计算机的主板上的PCIe插槽接口。在又一个实施例中,PPU 1700可以是包括在主板的芯片组中的集成图形处理单元(iGPU)或并行处理器。
如图19所示,PPU 1700包括输入/输出(I/O)单元1705、前端单元1715、调度器单元1720、工作分配单元1725、集线器1730、交叉开关(Xbar)1770、一个或更多个通用处理集群(GPC)1750以及一个或更多个分区单元1780。PPU 1700可以经由一个或更多个高速NVLink1710互连连接到主机处理器或其他PPU 1700。PPU 1700可以经由互连1702连接到主机处理器或其他外围设备。PPU 1700还可以连接到包括多个存储器设备1704的本地存储器。在一个实施例中,本地存储器可以包括多个动态随机存取存储器(DRAM)器件。DRAM器件可以被配置为高带宽存储器(HBM)子系统,其中多个DRAM裸晶(die)堆叠在每个器件内。
NVLink 1710互连使得系统能够扩展并且包括与一个或更多个CPU结合的一个或更多个PPU 1700,支持PPU 1700和CPU之间的高速缓存一致性以及CPU主控。数据和/或命令可以由NVLink 1710通过集线器1730发送到PPU 1700的其他单元或从其发送,例如一个或更多个复制引擎、视频编码器、视频解码器、电源管理单元等(未明确示出)。结合图25更详细地描述NVLink 1710。
I/O单元1705被配置为通过互连1702从主机处理器(未示出)发送和接收通信(即,命令、数据等)。I/O单元1705可以经由互连1702直接与主机处理器通信,或通过一个或更多个中间设备(诸如存储器桥)与主机处理器通信。在一个实施例中,I/O单元1705可以经由互连1702与一个或更多个其他处理器(例如,一个或更多个PPU 1700)通信。在一个实施例中,I/O单元1705实现外围组件互连高速(PCIe)接口,用于通过PCIe总线进行通信,并且互连1702是PCIe总线。在替代实施例中,I/O单元1705可以实现其他类型的已知接口,用于与外部设备进行通信。
I/O单元1705对经由互连1702接收的分组进行解码。在一个实施例中,分组表示被配置为使PPU 1700执行各种操作的命令。I/O单元1705按照命令指定将解码的命令发送到PPU 1700的各种其他单元。例如,一些命令可以被发送到前端单元1715。其他命令可以被发送到集线器1730或PPU 1700的其他单元,诸如一个或更多个复制引擎、视频编码器、视频解码器、电源管理单元等(未明确示出)。换句话说,I/O单元1705被配置为在PPU 1700的各种逻辑单元之间和之中路由通信。
在一个实施例中,由主机处理器执行的程序在缓冲区中对命令流进行编码,该缓冲区向PPU 1700提供工作量用于处理。工作量可以包括要由那些指令处理的若干指令和数据。缓冲区是存储器中可由主机处理器和PPU1700两者访问(即,读/写)的区域。例如,I/O单元1705可以被配置为经由通过互连1702发送的存储器请求访问连接到互连1702的系统存储器中的缓冲区。在一个实施例中,主机处理器将命令流写入缓冲区,然后向PPU1700发送指向命令流开始的指针。前端单元1715接收指向一个或更多个命令流的指针。前端单元1715管理一个或更多个流,从流读取命令并将命令转发到PPU 1700的各个单元。
前端单元1715耦合到调度器单元1720,调度器单元1720配置各种GPC 1750以处理由一个或更多个流定义的任务。调度器单元1720被配置为追踪与由调度器单元1720管理的各种任务相关的状态信息。状态可以指示任务被指派给哪个GPC 1750,该任务是活动的还是不活动的,与该任务相关联的优先级等等。调度器单元1720管理一个或更多个GPC 1750上的多个任务的执行。
调度器单元1720耦合到工作分配单元1725,工作分配单元1725被配置为分派任务以在GPC 1750上执行。工作分配单元1725可以追踪从调度器单元1720接收到的多个调度任务。在一个实施例中,工作分配单元1725为每个GPC 1750管理待处理(pending)任务池和活动任务池。待处理任务池可以包括多个槽(例如,32个槽),其包含被指派为由特定GPC 1750处理的任务。活动任务池可以包括多个槽(例如,4个槽),用于正在由GPC1750主动处理的任务。当GPC 1750完成任务的执行时,该任务从GPC 1750的活动任务池中逐出,并且来自待处理任务池的其他任务之一被选择和调度以在GPC 1750上执行。如果GPC 1750上的活动任务已经空闲,例如在等待数据依赖性被解决时,那么活动任务可以从GPC 1750中逐出并返回到待处理任务池,而待处理任务池中的另一个任务被选择并调度以在GPC1750上执行。
工作分配单元1725经由XBar(交叉开关)1770与一个或更多个GPC1750通信。XBar1770是将PPU 1700的许多单元耦合到PPU 1700的其他单元的互连网络。例如,XBar 1770可以被配置为将工作分配单元1725耦合到特定的GPC 1750。虽然没有明确示出,但PPU 1700的一个或更多个其他单元也可以经由集线器1730连接到XBar 1770。
任务由调度器单元1720管理并由工作分配单元1725分派给GPC 1750。GPC 1750被配置为处理任务并生成结果。结果可以由GPC 1750内的其他任务消耗,经由XBar 1770路由到不同的GPC 1750,或者存储在存储器1704中。结果可以经由分区单元1780写入存储器1704,分区单元1780实现用于从存储器1704读取数据和/或向存储器1704写入数据的存储器接口。结果可以经由NVLink1710发送到另一个PPU 1704或CPU。在一个实施例中,PPU1700包括数目为U的分区单元1780,其等于耦合到PPU 1700的独立且不同的存储器设备1704的数目。下面将结合图20更详细地描述分区单元1780。
在一个实施例中,主机处理器(例如,图1的处理器120)执行实现应用程序编程接口(API)的驱动程序内核,其使得能够在主机处理器上执行一个或更多个应用程序,以调度用于在PPU 1700上执行的操作。在一个实施例中,多个计算机应用程序由PPU 1700同时执行,并且PPU 1700为多个计算机应用程序提供隔离、服务质量(QoS)和独立地址空间。应用程序可以生成指令(即API调用),其使得驱动程序内核生成一个或更多个任务以由PPU1700执行。驱动程序内核将任务输出到正在由PPU 1700处理的一个或更多个流。每个任务可以包括一个或更多个相关线程组,本文称为线程束(warp)。在一个实施例中,线程束包括可以并行执行的32个相关线程。协作线程可以指代包括用于执行任务的指令并且可以通过共享存储器交换数据的多个线程。结合图23更详细地描述线程和协作线程。
示例性存储器分区单元
MMU 1890提供GPC 1750和分区单元1780之间的接口。MMU 1890可以提供虚拟地址到物理地址的转换,存储器保护和存储器请求的仲裁。在一个实施例中,MMU 1890提供一个或更多个转换后备缓冲器(TLB),用于执行虚拟地址到存储器1704中的物理地址的转换。
图20示出了根据实施例的图19的PPU 1700的存储器分区单元1780。如图20所示,存储器分区单元1780包括光栅操作(ROP)单元1850、二级(L2)高速缓存1860和存储器接口1870。存储器接口1870耦合到存储器1704。存储器接口1870可以实现用于高速数据传输的32、64、128、1024位数据总线等。在一个实施例中,PPU 1700包含U个存储器接口1870,每对分区单元1780一个存储器接口1870,其中每对分区单元1780连接到相应的存储器设备1704。例如,PPU 1700可以连接到多达Y个存储器设备1704,例如高带宽存储器堆栈或图形双数据速率,版本5,同步动态随机存取存储器或其他类型的持久存储器。
在一个实施例中,存储器接口1870实现HBM2存储器接口并且Y等于U的一半。在一个实施例中,HBM2存储器堆栈与PPU 1700位于相同的物理封装上,与传统的GDDR5 SDRAM系统相比,其提供了相当大的功率和面积节省。在一个实施例中,每个HBM2堆栈包括四个存储器裸晶并且Y等于4,HBM2堆栈包括每个裸晶两个128位通道,总共8个通道和1024位的数据总线宽度。
在一个实施例中,存储器1704支持单纠错双错误检测(SECDED)纠错码(ECC)以保护数据。ECC为对数据损坏敏感的计算应用程序提供更高的可靠性。可靠性在大规模集群计算环境中尤其重要,其中PPU 1700处理非常大的数据集和/或长时间运行应用程序。
在一个实施例中,PPU 1700实现多级存储器层次。在一个实施例中,存储器分区单元1780支持统一存储器,以为CPU和PPU 1700存储器提供单个统一虚拟地址空间,从而实现虚拟存储器系统之间的数据共享。在一个实施例中,追踪PPU 1700对位于其他处理器上的存储器的访问频率,以确保将存储器页面移动到更频繁地访问页面的PPU 1700的物理存储器。在一个实施例中,NVLink 1710支持地址转换服务,允许PPU 1700直接访问CPU的页表并由PPU 1700提供对CPU存储器的完全访问。
在一个实施例中,复制引擎在多个PPU 1700之间或在PPU 1700和CPU之间传输数据。复制引擎可以为未映射到页表的地址生成页面错误。然后,存储器分区单元1780可以服务页面错误,将地址映射到页表中,之后复制引擎可以执行该传输。在传统系统中,存储器被固定(即,不可分页)以用于多个处理器之间的多个复制引擎操作,从而大大减少了可用存储器。使用硬件页面错误,可以将地址传递给复制引擎,而不必担心存储器页面是否驻留,并且复制过程是透明的。
来自存储器1704或其他系统存储器的数据可以由存储器分区单元1780获取并存储在L2高速缓存1860中,L2高速缓存1860位于芯片上并且在各种GPC 1750之间共享。如图所示,每个存储器分区单元1780包括与相应的存储器设备1704相关联的L2高速缓存1860的一部分。然后,可以在GPC 1750内的各种单元中实现较低级的高速缓存。例如,SM 1840中的每一个可以实现一级(L1)高速缓存。L1高速缓存是专用于特定SM 1840的专用存储器。可以获取来自L2高速缓存1860的数据并将其存储在每个L1高速缓存中,以便在SM 1840的功能单元中进行处理。L2高速缓存1860被耦合到存储器接口1870和XBar 1770。
ROP单元1850执行与像素颜色有关的图形光栅操作,例如颜色压缩、像素混合等。ROP单元1850还结合光栅引擎1825实现深度测试,接收与来自光栅引擎1825的剔除引擎的像素片段相关联的样本位置的深度。针对深度缓冲器中的对应深度测试与片段关联的样本位置的深度。如果片段通过样本位置的深度测试,则ROP单元1850更新深度缓冲器并将深度测试的结果发送到光栅引擎1825。应当理解,分区单元1780的数量可以不同于GPC 1750的数量,并且因此每个ROP单元1850可以耦合到每个GPC 1750。ROP单元1850追踪从不同GPC1750接收的分组,并且确定由ROP单元1850生成的结果通过Xbar 1770被路由到哪个GPC1750。虽然ROP单元1850被包括在图20中的存储器分区单元1780内,但在其他实施例中,ROP单元1850可以在存储器分区单元1780之外。例如,ROP单元1850可以驻留在GPC 1750或另一单元中。
示例性通用处理群集
图21示出了根据一个实施例的图19的PPU 1700的GPC 1750。如图21所示,每个GPC1750包括用于处理任务的多个硬件单元。在一个实施例中,每个GPC 1750包括管线管理器1810、预光栅操作单元(PROP)1815、光栅引擎1825、工作分配交叉开关(WDX)1880、存储器管理单元(MMU)1890以及一个或更多个数据处理集群(DPC)1820。应当理解,图21的GPC 1750可以包括代替图21中所示单元的其他硬件单元或除图21中所示单元之外的其他硬件单元。
在一个实施例中,GPC 1750的操作由管线管理器1810控制。管线管理器1810管理用于处理分配给GPC 1750的任务的一个或更多个DPC 1820的配置。在一个实施例中,管线管理器1810可以配置一个或更多个DPC 1820中的至少一个来实现图形渲染管线的至少一部分。
包括在GPC 1750中的每个DPC 1820包括M管道控制器(MPC)1830、图元引擎1835、一个或更多个SM 1840、一个或更多个纹理单元1842以及一个或更多个TTU 700。SM 1840可以与上述SM 132类似地构造。MPC 1830控制DPC 1820的操作,将从管线管理器1810接收的分组路由到DPC 1820中的适当单元。例如,与顶点相关联的分组可以被路由到图元引擎1835,其被配置为获取与来自存储器1704的顶点相关联的顶点属性。相反,与着色器程序相关联的分组可以被发送到SM 1840。
当被配置用于通用并行计算时,与图形处理相比,可以使用更简单的配置。具体地,图19中所示的固定功能图形处理单元被绕过,创建一个更简单的编程模型。在通用并行计算配置中,工作分配单元1725将线程块直接分配和分发给DPC 1820。块中的线程执行相同的程序,在计算中使用唯一的线程ID以确保每个线程生成唯一的结果,使用SM 1840执行程序并执行计算,使用共享存储器/L1高速缓存1970以在线程之间通信,并且使用LSU 1954以通过共享存储器/L1高速缓存1970和存储器分区单元1780读取和写入全局存储器。当配置用于通用并行计算时,SM 1840还可以写入调度器单元1720可以用来在DPC 1820上启动新工作的命令。TTU 700可以用于在通用计算的上下文中加速空间查询。
图形渲染管线
DPC 1820可以被配置为在可编程流式多处理器(SM)1840上执行顶点着色程序,其可以采用TTU 700加速某些着色操作。管线管理器1810还可以被配置为将从工作分配单元1725接收的分组路由到GPC 1750中适当的逻辑单元。例如,一些分组可以被路由到PROP1815和/或光栅引擎1825中的固定功能硬件单元,而其他分组可以被路由到DPC 1820以供图元引擎1835或SM 1840处理。在一个实施例中,管线管理器1810可以配置一个或更多个DPC 1820中的至少一个以实现神经网络模型和/或计算管线。
PROP单元1815被配置为将由光栅引擎1825和DPC 1820生成的数据路由到光栅操作(ROP)单元,其结合图20更详细地描述。PROP单元1815还可以被配置为执行颜色混合的优化,组织像素数据,执行地址转换等。
光栅引擎1825包括被配置为执行各种光栅操作的多个固定功能硬件单元。在一个实施例中,光栅引擎1825包括设置引擎、粗光栅引擎、剔除引擎、裁剪引擎、精细光栅引擎和图块聚合引擎。设置引擎接收变换后的顶点并生成与由顶点定义的几何图元相关联的平面方程。平面方程被发送到粗光栅引擎以生成图元的覆盖信息(例如,图块的x、y覆盖掩码)。粗光栅引擎的输出被发送到剔除引擎,其中与未通过z-测试的图元相关联的片段被剔除,并且未被剔除的片段被发送到裁剪引擎,其中位于视锥体之外的片段被裁剪掉。那些经过裁剪和剔除后留下来的片段可以被传递到精细光栅引擎,以基于由设置引擎生成的平面方程生成像素片段的属性。光栅引擎1825的输出包括例如要由在DPC 1820内实现的片段着色器处理的片段。
更详细地,PPU 1700被配置为接收指定用于处理图形数据的着色器程序的命令。图形数据可以被定义为一组图元,例如点、线、三角形、四边形、三角形条等。通常,图元包括指定图元的多个顶点的数据(例如,在模型空间坐标系中)以及与图元的每个顶点相关联的属性。PPU 1700可以被配置为使用例如TTU 700作为硬件加速资源来处理图元以生成帧缓冲器(即,用于显示器的每个像素的像素数据)。
应用程序将场景的模型数据(即,顶点和属性的集合)写入存储器(诸如系统存储器或存储器1704)。模型数据定义可在显示器上可见的每个对象。如上所述,模型数据还可以定义如上描述的一个或更多个BVH。然后,应用程序对驱动程序内核进行API调用,请求呈现和显示模型数据。驱动程序内核读取模型数据并将命令写入一个或更多个流以执行处理模型数据的操作。命令可以引用要在PPU 1700的SM 1840上实现的不同着色器程序,包括顶点着色器、外壳着色器、域着色器、几何着色器、像素着色器、光线生成着色器、光线相交着色器、光线碰撞着色器和光线未碰撞着色器中的一个或更多个(这些着色器对应于DirectX光线追踪(DXR)API定义的着色器,忽略“最近碰撞”和“任意碰撞”着色器之间的任何区别;参阅https://devblogs.nvidia.com/introduction-nvidia-rtx-directx-ray-tracing/)。例如,SM 1840中的一个或更多个可以被配置为执行顶点着色器程序,该顶点着色器程序处理由模型数据定义的多个顶点。在一个实施例中,不同的SM 1840可以被配置为同时执行不同的着色器程序。例如,SM 1840的第一子集可以被配置为执行顶点着色器程序,而SM 1840的第二子集可以被配置为执行像素着色器程序。SM 1840的第一子集处理顶点数据以产生经处理的顶点数据,并将经处理的顶点数据写入L2高速缓存1860和/或存储器1704(参见图20)。在经处理的顶点数据被光栅化(即,从三维数据变换成屏幕空间中的二维数据)以产生片段数据之后,SM 1840的第二子集执行像素着色器以产生经处理的片段数据,然后将其与其他经处理的片段数据混合并写入存储器1704中的帧缓冲器。顶点着色器程序和像素着色器程序可以同时执行,以管线方式处理来自同一场景的不同数据,直到场景的所有模型数据都已被渲染到帧缓冲器。然后,帧缓冲器的内容被发送到显示控制器以在显示设备上显示。
图22是由图19的PPU 1700实现的图形处理管线2000的概念图。图形处理管线2000是被实现为从3D几何数据生成2D计算机生成的图像的处理步骤的抽象流程图。众所周知,管线架构可以通过将操作分成多个阶段来更有效地执行长延迟操作,其中每个阶段的输出耦合到下一个连续阶段的输入。因此,图形处理管线2000接收输入数据2001,其从图形处理管线2000的一个阶段被发送到下一个阶段以生成输出数据2002。在一个实施例中,图形处理管线2000可以表示由API定义的图形处理管线。作为选择,图形处理管线2000可以在前面的附图和/或任何后续附图的功能和架构的上下文中实现。如上面参考图18所讨论的那样,光线追踪可用于改善由几何图元的光栅化生成的图像质量。在一些实施例中,本申请中公开的光线追踪操作和TTU结构可以应用于图形处理管线2000的一个或更多个状态,以改善主观图像质量。
如图22所示,图形处理管线2000包括包含多个阶段的管线架构。这些阶段包括但不限于数据组装阶段2010,顶点着色阶段2020,图元组装阶段2030,几何着色阶段2040,视口缩放、剔除和裁剪(VSCC)阶段2050,光栅化阶段2060,片段着色阶段2070和光栅操作阶段2080。在一个实施例中,输入数据2001包括配置处理单元以实现图形处理管线2000的阶段的命令和由阶段处理的几何图元(例如,点、线、三角形、四边形、三角形条或扇形等)。输出数据2002可以包括被复制到帧缓冲器中的像素数据(即,颜色数据)或存储器中的其他类型的表面数据结构。
数据组装阶段2010接收输入数据2001,其指定高阶表面的顶点数据、图元等。数据组装阶段2010在临时存储或队列中收集顶点数据,例如通过从主机处理器接收包括指向存储器中的缓冲器的指针的命令以及从缓冲器读取顶点数据。然后将顶点数据被发送到顶点着色阶段2020以进行处理。
顶点着色阶段2020通过对每个顶点执行一次一组操作(即,顶点着色器或程序)来处理顶点数据。例如,顶点可以例如被指定为与一个或更多个顶点属性(例如,颜色、纹理坐标、表面法线等)相关联的4坐标向量(即,<x,y,z,w>)。顶点着色阶段2020可以操纵各个顶点属性,例如位置、颜色、纹理坐标等。换句话说,顶点着色阶段2020对顶点坐标或与顶点相关联的其他顶点属性执行操作。这些操作通常包括照明操作(即,修改顶点的颜色属性)和变换操作(即,修改顶点的坐标空间)。例如,可以使用对象坐标空间中的坐标来指定顶点,通过将坐标乘以将坐标从对象坐标空间变换为世界空间或归一化设备坐标(NCD)空间的矩阵来进行变换。顶点着色阶段2020生成变换的顶点数据,该变换的顶点数据被发送到图元组装阶段2030。
图元组装阶段2030收集由顶点着色阶段2020输出的顶点,并将顶点分组为几何图元,以供几何着色阶段2040处理。例如,图元组装阶段2030可被配置为将每三个连续顶点分组为几何图元(即,三角形),用于发送到几何着色阶段2040。在一些实施例中,特定顶点可以重复用于连续几何图元(例如,三角形条带中的两个连续三角形可以共享两个顶点)。图元组装阶段2030将几何图元(即,关联顶点的集合)发送到几何着色阶段2040。
几何着色阶段2040通过对几何图元执行一组操作(即,几何着色器或程序)来处理几何图元。曲面细分操作可以从每个几何图元生成一个或更多个几何图元。换句话说,几何着色阶段2040可以将每个几何图元细分为两个或更多个几何图元的更精细网格,以供图形处理管线2000的其余部分处理。几何着色阶段2040将几何图元发送到视口SCC阶段2050。
在一个实施例中,图形处理管线2000可以在流式多处理器和顶点着色阶段2020、图元组装阶段2030、几何着色阶段2040、片段着色阶段2070、光线追踪着色器和/或与其相关联的硬件/软件中操作,可以顺序地执行处理操作。一旦顺序处理操作完成,在一个实施例中,视口SCC阶段2050可以利用该数据。在一个实施例中,可以将由图形处理管线2000中的一个或更多个阶段处理的图元数据写入高速缓存(例如,L1高速缓存、顶点高速缓存等)。在这种情况下,在一个实施例中,视口SCC阶段2050可以访问高速缓存中的数据。在一个实施例中,视口SCC阶段2050和光栅化阶段2060被实现为固定功能电路。
视口SCC阶段2050执行几何图元的视口缩放、剔除和裁剪。渲染的每个表面与抽象摄像机位置相关联。摄像机位置表示观看者观看场景的位置,并定义包围场景对象的视锥体。视锥体可包括观察平面,后平面和四个裁剪平面。完全在视锥体之外的任何几何图元可以被剔除(即,丢弃),因为该几何图元将不会对最终渲染场景做出贡献。可以裁剪部分位于视锥体内部并且部分位于视锥体外部的任何几何图元(即,变换为包围在视锥体内的新的几何图元)。此外,几何图元可以各自基于视锥体的深度来缩放。然后,将所有可能可见的几何图元发送到光栅化阶段2060。
光栅化阶段2060将3D几何图元转换为2D片段(例如,能够用于显示等)。光栅化阶段2060可以被配置为利用几何图元的顶点来设置一组平面方程,从中可以插入各种属性。光栅化阶段2060还可以计算多个像素的覆盖掩码,其指示像素的一个或更多个样本位置是否拦截几何图元。在一个实施例中,还可以执行z测试以确定几何图元是否被已经被光栅化的其他几何图元遮挡。光栅化阶段2060生成片段数据(即,与每个被覆盖像素的特定样本位置相关联的内插顶点属性),其被发送到片段着色阶段2070。
片段着色阶段2070通过对每个片段执行一组操作(即,片段着色器或程序)来处理片段数据。片段着色阶段2070可以生成片段的像素数据(即,颜色值),诸如通过使用片段的内插纹理坐标执行照明操作或采样纹理映射。片段着色阶段2070生成发送到光栅操作阶段2080的像素数据。
光栅操作阶段2080可以对像素数据执行各种操作,诸如执行阿尔法测试,模板测试,以及将像素数据与对应于与像素相关联的其他片段的其他像素数据混合。当光栅操作阶段2080已经完成处理像素数据(即,输出数据2002)时,可以将像素数据写入渲染目标(诸如帧缓冲器、颜色缓冲器等)。
应当理解,除了上述一个或更多个阶段之外或代替上述一个或更多个阶段,可以在图形处理管线2000中包括一个或更多个附加阶段。抽象图形处理管线的各种实现可以实现不同的阶段。此外,在一些实施例中(例如,几何着色阶段2040),可以从图形处理管线中排除上述一个或更多个阶段。其他类型的图形处理管线也考虑在本公开的范围内。此外,图形处理管线2000的任何阶段可以由图形处理器(诸如PPU 200)内的一个或更多个专用硬件单元实现。图形处理管线2000的其他阶段可以由可编程硬件单元(诸如PPU 1700的SM 1840的)实现。
图形处理管线2000可以经由由主机处理器(诸如CPU 120)执行的应用程序来实现。在一个实施例中,设备驱动器可以实现定义可以由应用程序利用以生成用于显示的图形数据的各种功能的应用程序编程接口(API)。设备驱动程序是包括控制PPU 1700的操作的多个指令的软件程序。API为程序员提供抽象,其允许程序员利用专用图形硬件(例如PPU1700)来生成图形数据,而不需要程序员利用PPU 1700的特定指令集。应用程序可以包括被路由到PPU 1700的设备驱动器的API调用。设备驱动器解释API调用并执行各种操作以响应API调用。在某些情况下,设备驱动器可以通过在CPU上执行指令来执行操作。在其他情况下,设备驱动器可以至少部分地通过利用CPU和PPU 1700之间的输入/输出接口在PPU 1700上启动操作来执行操作。在一个实施例中,设备驱动器被配置为利用PPU 1700的硬件来实现图形处理管线2000。
可以在PPU 1700内执行各种程序以便实现图形处理管线2000的各个阶段。例如,设备驱动器可以在PPU 1700上启动内核,以在一个SM 1840(或多个SM 1840)上执行顶点着色阶段2020。设备驱动器(或由PPU 1800执行的初始内核)还可以在PPU 1800上启动其他内核,以执行图形处理管线2000的其他阶段,例如几何着色阶段2040和片段着色阶段2070。此外,图形处理管线2000的一些阶段可以在固定单元硬件上实现,例如在PPU 1800内实现的光栅化器或数据汇编器上。可以理解,来自一个内核的结果可以在由SM 1840上的后续内核处理之前通过一个或更多个中间固定功能硬件单元来处理。
示例性流式多处理器
SM 1840包括被配置为处理由多个线程表示的任务的可编程流式处理器。每个SM1840是多线程的并且被配置为同时执行来自特定线程组的多个线程(例如,32个线程,其包括线程束)。在一个实施例中,SM 1840实现SIMD(单指令、多数据)体系架构,其中线程组(即,warp)中的每个线程被配置为基于相同的指令集来处理不同的数据集。线程组中的所有线程都执行相同的指令。在另一个实施例中,SM 1840实现SIMT(单指令、多线程)体系架构,其中线程组中的每个线程被配置为基于相同的指令集处理不同的数据集,但是其中线程组中的各个线程在执行期间被允许发散。在一个实施例中,为每个线程束维护程序计数器、调用栈和执行状态,当线程束内的线程发散时,使能线程束和线程束中的串行执行之间的并发。在另一个实施例中,为每个个体线程维护程序计数器、调用栈和执行状态,使能在线程束内和线程束之间的所有线程之间的相等并发。当为每个个体线程维护执行状态时,执行相同指令的线程可以收敛并且并行执行以获得最大效率。
图23示出了根据一个实施例的图21的流式多处理器1840。如图23所示,SM 1840包括指令高速缓存1905、一个或更多个调度器单元1910、寄存器文件1920、一个或更多个处理核心1950、一个或更多个特殊功能单元(SFU)1952、一个或更多个加载/存储单元(LSU)1954、互连网络1980、共享存储器/L1高速缓存1970。
如上所述,工作分配单元1725分派任务以在PPU 1700的GPC 1750上执行。任务被分配给GPC 1750内的特定DPC 1820,并且如果任务与着色器程序相关联,则该任务可以被分配给SM 1840。调度器单元1910从工作分配单元1725接收任务并且管理指派给SM 1840的一个或更多个线程块的指令调度。调度器单元1910调度线程块以作为并行线程的线程束执行,其中每个线程块被分配至少一个线程束。在一个实施例中,每个线程束执行32个线程。调度器单元1910可以管理多个不同的线程块,将线程束分配给不同的线程块,然后在每个时钟周期期间将来自多个不同的协作组的指令分派到各个功能单元(即,核心1950、SFU1952和LSU 1954)。
协作组是用于组织通信线程组的编程模型,其允许开发者表达线程正在通信所采用的粒度,使得能够表达更丰富、更高效的并行分解。协作启动API支持线程块之间的同步性,以执行并行算法。常规的编程模型为同步协作线程提供了单一的简单结构:跨线程块的所有线程的屏障(barrier)(即,syncthreads()函数)。然而,程序员通常希望以小于线程块粒度的粒度定义线程组,并在所定义的组内同步,以集体的全组功能接口(collectivegroup-wide function interface)的形式使能更高的性能、设计灵活性和软件重用。
协作组使得程序员能够在子块(即,像单个线程一样小)和多块粒度处明确定义线程组并且执行集体操作,诸如协作组中的线程上的同步性。编程模型支持跨软件边界的干净组合,以便库和效用函数可以在本地环境中安全地同步,而无需对收敛进行假设。协作组图元启用合作伙伴并行的新模式,包括生产者-消费者并行、机会主义并行以及跨整个线程块网格的全局同步。
分派单元1915被配置为向一个或更多个功能单元发送指令。在该实施例中,调度器单元1910包括两个分派单元1915,其使得能够在每个时钟周期期间调度来自相同线程束的两个不同指令。在替代实施例中,每个调度器单元1910可以包括单个分派单元1915或附加分派单元1915。
每个SM 1840包括寄存器文件1920,其提供用于SM 1840的功能单元的一组寄存器。在一个实施例中,寄存器文件1920在每个功能单元之间被划分,使得每个功能单元被分配寄存器文件1920的专用部分。在另一个实施例中,寄存器文件1920在由SM 1840执行的不同线程束之间被划分。寄存器文件1920为连接到功能单元的数据路径的操作数提供临时存储。图24示出了SM 1840中的寄存器文件的示例性配置。
每个SM 1840包括L个处理核心1950。在一个实施例中,SM 1840包括大量(例如128个等)不同的处理核心1950。每个核心1950可以包括完全管线化的、单精度、双精度和/或混合精度处理单元,其包括浮点运算逻辑单元和整数运算逻辑单元。在一个实施例中,浮点运算逻辑单元实现用于浮点运算的IEEE 754-2008标准。在一个实施例中,核心1950包括64个单精度(32位)浮点核心、64个整数核心、32个双精度(64位)浮点核心和8个张量核心(tensor core)。
张量核心被配置为执行矩阵运算,并且在一个实施例中,一个或更多个张量核心被包括在核心1950中。具体地,张量核心被配置为执行深度学习矩阵运算,诸如用于神经网络训练和推理的卷积运算。在一个实施例中,每个张量核心在4×4矩阵上运算并且执行矩阵乘法和累加运算D=A×B+C,其中A、B、C和D是4×4矩阵。
在一个实施例中,矩阵乘法输入A和B是16位浮点矩阵,而累加矩阵C和D可以是16位浮点或32位浮点矩阵。张量核心对16位浮点输入数据进行运算并与32位浮点进行累加。16位浮点乘法需要64次运算,产生全精度的积,然后使用32位浮点与4×4×4矩阵乘法的其他中间积相加来累加。在实践中,张量核心用于执行由这些较小的元素建立的更大的二维或更高维的矩阵运算。API(诸如CUDA 9C++API)公开了专门的矩阵加载、矩阵乘法和累加以及矩阵存储运算,以便有效地使用来自CUDA-C++程序的张量核心。在CUDA层面,线程束级接口假定16×16尺寸矩阵跨越线程束的全部32个线程。
每个SM 1840还包括执行特殊函数(例如,属性评估、倒数平方根等)的M个SFU1952。在一个实施例中,SFU 1952可以包括树遍历单元,其被配置为遍历层次树形数据结构。在一个实施例中,SFU 1952可以包括被配置为执行纹理映射过滤操作的纹理单元。在一个实施例中,纹理单元被配置为从存储器1704加载纹理映射(例如,纹理像素的2D阵列)并且对纹理映射进行采样以产生经采样的纹理值,用于在由SM 1840执行的着色器程序中使用。在一个实施例中,纹理映射被存储在共享存储器/L1高速缓存1970中。纹理单元实现纹理操作,诸如使用mip映射(即,不同细节层次的纹理映射)的过滤操作。在一个实施例中,每个SM 1740包括两个纹理单元。
每个SM 1840还包括N个LSU 1954,其实现共享存储器/L1高速缓存1970和寄存器文件1920之间的加载和存储操作。每个SM 1840包括互连网络1980,其将每个功能单元连接到寄存器文件1920以及将LSU 1954连接到寄存器文件1920、共享存储器/L1高速缓存1970。在一个实施例中,互连网络1980是交叉开关,其可以被配置为将任何功能单元连接到寄存器文件1920中的任何寄存器,以及将LSU 1954连接到寄存器文件和共享存储器/L1高速缓存1970中的存储器位置。
共享存储器/L1高速缓存1970是片上存储器阵列,其允许数据存储和SM 1840与图元引擎1835之间以及SM 1840中的线程之间的通信。在一个实施例中,共享存储器/L1高速缓存1970包括128KB的存储容量并且在从SM 1840到分区单元380的路径中。共享存储器/L1高速缓存1970可以用于高速缓存读取和写入。共享存储器/L1高速缓存1970、L2高速缓存1860和存储器1704中的一个或更多个是后备存储。
将数据高速缓存和共享存储器功能组合成单个存储器块为两种类型的存储器访问提供了最佳的总体性能。该容量可由不使用共享存储器的程序用作高速缓存。例如,如果将共享存储器配置为使用一半容量,则纹理和加载/存储操作可以使用剩余容量。在共享存储器/L1高速缓存1970内的集成使共享存储器/L1高速缓存1970起到用于流式传输数据的高吞吐量管道的作用,并且同时提供高带宽和对频繁重用数据的低延迟的访问。
图24示出了SM 1840的一个示例性架构。如图21所示,SM 1840可以耦合到一个或更多个纹理单元1842和/或一个或更多个TTU 700。作为性能和区域之间的折衷,一个示例性非限制性实施例可以包括单个纹理单元1842和/或每组SM 1840单个TTU 700(例如,参见图21)。TTU 700可以经由存储器输入-输出中的TTU输入/输出块与SM 1840通信,并且经由专用读取接口与L1高速缓存通信。在一个示例性实施例中,TTU 700仅从主存储器读取并且不写入主存储器。
示例性更详细的TTU架构
如上所述,TTU 700可以是SM 1840的协处理器。与纹理处理器类似,它通过一组SM指令暴露,访问存储器作为L1高速缓存的只读客户端,并返回结果进入SM寄存器文件。与一些纹理处理器不同,对于典型查询,可能需要传入和传出TTU 700的数据量使得在一些实施例中难以在单个指令中指定所有源寄存器和目的地寄存器(并且因为大多数这样的数据每个线程是唯一的,没有纹理头和采样器的TTU模拟)。结果,在一些实施例中,TTU 700通过多指令序列编程。在一些实现中,该序列可以概念化为单个“宏指令”。
同样像纹理单元1842,在一些实现中,TTU 700可以依赖于由软件预先填充的存储器中的某些只读数据结构。这些包括:
--一个或更多个BVH,其中每个BVH例如是轴对齐的包围盒的树,以压缩格式存储,与未压缩的表示相比,其大大减少了存储器通信量。BVH中的每个节点都存储为complet结构,其中一些实现中的大小和对齐与L1高速缓存行的大小和对齐相匹配。优选地,将给定父级的子级complet连续地存储在存储器中,并且以压缩形式存储子指针。
--零个或更多个实例节点,其提供将一个BVH的叶连接到另一个BVH的根的方式。实例节点可以是也对齐的数据结构。该结构可以包含指向子BVH的指针,影响子BVH中的背面剔除行为的标记,以及对应于从顶层BVH(通常为“世界空间”)的坐标系到子BVH(通常为“对象空间”)的坐标系的任意变换矩阵(在齐次坐标中)的前三行的矩阵。在一些实施例中,矩阵的最后一行在一些实现中隐含地为(0,0,0,1)。
--零个或更多个三角形或其他图元缓冲区,包含例如存储为每顶点坐标的三元组或以TTU 700理解的无损压缩格式存储的三角形。此外,可以为每个三角形或其他图元提供α位,指示需要由软件进行特殊处理的三角形,以确定三角形实际上是否与给定光线相交。三角形缓冲区可以组织成块。也可能存在每个三角形力-无-剔除功能位。设置时,该位表示三角形的两侧应被视为相对于剔除的前向或后向,即,不应该剔除三角形,因为光线与“后”而不是“前”相交。最简单的用例是用于表示叶的单个三角形,如果光线在背面上碰撞它,我们仍然可以看到叶。
在一些实施例中,TTU 700是无状态的,意味着在查询之间不在TTU中维持架构状态。同时,在SM 1840上运行软件对要求继续先前的查询通常是有用的,这意味着相关状态应该由TTU 700写入寄存器,然后在寄存器中传递回TTU(通常原地)继续。该状态可以采用遍历堆栈的形式,其追踪BVH遍历的进展。
还可以提供少量堆栈初始化器以开始给定类型的新查询,例如:
·从complet开始遍历
·光线与一系列三角形的交点
·光线与一系列三角形的交点,然后从complet开始遍历
·从三角形缓冲区中获取给定三角形的顶点
·可选支持在“从complet开始的遍历”和“光线与一系列三角形的交点”前面的实例变换。
顶点获取是一种简单查询,其可以由包括堆栈初始化器的请求数据指定而不是其他任何东西。其他查询类型可能需要指定光线或光束,以及堆栈或堆栈初始化器以及描述查询详细信息的各种光线标记。光线由其三坐标原点、三坐标方向以及沿光线的t参数的最小值和最大值给定。另外通过第二原点和方向给定光束。
各种光线标记可用于控制遍历行为、背面剔除和各种子节点类型的处理的各个方面,受制于可选的rayOp测试的通过/失败状态。RayOps为TTU的容量增加了相当大的灵活性。在一些示例性实施例中,RayOps部分引入两个光线标记版本,其可以基于对光线传送的数据的指定操作和存储在complet中的数据来动态选择。为了探索这样的标记,首先要了解BVH中允许的不同类型的子节点,以及TTU 700可以返回SM的各种碰撞类型。
示例性节点类型是:
■子complet(即,内部节点)
默认情况下,TTU 700通过下降到子complet继续遍历。
■三角形范围,对应于三角形缓冲区内的一组连续三角形
(1)默认情况下,通过三角形相交测试并相应地缩短光线,由TTU 700本地处理光线遇到三角形范围。如果遍历完成并且三角形被碰撞,则默认行为是将三角形ID以及交点的t值和重心坐标返回到SM 1840。这是“三角”碰撞类型。
(2)默认情况下,即使遍历尚未完成,设置了α位的相交三角形也会返回到SM1840。如果软件确定三角形实际上是透明的,则返回的遍历堆栈包含继续遍历所需的状态。
(3)在一些实施例中,光束不支持三角形相交,因此遇到的三角形范围默认返回到SM 1840作为“TriRange”碰撞类型,其包括指向与范围重叠的第一个三角形块的指针,指定范围的参数,以及与叶包围盒交点的t值。
■项目范围,由索引(从存储在complet中的用户提供的“项目范围基础”导出)和项目计数组成。
默认情况下,项目范围作为“ItemRange”碰撞类型返回到SM 1840,其由例如索引、计数和与叶包围盒交点的t值组成。
■实例节点。
在一些实施例中,TTU 700可以通过将光线变换为实例BVH的坐标系来本地处理一级实例化。可以用软件处理附加层的实例化(或每个其他层的实例化,取决于策略)。为此提供“实例节点”碰撞类型,包括指向实例节点的指针和与叶包围盒的交点的t值。在其他实现中,硬件可以处理两层、三层或更多层的实例化。
除了节点特定的碰撞类型之外,还提供了通用的“NodeRef”碰撞类型,其包括指向父complet本身的指针,以及指示与哪个子项相交的ID和该子项与包围盒的交点的t值。
可以针对不正确地形成查询或BVH或者遍历期间遍历遇到问题的情况提供“错误”碰撞类型。
可以为光线或光束未碰撞场景中的所有几何形状的情况提供“无”碰撞类型。
TTU如何处理四种可能节点类型中的每一种由一组节点特定模式标记确定,该标记被设置为给定光线的查询的一部分。上面提到的“默认”行为对应于模式标记被设置为全零的情况。
标记的替代值允许剔除给定类型的所有节点,将给定类型的节点作为NodeRef碰撞类型返回到SM,或者使用它们相应的碰撞类型将三角形范围或实例节点返回到SM,而不是在TTU 700内本地处理它们。
可以提供附加模式标记以用于控制α三角形的处理。
示例性计算系统
具有多个GPU和CPU的系统被用于各种行业,因为开发者在应用(诸如人工智能计算)中暴露和利用更多的并行性。在数据中心、研究机构和超级计算机中部署了具有数十至数千个计算节点的高性能GPU加速系统,以解决更大的问题。随着高性能系统内处理设备数量的增加,通信和数据传输机制需要扩展以支持处理设备之间的增加的数据传输。
图25是根据一个实施例的使用图19的PPU 1700实现的处理系统1900的概念图。示例性系统1900可以被配置为实现本申请中公开的一种或更多种方法。处理系统1900包括CPU 1930、交换机1910和多个PPU 1700中的每一个以及相应的存储器1704。NVLink 1710提供每个PPU 1700之间的高速通信链路。尽管图25中示出了特定数量的NVLink 1710和互连1702连接,但是到每个PPU 1700和CPU 1930的连接的数量可以改变。交换机1910在互连1702和CPU 1930之间接口。PPU 1700、存储器1704和NVLink 1710可以位于单个半导体平台上以形成并行处理模块1925。在一个实施例中,交换机1912支持在各种不同连接和/或链路之间接口的两个或更多个协议。
在另一个实施例(未示出)中,NVLink 1710在每个PPU 1700和CPU 1930之间提供一个或更多个高速通信链路,并且交换机1912在互连1702和每个PPU 1700之间进行接口。PPU 1700、存储器1704和互连1702可以位于单个半导体平台上以形成并行处理模块1925。在又一个实施例(未示出)中,互连1702在每个PPU 1700和CPU 1930之间提供一个或更多个通信链路,并且交换机1912使用NVLink 1710在每个PPU 1700之间进行接口,以在PPU 1700之间提供一个或更多个高速通信链路。在另一个实施例(未示出)中,NVLink 1710在PPU1700和CPU 1930之间通过交换机1912提供一个或更多个高速通信链路。在又一个实施例(未示出)中,互连1702在每个PPU 1700之间直接地提供一个或更多个通信链路。可以使用与NVLink 1710相同的协议将一个或更多个NVLink 1710高速通信链路实现为物理NVLink互连或者片上或裸晶上互连。
在本说明书的上下文中,单个半导体平台可以指在裸晶或芯片上制造的唯一的单一的基于半导体的集成电路。应该注意的是,术语单个半导体平台也可以指具有增加的连接的多芯片模块,其模拟片上操作并通过利用常规总线实现方式进行实质性改进。当然,根据用户的需要,各种电路或器件还可以分开放置或以半导体平台的各种组合来放置。可选地,并行处理模块1925可以被实现为电路板衬底,并且PPU 1700和/或存储器1704中的每一个可以是封装器件。在一个实施例中,CPU 1930、交换机1912和并行处理模块1925位于单个半导体平台上。
在一个实施例中,每个NVLink 1710的信令速率是20到25千兆位/秒,并且每个PPU1700包括六个NVLink 1710接口(如图25所示,每个PPU 1700包括五个NVLink 1710接口)。每个NVLink 1710在每个方向上提供25千兆位/秒的数据传输速率,其中六条链路提供1700千兆位/秒的数据传输速率。当CPU 1930还包括一个或更多个NVLink 1710接口时,NVLink1710可专门用于如图25所示的PPU到PPU通信,或者PPU到PPU以及PPU到CPU的某种组合。
在一个实施例中,NVLink 1710允许从CPU 1930到每个PPU 1700的存储器1704的直接加载/存储/原子访问。在一个实施例中,NVLink 1710支持一致性操作,允许从存储器1704读取的数据被存储在CPU 1930的高速缓存层次结构中,减少了CPU 1930的高速缓存访问延迟。在一个实施例中,NVLink 1710包括对地址转换服务(ATS)的支持,允许PPU 1700直接访问CPU 1930内的页表。一个或更多个NVLink 1710还可以被配置为以低功率模式操作。
图26示出了示例性系统1965,其中可以实现各种先前实施例的各种体系架构和/或功能。示例性系统1965可以被配置为实现本申请中公开的一种或更多种方法。
如图所示,提供系统1965,其包括连接到通信总线1975的至少一个中央处理单元1930。通信总线1975可以使用任何合适的协议来实现,诸如PCI(外围组件互连)、PCI-Express、AGP(加速图形端口)、超传输或任何其他总线或一个或更多个点对点通信协议。系统1965还包括主存储器1940。控制逻辑(软件)和数据被存储在主存储器1940中,主存储器1940可以采取随机存取存储器(RAM)的形式。
系统1965还包括输入设备1960、并行处理系统1925和显示设备1945,即常规CRT(阴极射线管)、LCD(液晶显示器)、LED(发光二极管)、等离子显示器等。可以从输入设备1960(例如键盘、鼠标、触摸板、麦克风等)接收用户输入。前述模块和/或设备中的每一个甚至可以位于单个半导体平台上以形成系统1965。可选地,根据用户的需要,各个模块还可以分开放置或以半导体平台的各种组合来放置。
此外,系统1965可以出于通信目的通过网络接口1935耦合到网络(例如,电信网络、局域网(LAN)、无线网络、广域网(WAN)(诸如因特网)、对等网络、电缆网络等)。
系统1965还可以包括辅助存储(未示出)。辅助存储610包括例如硬盘驱动器和/或可移除存储驱动器、代表软盘驱动器、磁带驱动器、光盘驱动器、数字多功能盘(DVD)驱动器、记录设备、通用串行总线(USB)闪存。可移除存储驱动器以众所周知的方式从可移除存储单元读取和/或写入可移除存储单元。
计算机程序或计算机控制逻辑算法可以存储在主存储器1940和/或辅助存储中。这些计算机程序在被执行时使得系统1965能够执行各种功能。存储器1940、存储和/或任何其他存储是计算机可读介质的可能示例。
各种在先附图的架构和/或功能可以在通用计算机系统、电路板系统、专用于娱乐目的的游戏控制台系统、专用系统和/或任何其他所需的系统的上下文中实现。例如,系统1965可以采取台式计算机、膝上型计算机、平板电脑、服务器、超级计算机、智能电话(例如,无线、手持设备)、个人数字助理(PDA)、数字相机、运载工具、头戴式显示器、手持式电子设备、移动电话设备、电视机、工作站、游戏控制台、嵌入式系统和/或任何其他类型的逻辑的形式。
机器学习
在处理器(诸如PPU 1700)上开发的深度神经网络(DNN)已经用于各种使用情况:从自驾车到更快药物开发,从在线图像数据库中的自动图像字幕到视频聊天应用中的智能实时语言翻译。深度学习是一种技术,它建模人类大脑的神经学习过程,不断学习,不断变得更聪明,并且随着时间的推移更快地传送更准确的结果。一个孩子最初是由成人教导,以正确识别和分类各种形状,最终能够在没有任何辅导的情况下识别形状。同样,深度学习或神经学习系统需要在对象识别和分类方面进行训练,以便在识别基本对象、遮挡对象等同时还有为对象分配情景时变得更加智能和高效。
在最简单的层面上,人类大脑中的神经元查看接收到的各种输入,将重要性级别分配给这些输入中的每一个,并且将输出传递给其他神经元以进行处理。人造神经元或感知器是神经网络的最基本模型。在一个示例中,感知器可以接收一个或更多个输入,其表示感知器正被训练为识别和分类的对象的各种特征,并且在定义对象形状时,这些特征中的每一个基于该特征的重要性赋予一定的权重。
深度神经网络(DNN)模型包括许多连接的感知器(例如节点)的多个层,其可以用大量输入数据来训练以快速高精度地解决复杂问题。在一个示例中,DLL模型的第一层将汽车的输入图像分解为各个部分,并查找基本图案(诸如线条和角)。第二层组装线条以寻找更高层的图案,诸如轮子、挡风玻璃和镜子。下一层识别运载工具类型,最后几层为输入图像生成标签,识别特定汽车品牌的型号。
一旦DNN被训练,DNN就可以被部署并用于在被称为推理(inference)的过程中识别和分类对象或图案。推理的示例(DNN从给定输入中提取有用信息的过程)包括识别存入ATM机中的支票上的手写数字、识别照片中朋友的图像、向超过五千万用户提供电影推荐、识别和分类不同类型的汽车、行人和无人驾驶汽车中的道路危险或实时翻译人类言语。
在训练期间,数据在前向传播阶段流过DNN,直到产生预测为止,其指示对应于输入的标签。如果神经网络没有正确标记输入,则分析正确标签和预测标签之间的误差,并且在后向传播阶段期间针对每个特征调整权重,直到DNN正确标记该输入和训练数据集中的其他输入为止。训练复杂的神经网络需要大量的并行计算性能,包括由PPU 1700支持的浮点乘法和加法。与训练相比,推理的计算密集程度比训练低,其是一个延迟敏感过程,其中经训练的神经网络应用于它以前没有见过的新的输入,以进行图像分类、翻译语音以及通常推理新的信息。
神经网络严重依赖于矩阵数学运算,并且复杂的多层网络需要大量的浮点性能和带宽来提高效率和速度。采用数千个处理核心,针对矩阵数学运算进行了优化,并传送数十到数百TFLOPS的性能,PPU 1700是能够传送基于深度神经网络的人工智能和机器学习应用所需性能的计算平台。
以上引用的所有专利和出版物均通过引用并入,如同明确阐述一样。
虽然已经结合目前被认为是最实用和优选的实施例描述了本发明,但是应该理解,本发明不限于所公开的实施例,而是相反,旨在涵盖各种实施例。在所附权利要求的精神和范围内包括的修改和等同布置。
Claims (35)
1.一种系统,包括:
存储器,被配置为存储包括多个层次节点和多个数据块的加速数据结构的至少一部分,所述多个数据块标识虚拟场景的图元;以及
自主硬件电路,其可操作地耦合到所述存储器,并且被配置为:
按照从所述存储器返回所述多个数据块的顺序确定与光线相交的图元;以及
报告被确定为与光线相交的所述图元的至少一部分以提供确定性的可视化结果,而不管从存储器返回所述多个数据块的所述顺序,同时机会性地从所述报告中省略沿着所述光线的长度、位于比更靠近所述光线的原点的图元交点更远的位置的一个或更多个图元交点。
2.如权利要求1所述的系统,其中所述自主硬件电路包括协处理器。
3.如权利要求1所述的系统,其中所述数据块是高速缓存线大小的块,每个高速缓存线大小的块包括不同的图元集,并且所述数据块由所述硬件电路不按照在所述存储器中存储所述数据块的顺序接收。
4.如权利要求1所述的系统,其中,在所述多个数据块中标识的所述图元包括不透明图元和α图元,并且从所述报告中省略的所述一个或更多个图元交点包括沿着所述光线的长度、位于比更靠近所述光线的原点的所述图元交点更远的位置的被确定与所述光线相交的一个或更多个α图元。
5.如权利要求1所述的系统,其中,从所述报告中省略的一个或更多个图元包括被证明能够被省略而不会对可视化所述虚拟场景产生功能性影响的图元。
6.如权利要求5所述的系统,其中,与所述光线相交的、被证明能够被省略而不会对可视化所述虚拟场景产生功能性影响的所述图元比被确定为与所述光线相交的另一图元在参数上远离所述光线的所述原点。
7.如权利要求1所述的系统,其中在所述多个数据块中标识的所述图元包括不透明图元和α图元,并且所述硬件电路被配置为向处理器:报告与所述光线相交的不透明图元,所述不透明图元是与所述光线的原点在参数上最接近的相交的不透明图元;并且以在所述多个数据块中存储α图元的顺序报告与所述光线相交的多个α图元。
8.如权利要求1所述的系统,其中在所述多个数据块中标识的所述图元包括α图元和不透明图元,并且所述硬件电路被配置为:
当确定光线与新不透明图元相交时,存储所述新不透明图元的交点信息,并使被确定为与所述光线相交的、沿所述光线在参数上比所述新不透明图元更远的α图元和不透明图元无效。
9.如权利要求1所述的系统,其中,所述多个数据块标识包括α图元的图元范围,并且确定与所述光线相交的所述图元包括:
在确定所述光线与所述图元范围中的新α图元相交时,确定存储一个或更多个相交图元的交点信息的结果队列是否包括用于存储新相交α图元的交点信息的空条目;
在确定所述结果队列不包括所述空条目时,确定与所述新相交α图元来自相同的图元范围的更高存储器顺序的α交点是否存储在所述结果队列中;以及
在确定与所述新相交α图元来自相同的图元范围的所述更高存储器顺序的α交点存储在所述结果队列中时,将所述更高存储器顺序的α交点替换为新α图元交点;并且
其中报告被确定为与所述光线相交的所述图元的所述一部分包括将存储在所述结果队列中的交点信息发送到处理器。
10.如权利要求1所述的系统,其中在所述多个数据块中标识的所述图元包括不透明图元,并且所述硬件电路被配置为:
当确定所述光线与沿着所述光线具有相同参数长度交点的两个或更多个不透明图元相交时,报告所述两个或更多个不透明图元中较早地存储在所述多个数据块中的单个不透明图元交点。
11. 如权利要求1所述的系统,其中在所述多个数据块中标识的所述图元包括不透明图元和α图元,并且报告被确定为与所述光线相交的所述图元的所述一部分包括:
向处理器标识与所述光线相交的不透明图元,其是与所述光线的所述原点在参数上最接近的相交的不透明图元;以及
将与所述光线相交且在空间上位于所述光线的原点与在参数上最接近的不透明图元之间的多个α图元以在所述多个数据块中存储相交的α图元的顺序标识到所述处理器。
12. 一种系统,包括:
存储器,被配置为存储包括多个层次节点的加速数据结构的至少一部分,至少一个节点标识虚拟场景的图元;以及
自主硬件电路,其可操作地耦合到所述存储器,并且被配置为:
按照从存储器中接收在所述至少一个节点中标识的所述图元的顺序确定与光线相交的图元,其中确定与所述光线相交的图元包括:
在确定所述光线与新图元相交时,确定结果队列是否包括空条目以存储新相交图元的交点信息;
在确定所述结果队列包括用于存储所述新相交图元的交点信息的空条目时,存储所述新相交图元的交点信息;
在确定所述结果队列不包括用于存储所述新相交图元的交点信息的空条目时,确定所述新相交图元是否比在所述结果队列中存储其交点信息的其他相交图元更早地存储在存储器中;以及
在确定所述新相交图元比所述其他相交图元更早地存储在存储器中时,将其他相交图元之一的交点信息替换为所述新相交图元的交点信息;以及
以在存储器中存储所述图元的存储器顺序报告被确定为与所述光线相交的所述图元的至少一部分,其中报告被确定为与所述光线相交的所述图元的所述一部分包括将存储在所述结果队列中的交点信息发送到处理器。
13.如权利要求12所述的系统,其中,所述新相交图元在空间上位于所述虚拟场景中比其信息存储在所述结果队列中的其他相交图元更远离所述光线的原点处。
14. 一种系统,包括:
存储器,被配置为存储包括多个层次节点的加速数据结构的至少一部分,至少一个节点标识在连续的块组内编码的虚拟场景的一系列三角形;以及
自主硬件电路,其可操作地耦合到所述存储器,并且被配置为:
按照从存储器接收所述一系列三角形中的三角形的顺序确定与光线相交的三角形;以及
按照在所述存储器中存储相交的三角形的存储器顺序报告被确定为与所述光线相交的所述三角形中的所述至少一部分,其中所述硬件电路包括光线-三角形测试和变换单元以及相交管理单元,所述光线-三角形测试和变换单元包括处理逻辑,其被配置为将所述光线从世界空间变换到所述三角形范围的对象空间,以及确定所述三角形范围中与所述光线在所述对象空间中相交的三角形,以及所述相交管理单元包括结果队列,并且被配置为确定哪些相交的三角形被证明能够被省略而不会对可视化虚拟场景产生功能性影响,以及以在所述存储器中存储所述相交的三角形的存储器顺序将所述相交的三角形返回到处理器。
15.一种由耦合到多处理器的基于硬件的遍历协处理器实现的方法,所述方法包括:
将包括多个层次节点和多个数据块的加速数据结构的至少一部分存储在存储器中,所述多个数据块标识虚拟场景的图元;
按照从所述存储器返回所述多个数据块的顺序确定与光线相交的图元;以及
向所述多处理器报告被确定为与所述光线相交的所述图元的至少一部分以提供确定性的可视化结果,而不管从存储器返回所述多个数据块的所述顺序,同时机会性地从所述报告中省略沿着所述光线的长度、位于比更靠近所述光线的原点的图元交点更远的位置的一个或更多个图元交点。
16.如权利要求15所述的方法,其中,所述数据块是高速缓存线大小的块,每个高速缓存线大小的块包括在所述多个数据块中标识的不同的图元集,并且所述数据块由所述基于硬件的遍历协处理器不按照在所述存储器中存储所述数据块的顺序接收。
17.如权利要求15所述的方法,其中,在所述多个数据块中标识的所述图元包括不透明图元和α图元,并且从所述报告中省略的所述一个或更多个图元交点包括沿着所述光线的长度、位于比更靠近所述光线的原点的所述图元交点更远的位置的被确定与所述光线相交的一个或更多个α图元。
18.如权利要求15所述的方法,其中,从所述报告中省略的一个或更多个图元包括被证明能够被省略而不会对可视化所述虚拟场景产生功能性影响的图元。
19.如权利要求18所述的方法,其中,与所述光线相交的、被证明能够被省略而不会对可视化所述虚拟场景产生功能性影响的所述图元比被确定为与所述光线相交的另一图元在参数上更远离所述光线的所述原点。
20.如权利要求15所述的方法,其中在所述多个数据块中标识的所述图元包括不透明图元和α图元,并且所述基于硬件的遍历协处理器被配置为向所述多处理器:标识与所述光线相交的不透明图元,所述不透明图元是与所述光线的原点在参数上最接近的相交的不透明图元;并且以在所述多个数据块中存储相交的α图元的顺序向所述多处理器标识与所述光线相交的多个α图元。
21. 如权利要求15所述的方法,其中,在所述多个数据块中标识的所述图元包括不透明图元和α图元,并且所述方法还包括:
向所述多处理器标识与所述光线相交的不透明图元,其是与所述光线的所述原点在参数上最接近的相交的不透明图元;以及
将与所述光线相交且在空间上位于所述光线的原点和在参数上最接近的不透明图元之间的多个α图元以在所述多个数据块中存储相交的α图元的顺序标识到所述多处理器。
22.如权利要求15所述的方法,其中,在所述多个数据块中标识的所述图元包括α三角形和不透明三角形,并且所述光线由三坐标原点、三坐标方向以及沿所述光线的t参数的最小值和最大值标识。
23.一种基于硬件的遍历协处理器,被配置为:
从多处理器接收标识光线和树形数据结构的查询,以测试图元与所述光线的交点;
从所述遍历协处理器外部的存储器中检索所述树形数据结构的部分,每个部分标识在所述树形数据结构中标识的层次包围盒的一个或更多个包围盒;
确定与所述光线相交的所述层次包围盒的细分,与所述光线相交的所述细分标识一系列图元;
将所述一系列图元推送到堆栈上,所述图元在与所述光线相交的层次包围盒的所述细分中被标识;
按照从所述存储器接收所述一系列图元中的图元的顺序确定与所述光线相交的图元;
按照在存储器中存储被确定为与所述光线相交的图元被存储的存储器顺序,将被确定为与所述光线相交的图元的一个或更多个交点存储在结果队列中;以及
将存储在所述结果队列中的相交图元的交点信息返回到所述多处理器。
24.如权利要求23所述的遍历协处理器,其中所述存储器被配置为存储多个高速缓存线大小的块,每个高速缓存线大小的块包括不同的图元集,所述不同的图元集被包括在所述一系列图元中,并且所述块由所述基于硬件的遍历协处理器不按照在所述存储器中存储所述块的顺序接收。
25.如权利要求23所述的遍历协处理器,其中存储在所述结果队列中的所述相交图元在所述树形数据结构的中间遍历中被发送到所述多处理器。
26.如权利要求23所述的遍历协处理器,其中存储在所述结果队列中的所述相交图元在完成对被确定为与所述光线相交的所述细分中的所述一系列图元的图元级处理时被发送到所述多处理器。
27. 一种系统,包括:
存储器,被配置为存储包括多个层次节点的加速数据结构的至少一部分,至少一个节点标识包括虚拟场景的图元的图元范围;以及
基于硬件的遍历协处理器,可操作地耦合到所述存储器和多处理器,所述遍历协处理器被配置为:
从所述多处理器接收标识光线和所述图元范围的查询;
从所述存储器接收标识所述图元范围中的所述图元的多个高速缓存线大小的块;
确定一系列图元中的与光线相交的图元;以及
向所述多处理器报告被确定为与所述光线相交的所述图元中的至少一部分图元的交点信息,以提供确定性的可视化结果,而不管由所述基于硬件的遍历协处理器从所述存储器接收的所述多个高速缓存线大小的块的顺序。
28.如权利要求27所述的系统,其中,遍历协处理器被配置为按照在所述高速缓存线大小的块中标识的所述图元的顺序以及按照从所述存储器接收所述高速缓存线大小的块的顺序处理在所述高速缓存线大小的块中标识的所述图元。
29.如权利要求27所述的系统,其中,遍历协处理器被配置为与所述交点信息一起报告继续遍历所述加速数据结构以确定与所述光线相交的其他图元所需的状态信息。
30. 一种系统,包括:
存储器,被配置为存储包括多个层次节点的加速数据结构的至少一部分,至少一个节点标识虚拟场景的图元范围,所述图元范围中的图元存储在多个高速缓存线大小的块中,每个块包括所述图元范围的不同的图元集;以及
可操作地耦合到处理器和所述存储器的硬件电路,被配置为:
按照从所述存储器返回所述块的顺序处理所述块,以确定与光线相交的图元,其中所述块由所述硬件电路不按照在所述存储器中存储所述块的顺序接收;以及
在处理了所述多个块中的每一者之后,向所述处理器报告被确定为与所述光线相交的所述图元中的至少一部分图元的交点信息,以提供确定性的可视化结果,而不管从所述存储器返回所述块的所述顺序。
31. 如权利要求30所述的系统,其中所述图元范围包括不透明图元和α图元,并且所述硬件电路被配置为:
将被确定为与所述光线相交的至少一部分图元的交点信息存储在结果队列中,以及
当只有不透明图元交点存储在所述结果队列中并且没有标志指示在所述图元范围中找到的图元交点因为所述结果队列已满而被丢弃或无效时,在报告所述不透明图元交点存储在所述结果队列中之前,处理来自另一个图元范围的图元以确定交点。
32. 如权利要求30所述的系统,其中所述图元范围包括不透明图元和α图元,并且所述硬件电路被配置为:
将被确定为与所述光线相交的所述图元的交点信息存储在结果队列中,以及
当一个或更多个α图元交点存储在所述结果队列中且没有标志指示所述图元范围中找到的图元交点因为所述结果队列已满而被丢弃或无效且所述结果队列未满时,在报告所述图元交点存储在所述结果队列中之前处理来自另一个图元范围的图元以确定交点。
33. 如权利要求30所述的系统,其中所述硬件电路被配置为:
将被确定为与所述光线相交的所述图元的交点信息存储在结果队列中,以及
当所述图元范围中的每个图元已被处理并且光线模式位指示继续遍历时,在报告所述交点信息存储在所述结果队列中之前处理来自另一个图元范围的图元以确定交点。
34. 一种系统,包括:
存储器,被配置为存储包括多个层次节点的加速数据结构的至少一部分,至少一个节点标识虚拟场景的图元范围,所述图元范围包括存储在多个高速缓存线大小的块中的不透明图元和α图元,每个高速缓存线大小的块包括所述图元范围的不同的图元集;以及
可操作地耦合到所述存储器的自主硬件电路,被配置为:
按照从所述存储器接收所述块的顺序处理所述块,以确定与光线相交的图元,其中所述块由所述硬件电路不按照在所述存储器中存储所述块的顺序接收;
将被确定为与所述光线相交的至少一部分图元的交点信息存储在结果队列中;
当所述结果队列没有空间来存储被确定为与所述光线相交的α图元的交点信息或者存储在所述结果队列中的α图元交点被另一个α图元替换时,设置剩余α标志,指示所述图元范围中的其他α图元不包括在所述结果队列中;以及
在所述图元范围中的每个图元被处理后,报告存储在所述结果队列中的所述交点信息。
35. 如权利要求34所述的系统,其中所述硬件电路还被配置为:
当所述结果队列没有空间来存储被确定为与所述光线相交的所述α图元的交点信息或者存储在所述结果队列中的所述α图元交点被另一个α图元替换时,修改遍历堆栈,以在将最高存储器顺序的图元交点存储在所述结果队列中之后继续关于第一α图元测试所述图元范围中的图元;以及
其中所修改的遍历堆栈与存储在所述结果队列中的所述交点信息一起被报告。
Applications Claiming Priority (2)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
US16/101,196 US10740952B2 (en) | 2018-08-10 | 2018-08-10 | Method for handling of out-of-order opaque and alpha ray/primitive intersections |
US16/101,196 | 2018-08-10 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN110827390A CN110827390A (zh) | 2020-02-21 |
CN110827390B true CN110827390B (zh) | 2024-07-09 |
Family
ID=
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US11928772B2 (en) | Method for forward progress and programmable timeouts of tree traversal mechanisms in hardware | |
US11790595B2 (en) | Method for handling of out-of-order opaque and alpha ray/primitive intersections | |
CN110827389B (zh) | 严密的光线三角形相交 | |
US11804000B2 (en) | Query-specific behavioral modification of tree traversal | |
CN110858387B (zh) | 鲁棒且高效的多处理器-协处理器接口 | |
US11645810B2 (en) | Method for continued bounding volume hierarchy traversal on intersection without shader intervention | |
US10810785B2 (en) | Method for forward progress tree traversal mechanisms in hardware | |
CN110827384A (zh) | 用于对数据路径调度的高速缓存请求进行高效分组的方法 | |
CN110827390B (zh) | 处理无序不透明和α光线/图元交点的方法 | |
CN110827385B (zh) | 树遍历的特定于查询的行为修改 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant |