首页> 中国专利> 不采用双精度的水密射线三角形相交

不采用双精度的水密射线三角形相交

摘要

本文描述了一种以产生水密结果的方式执行射线‑三角形相交测试的技术。该技术涉及平移三角形的坐标,使得原点位于射线的原点处。该技术涉及将坐标系投影到射线的视空间中。该技术然后涉及计算重心坐标并插值所述重心坐标,以获得相交时间。重心坐标的符号指示是否发生命中。上述计算是用非定向浮点舍入模式执行的,以提供水密性。非定向舍入模式是一种以不依赖于数字的符号的方式对舍入数字的尾数进行舍入的模式。

著录项

  • 公开/公告号CN113168728A

    专利类型发明专利

  • 公开/公告日2021-07-23

    原文格式PDF

  • 申请/专利权人 超威半导体公司;

    申请/专利号CN201980081641.5

  • 发明设计人 斯凯勒·乔纳森·萨利赫;吴瑞金;

    申请日2019-11-05

  • 分类号G06T15/06(20060101);G06T1/20(20060101);

  • 代理机构31263 上海胜康律师事务所;

  • 代理人樊英如;张静

  • 地址 美国加利福尼亚州

  • 入库时间 2023-06-19 11:55:48

说明书

相关申请的交叉引用

本申请要求2018年12月13日提交的美国非临时专利申请号16/219,820的权益,其内容通过引用并入本文。

背景技术

射线跟踪是一种图形渲染技术,其中投射模拟光线以测试对象相交,并且根据射线投射的结果对像素进行着色。射线跟踪在计算上比基于光栅化的技术更昂贵,但是产生物理上更准确的结果。射线跟踪操作正在不断改进。

附图说明

可从结合附图以举例的方式给出的以下描述中获得更详细的理解,在附图中:

图1是其中能够实现本公开的一个或多个特征的示例性装置的框图;

图2是根据示例的装置的框图,示出了与在图1的加速处理装置上执行处理任务相关的另外的细节;

图3示出了根据示例的使用射线跟踪技术渲染图形的射线跟踪流水线;

图4是根据示例的包围盒层次的图示;

图5示出了根据示例的用于执行射线-三角形相交测试的坐标变换;

图6示出了根据一个示例的作为光栅化操作的射线-三角形相交测试;以及

图7示出了本文所描述的技术应用于其的示例三角形。

具体实施方式

本文描述了一种以产生水密结果的方式执行射线-三角形相交测试的技术。该技术涉及平移三角形的坐标,使得原点位于射线的原点处。该技术涉及将坐标系投影到射线的视空间中。该技术然后涉及计算重心坐标并插值所述重心坐标,以获得相交时间。重心坐标的符号指示是否发生命中。上述计算是用非定向浮点舍入模式执行的,以提供水密性。非定向舍入模式是一种以不依赖于数字的符号的方式对舍入数字的尾数进行舍入的模式。

图1是其中能够实现本公开的一个或多个特征的示例性装置100的框图。装置100包括例如计算机、游戏装置、手持式装置、机顶盒、电视、移动电话或平板电脑。装置100包括处理器102、存储器104、存储装置106、一个或多个输入装置108以及一个或多个输出装置110。装置100还可选地包括输入驱动器112和输出驱动器114。应理解,装置100包括图1中未示出的附加部件。

在各种替代方案中,处理器102包括中央处理单元(CPU)、图形处理单元(GPU)、位于同一管芯上的CPU和GPU、或一个或多个处理器核,其中每个处理器核可能是CPU或GPU。在各种替代方案中,存储器104与处理器102位于同一管芯上,或者与处理器102分开地定位。存储器104包括易失性或非易失性存储器,例如随机存取存储器(RAM)、动态RAM或高速缓存。

存储装置106包括固定或可移动存储装置,例如硬盘驱动器、固态驱动器、光盘或快闪驱动器。输入装置108包括但不限于键盘、小键盘、触摸屏、触摸板、检测器、传声器、加速计、陀螺仪、生物特征扫描仪或网络连接(例如,用于传输和/或接收无线IEEE 802信号的无线局域网卡)。输出装置110包括但不限于显示装置118、扬声器、打印机、触觉反馈装置、一个或多个灯、天线或网络连接(例如,用于无线IEEE 802信号传输和/或接收的无线局域网卡)。

输入驱动器112与处理器102和输入装置108通信,并且容许处理器102接收来自输入装置108的输入。输出驱动器114与处理器102和输出装置110通信,并且容许处理器102将输出发送到输出装置110。注意,输入驱动器112和输出驱动器114为任选部件,并且装置100在不存在输入驱动器112和输出驱动器114的情况下将以相同方式操作。输出驱动器114包括联接到显示装置118的加速处理装置(“APD”)116。APD 116被配置为接受来自处理器102的计算命令和图形渲染命令,以处理那些计算命令和图形渲染命令,并且向显示装置118提供像素输出以供显示。如下面进一步详细描述的,APD 116包括一个或多个并行处理单元,所述一个或多个并行处理单元被配置成根据单指令多数据(“SIMD”)范例执行计算。因此,尽管各种功能在本文中被描述为由APD 116执行或结合APD 116执行,但是在各种替代方案中,被描述为由APD 116执行的功能另外地或替代地由具有类似能力的其他计算装置执行,所述其他计算装置不由主处理器(例如,处理器102)驱动并且未被配置为向显示装置118提供(图形)输出。例如,可以设想,根据SIMD范例执行处理任务的任何处理系统可以被配置为执行本文所描述的功能。替代地,可以设想,不根据SIMD范例执行处理任务的计算系统执行本文所描述的功能。

图2是装置100的框图,示出了与在APD 116上执行处理任务有关的另外的细节。处理器102在系统存储器104中维持一个或多个控制逻辑模块,以供处理器102执行。控制逻辑模块包括操作系统120、驱动器122和应用程序126。这些控制逻辑模块控制处理器102和APD116的操作的各种特征。例如,操作系统120直接与硬件通信,并且为在处理器102上执行的其他软件提供到硬件的接口。驱动器122通过例如向在处理器102上执行的软件(例如,应用程序126)提供应用程序编程接口(“API”)以访问APD 116的各种功能来控制APD 116的操作。在一些实现方式中,驱动器122包括即时编译器,所述即时编译器编译程序以供APD 116的处理部件(诸如下面进一步详细讨论的SIMD单元138)执行。在其他实现方式中,不使用即时编译器来编译程序,并且普通应用程序编译器编译着色器程序以供在APD 116上执行。

APD 116执行针对选定功能的命令和程序,诸如适于并行处理和/或无序处理的图形操作和非图形操作。APD 116用于执行图形流水线操作,诸如像素操作、几何计算,并且基于从处理器102接收到的命令向显示装置118渲染图像。APD 116还基于从处理器102接收的命令执行与图形操作不直接相关的计算处理操作,诸如与视频、物理模拟、计算流体动力学或其他任务相关的操作。

APD 116包括计算单元132,所述计算单元包括一个或多个SIMD单元138,其根据SIMD范例按照处理器102的请求以并行方式执行操作。SIMD范例是这样一种范例:多个处理元件共享单个程序控制流单元和程序计数器,并且因此执行相同的程序,但是能够用不同的数据执行该程序。在一个示例中,每个SIMD单元138包括十六个通道,其中每个通道与SIMD单元138中的其他通道同时执行相同的指令,但是用不同的数据执行所述指令。如果并非所有通道都需要执行给定指令,则可以利用断言关闭通道。断言也可用于执行具有发散控制流的程序。更具体地,对于具有条件分支或其他指令的程序,其中控制流是基于由单个通道执行的计算,与当前未执行的控制流路径相对应的通道的断言以及对不同控制流路径的串行执行允许任意控制流。在一个实现方式中,计算单元132中的每个可以具有本地L1高速缓存。在一个实现方式中,多个计算单元132共享L2高速缓存。

计算单元132中的基本执行单元是工作项。每个工作项代表将在特定通道中并行执行的程序的单个实例。可以在单个SIMD处理单元138上将工作项同时作为“波前”执行。一个或多个波前包括在“工作组”中,所述工作组包括被指定来执行同一程序的工作项集合。通过执行组成工作组的波前中的每个来执行工作组。在替代方案中,波前在单个SIMD单元138上循序执行,或者在不同的SIMD单元138上部分地或完全地并行执行。可以将波前视为可在单个SIMD单元138上同时执行的工作项的最大集合。因此,如果从处理器102接收到的命令指示特定程序将被并行化到该程序不能同时在单个SIMD单元138上执行的程度,则该程序被分解成在两个或更多个SIMD单元138上并行化的或在同一SIMD单元138上串行化的(或根据需要并行化和串行化的)波前。调度器136被配置为执行与调度不同计算单元132和SIMD单元138上的各种波前相关的操作。

由计算单元132提供的并行性适合于与图形有关的操作,诸如像素值计算、顶点变换和其他图形操作。因此,在一些实例中,从处理器102接受图形处理命令的图形流水线134将计算任务提供给计算单元132以并行执行。

计算单元132还用于执行与图形无关或不作为图形流水线134的“正常”操作的一部分执行的计算任务(例如,补充为图形流水线134的操作而执行的处理所执行的自定义操作)。在处理器102上执行的应用程序126或其他软件将定义这种计算任务的程序传输给APD116以执行。

计算单元132实现射线跟踪,所述射线跟踪是通过测试场景中的模拟光线和对象之间的相交来渲染3D场景的技术。射线跟踪中涉及的许多工作由可编程着色器程序来执行,所述可编程着色器程序在计算单元132中的SIMD单元138上执行,如下文另外详细描述的。每个计算单元132还包括用于执行测试以确定射线是否与三角形相交的固定功能硬件加速器,所述固定功能硬件加速器是射线相交单元139。

图3示出了根据示例的使用射线跟踪技术渲染图形的射线跟踪流水线300。射线跟踪流水线300提供利用射线跟踪渲染场景所涉及的操作和实体的概述。射线生成着色器302、任何命中着色器306、最近命中着色器310和未命中着色器312是着色器实现的阶段,其表示射线跟踪流水线阶段,其功能由在SIMD单元138中执行的着色器程序来执行。在每个特定着色器实现阶段的任何特定着色器程序由应用程序提供的代码(即,由应用程序开发者提供的代码,所述代码由应用程序编译器预编译和/或由驱动器122编译)来限定。加速结构遍历阶段304执行射线相交测试以确定射线是否命中三角形。加速结构遍历阶段的操作由射线相交测试单元139执行。各种可编程着色器阶段(射线生成着色器302、任何命中着色器306、最近命中着色器310、未命中着色器312)被实现为在SIMD单元138上执行的着色器程序。加速结构遍历阶段在软件中(例如,作为在SIMD单元138上执行的着色器程序)、在硬件中(例如,在射线相交单元139中),或者作为硬件和软件的组合实现。命中或未命中单元308以任何技术上可行的方式实现,诸如作为任何其他单元的一部分,实现为硬件加速结构,或者实现为在SIMD单元138上执行的着色器程序。射线跟踪流水线300可以部分或全部在软件中或者部分或全部在硬件中编排,并且可由处理器102、调度器136、它们的组合或者部分或全部由任何其他硬件和/或软件单元编排。

射线跟踪流水线300以下列方式操作。执行射线生成着色器302。射线生成着色器302针对三角形设置要测试的射线的数据,并且请求射线相交测试单元139测试射线与三角形的相交。

射线相交测试单元139在加速结构遍历阶段304遍历加速结构,所述加速结构是描述场景内的场景体积和对象的数据结构,并且针对场景中的三角形测试射线。命中或未命中单元308可以是加速结构遍历阶段304的一部分,其确定加速结构遍历阶段304的结果(其可以包括诸如重心坐标和潜在命中时间的原始数据)是否实际上指示命中。对于被命中的三角形,射线跟踪流水线300触发任何命中着色器306的执行。注意,单条射线可以命中多个三角形。不保证加速结构遍历阶段将按照从最接近射线原点到最远离射线原点的顺序遍历加速结构。命中或未命中单元308针对射线所命中的最接近射线原点的三角形触发最近命中着色器310的执行,或者,如果未命中三角形,则触发未命中着色器。注意,任何命中着色器306都可能“拒绝”来自射线相交测试单元304的命中,并且因此,如果射线相交测试单元304没有发现或接受命中,则命中或未命中单元308触发未命中着色器312的执行。任何命中着色器306可以“拒绝”命中的示例情况是当射线相交测试单元139报告为被命中的三角形的至少一部分完全透明时。因为射线相交测试单元139仅测试几何形状,而不测试透明度,所以由于在具有至少一些透明度的三角形上的命中而被调用的任何命中着色器306可以确定所报告的命中实际上不是由于在三角形的透明部分上“命中”而导致的命中。最近命中着色器310的典型用途是基于材质的纹理对材质进行着色。未命中着色器312的典型用途是用由天空盒(skybox)设置的颜色对像素进行着色。应理解,为最近命中着色器310和未命中着色器312限定的着色器程序可以实现用于对像素进行着色和/或执行其他操作的多种技术。

射线生成着色器302生成射线的典型方式是用被称为反向射线跟踪的技术。在反向射线跟踪中,射线生成着色器302生成具有位于相机点处的原点的射线。射线与被限定为与屏幕对应的平面相交的点限定屏幕上使用射线确定其颜色的像素。如果射线命中对象,则基于最近命中着色器310对所述像素进行着色。如果射线没有命中对象,则基于未命中着色器312对像素进行着色。每个像素可以投射多条射线,其中像素的最终颜色由为像素的每条射线确定的颜色的某种组合来确定。

任何命中着色器306、最近命中着色器310和未命中着色器312中的任一者都有可能产生它们自己的射线,所述射线在射线测试点处进入射线跟踪流水线300。这些射线可以用于任何目的。一个常见的用途是实现环境照明或反射。在示例中,当调用最近命中着色器310时,最近命中着色器310在各个方向上产生射线。对于由产生的射线命中的每个对象或光,最近命中着色器310将照明强度和颜色添加到对应于最近命中着色器310的像素。应理解,尽管已经描述了可以使用射线跟踪流水线300的各种部件来渲染场景的方式的一些示例,但是可以替代地使用各种各样的技术中的任一种。

如上所描述的,确定射线是否命中对象在本文被称为“射线相交测试”。射线相交测试涉及从原点发射射线并且确定射线是否命中三角形,并且如果命中,则确定三角形命中的地方距原点的距离。为了提高效率,射线跟踪测试使用了称为包围盒层次的空间表示。所述包围盒层次是上面描述的“加速结构”。在包围盒层次中,每个非叶节点表示轴线对齐的包围盒,所述包围盒界定所述节点的所有子节点的几何形状。在示例中,基本节点表示正在对其执行射线相交测试的整个区域的最大范围。在所述示例中,基础节点具有两个子节点,每个子节点表示相互排斥的轴线对齐包围盒,所述轴线对齐包围盒细分整个区域。这两个子节点中的每个都具有两个子节点,所述两个子节点表示轴线对齐的包围盒,所述轴线对齐的包围盒细分其父节点的空间,以此类推。叶节点表示可以对其执行射线测试的三角形。

与不使用包围盒层次数据结构并且因此场景中的所有三角形都必须针对射线进行测试的情况相比,此类数据结构允许减少射线-三角形相交的次数(射线-三角形相交是复杂的,并且因此在处理资源方面是昂贵的)。具体来说,如果射线不与特定的包围盒相交,并且所述包围盒界定大量三角形,则可以从测试中消除所述框中的所有三角形。因此,执行射线相交测试,作为对轴线对齐的包围盒进行的一系列射线测试,然后对三角形进行测试。

图4是根据示例的包围盒层次的图示。为简单起见,层次以2D示出。然而,扩展到3D是简单的,并且应理解,本文所描述的测试通常将在三维中执行。

在图4的左侧示出了包围盒层次的空间表示402,并且在图4的右侧示出了包围盒层次的树表示404。在空间表示402和树表示404两者中,非叶节点用字母“N”表示,并且叶节点用字母“O”表示。射线相交测试将通过遍历树404来执行,并且对于每个被测试的非叶节点,如果对所述非叶节点的测试失败,则消除所述节点下的分支。在示例中,射线与O

射线-三角形测试涉及询问射线是否命中三角形以及命中三角形的时间(从射线原点到交点的时间)。从概念上来说,射线-三角形测试涉及将三角形投影到射线的视空间中,使得可以执行更简单的测试,类似于通常在图形处理流水线中执行的对三角形的二维光栅化的覆盖测试。更具体地,将三角形投影到射线的视空间中变换了坐标系,使得射线在z方向上向下指向,并且射线的x分量和y分量为0(尽管在一些修改中,射线可在z方向上向上指向,或者在正或负x或y方向上向上指向,其中在其他两个轴上的分量为零)。三角形的顶点被变换到所述坐标系中。这种变换允许通过简单地询问射线的x,y坐标是否落在由三角形顶点的x,y坐标限定的三角形内来进行相交测试,这是上面描述的光栅化操作。

图5中示出了所述变换。在变换之前,在坐标系500中示出了射线502和三角形504。在变换后的坐标系510坐标系中,射线512被示出为指向-z方向,并且三角形514也被示出在所述坐标系510中。

图6示出了作为光栅化操作的射线相交测试。具体来说,顶点A、B和C限定三角形514,并且顶点T是射线512的原点。通过测试顶点T是否在三角形ABC内来执行射线512是否与三角形514相交的测试。这将在下面进一步详细描述。

现在提供了射线-三角形测试的另外的细节。首先,旋转坐标系,使得z轴线成为射线的主导轴线(其中“主导轴线”是指射线传播最快的轴线)。进行所述旋转是为了避免在射线方向上的z分量为0时的一些边情况,以及在射线方向的z分量较小时发生的较差的数值稳定性。坐标系旋转以下列方式执行:

这里,kz是辅助变量,用于确定旋转轴线的方向,largest_dim是射线的最大尺寸,ray_dir是限定射线方向的float3,ray_origin是限定射线原点的float3,v0、v1、v2是限定三角形顶点的float3,并且fabs()是浮点绝对值函数。追加.zxy或.yzx至float3旋转float3。.zxy使得新的x分量成为旧的z分量,新的y分量成为新的x分量,并且新的z分量成为旧的z分量。.yzx使得新的x分量成为旧的y分量,新的y分量成为旧的z分量,并且新的z分量成为旧的x分量。上述伪代码确定ray_direction矢量的哪个分量具有最大的绝对值。如果z分量最大,则kz设置为2,并且不执行旋转。如果v分量最大,则将kz设置为1,并且射线和顶点旋转,使得z轴线为旧的y轴线。如果x分量最大,则将kz设置为0,并且射线和顶点旋转,使得z轴线为旧的x轴线。

接下来,顶点全都相对于射线原点平移:

float3 v0_rel=v0-ray_origin;

float3 v1_rel=vl-ray_origin;

float3 v2_rel=v2-ray_origin;

接下来,为了简化相交的计算,对射线和三角形的顶点应用线性变换,以允许以2D执行测试。这种线性变换是通过将顶点和射线方向中的每一者乘以变换矩阵M来完成的。因为由于上述平移步骤ray_origin位于<0,0,0>,因此射线方向可以像这样变换。矩阵M如下:

矩阵乘法以下列方式发生:

float Ax=v0_rel.x*ray_dir.z-ray_dir.x*v0_rel.z;

float Ay=v0_rel.y*ray_dir.z-ray_dir.y*v0_rel.z;

float Az=v0_rel.z;

float Bx=v1_rel.x

float By=vl_rel.y*ray_dir.z-ray_dir.y

float Bz=v1_rel.z;

float Cx=v2_rel.x*ray_dir.z-ray_dir.x*v2_rel.z;

float Cy=v2_rel.y*ray_dir.z-ray_dir.y*v2_rel.z;

float Cz=v2_rel.z;

射线方向不需要由矩阵M明确地变换,因为矩阵M被构造为使得变换后的射线方向将总是<0,0,ray_dir.z>。这是因为以下原因:

ray_dir.x=ray_dir.x*ray_dir.z-ray_dir.z*ray_dir.x=0

ray_dir.y=ray_dir.y*ray_dir.z-ray_dir.z*ray_dir.y=0

ray_dir.z=ray_dir.z

从概念上来说,矩阵M缩放并且剪切坐标,使得射线方向仅具有大小为ray_dir.z的z分量。通过以上述方式变换的顶点,执行射线-三角形测试作为2D光栅化测试。图6示出了具有顶点A、B和C的三角形602。还示出了射线604(点T)。因为在顶点和射线上执行了变换,所以射线指向-z方向。另外,因为三角形被投影到其中射线指向-z方向的坐标系上,所以三角形射线测试被重新表述为测试射线的原点是否在由顶点A、B和C的x、y坐标限定的三角形内。另外,因为上述变换:射线原点在2D点(0,0);射线和三角形(T)的交点也在2D点(0,0);并且因为射线和三角形的交点在(0,0),所以三角形的顶点之间的距离(对于顶点A是A-T,对于顶点B是B-T,并且对于顶点C是C-T)仅是A、B和C。

接下来,三角形的重心坐标U、V、W(如图6中示出的)按下列方式计算:

U=area(Triangle CBT)=0.5*(C x B)

V=area(Triangle ACT)=0.5*(A x C)

W=area(Triangle BAT)=0.5*(B x A)

所述计算简化如下:

float U=Cx*By-Cy*Bx;

float V=Ax*Cy-Ay*Cx;

floatW=Bx*Ay=-By*Ax;

其中不使用除法,因为除以2会在最终结果中被抵消。

U、V和W的符号指示射线是否与三角形相交。更具体地,如果U、V和W都为正,或者如果U、V和W都为负,则因为点T在图6中的三角形之内,所以射线被认为与三角形相交。如果U、V、W的符号不同,则因为点T在图6中的三角形之外,所以射线不与三角形相交。如果U、V和W中的一个恰好为零,则点T位于穿过对应于所述坐标的边的线上。在这种情况下,如果其他两个坐标的符号相同,则点T在三角形602的边上,但是如果其他两个坐标的符号不同,则所述点不在三角形的边上。如果U、V、W中的两个恰好为零,则T点就被认为是在三角形的角上。如果U、V、W全都为零,则所述三角形就是零面积三角形。一个另外的点是,点T可能在以2D的三角形(指示为与上面的三角形相交的射线)之内,但是如果射线在三角形后面,则可能仍然未命中3D空间中的三角形。如下所描述的,t的符号指示射线是否在三角形后面(并且因此不相交)。具体来说,如果符号为负,则射线在三角形后面并且不与三角形相交。如果符号为正或0,则射线与三角形相交。

在各种实现方式中,点在边或角上的任何情况,或者三角形是零面积三角形的情况,都可以被认为是命中或未命中。换句话说,确定位于边上的点是命中还是未命中,和/或确定位于角上的点是命中还是未命中,取决于特定策略。例如,在一些实现方式中,其中点位于边或角上的所有情形都被认为是命中。在其他实现方式中,所有此类情形都被认为是未命中。在又其他实现方式中,一些此类情形(诸如位于在特定方向上面向的边上的点T)被认为是命中,而其他此类情形被认为是未命中。

另外,确定射线命中三角形的时间t。这是通过插值所有三角形顶点的Z值,使用已经计算出的三角形(U、V和W)的重心坐标来完成的。首先,计算点T的z分量(射线与三角形的交点):

其中Az是矢量A的z分量,Bz是矢量B的z分量,Cz是矢量C的z分量,并且U、V和W是上面计算的重心坐标。T.x和T.y为零,并且因此T为(0,0,T.z)。时间t计算如下:

其中distance()表示两点之间的距离,length()表示矢量的长度。相交时间t的最终表达式如下:

为了更好地与数据路径的乘法器对准,可以将所述表达式修改为:

所述值由硬件相交单元以分子和分母(其中t_num是t的分子,并且t_denom是t的分母)的形式提供给着色器(例如,图3中的任何着色器):

float t_num=U*Az+V*Bz+W*Cz;

float t_denom=U*ray_dir.z+V*ray_dir.z+W*ray_dir.z

如上所描述的,重心坐标是根据以下公式计算的:

U=Cx*By-Cy*Bx

V=Ax*Cy-Ay*Cx

W=Bx*Ay-By*Ax

出于若干原因,如果计算不正确,这些计算可能会破坏水密性(即,共享边的三角形之间存在间隙)。图7示出了共享边的两个三角形的示例。第一个三角形702具有顶点A

边706的重心坐标是三角形702的坐标U

U

U

其中B

U

为了发生水密性,U

因为浮点数学的工作方式,不是所有的浮点舍入模式都会导致U

浮点数在概念上包括尾数、基数和指数。浮点数的值等于尾数乘以指数的基数。对于包括舍入的任何数学运算,舍入以这种方式被应用,即产生与如果数学运算被计算到无限精度时将会发生的结果相等的结果,然后尾数被修改以适合可用的位数(例如,较高精度的位被舍弃)。

有几种不同的舍入模式:舍入到零(RTZ)、舍入到最接近的偶数(RTNE)、舍入到正无穷大(RTP)和舍入到负无穷大(RTN)。RTZ和RTNE两者都是非定向舍入模式,并且RTP和RTN两者都是定向舍入模式。舍入模式的“直接性”是指其中尾数的大小被舍入的方式取决于浮点数的符号。在示例数中,未舍入的尾数具有值1010[01],其中括号中的部分是由于没有足够的位数可用(即,尾数仅4个位数可用)而不能用浮点数的精度来表示的部分。在RTZ模式下,尾数将舍入到1010,因为尾数的大小被向零舍入。不管数字具有正号还是负号,都是如此。在RTNE中,尾数也会舍入到1010,这是最接近未舍入尾数的偶数。相比之下,在RTP模式下,尾数将取决于符号进行不同的舍入。具体来说,如果符号为正,则尾数将舍入到1011,也就是向正无穷大。如果符号为负,则尾数将舍入到1010,因为较小大小的负数比较大大小的负数更接近正无穷大。在RTN模式下,结果将相反(如果数字为负,则尾数将舍入到1011;并且如果数字为正,则尾数将舍入到1010)。

出于上述原因,round(X)=-round(-X)(其中“round()”指示浮点舍入运算)并不总是正确的。具体而言,在定向舍入模式中,round(X)的大小可能不同于round(-X)的大小。因此,U

出于上述原因,重心坐标的计算使用定向舍入模式来执行。在一些实现方式中,RTZ或RTNE被用作定向舍入模式。在一些实现方式中,使用RTZ是因为RTZ在硬件中比RTNE更容易实现。另外,在一些实现方式中,用于确定重心坐标和计算t的所有乘法和加法运算都使用非定向舍入模式(而不是定向舍入模式)。不管所涉及的数字是正数还是负数,这都会导致尾数在这些计算中具有相同的值,这将导致水密渲染。这些计算包括相对于射线原点平移顶点的计算,经由矩阵M的乘法投影到射线的视空间中,重心坐标的计算,以及重心坐标的插值以确定射线和三角形t之间的相交时间。在示例中,以非定向舍入模式执行以下每个:平移计算,其从顶点减去射线原点;用于确定Ax、Ay、Bx、By、Cx和Cy的计算中的每个,其包括顶点x、y和z分量与射线方向z分量的相乘以及如上所描述的乘积的减法;用于确定U、V和W的计算中的每个;以及用于确定T.z的分子和分母的计算中的每个,如上所描述的。明确地,以下计算是在非定向舍入模式下执行的:

float3 v0_rel=v0-ray_origin;

float3 v1_rel=v1-ray_origin;

float3 v2_rel=v2-ray_origin;

float Ax=v0_rel.x*ray_dir.z-ray_dir.x*v0_rel.z;

float Ay=v0_rel.y*ray_dir.z-ray_dir.y*v0_rel.z;

float Bx=vl_rel.x*ray_dir.z-ray_dir.x*vl_rel.z;

float By=vl_rel.y*ray_dir.z-ray_dir.y*vl_rel.z;

flOat cx=V2_rel.x*ray_dir·z-ray_dir·x*v2_rel.z;

float cy=v2_rel.y*ray_dir.z-ray_dir.Y*v2_rel.z;

float U=Cx*By-Cy*Bx;

float V=Ax*Cy-Ay*Cx;

float WBx*Ay-By*Ax;

float t_num=U*Az+V*Bz+W*Cz;

float t_denom=U*ray_dir.z+V*ray_dir.z+W*ray_dir.z

在一些示例中,用于执行射线-三角形相交测试的所有上述操作都由射线相交单元139执行。

应理解,基于本文的公开内容,许多变型是可能的。虽然上面以特定的组合描述了特征和要素,但是每个特征或要素能够单独使用而无需其他特征和要素,或者以具有或不具有其他特征和要素的各种组合使用。

所提供的方法可在通用计算机、处理器或处理器内核中实现。举例来说,合适的处理器包括通用处理器、专用处理器、常规处理器、数字信号处理器(DSP)、多个微处理器、与DSP核相关联的一个或多个微处理器、控制器、微控制器、专用集成电路(ASIC)、现场可编程门阵列(FPGA)电路、任何其他类型的集成电路(IC)和/或状态机。能够通过以下方式制造这种处理器:使用处理后的硬件描述语言(HDL)指令的结果和其他中间数据(包括网表)(这种指令能够存储在计算机可读介质上)来配置制造过程。此类处理的结果可以是掩模作品,然后在半导体制造过程中使用所述掩模作品来制造实现实施方案的各方面的处理器。

本文提供的方法或流程图能够在并入非暂时性计算机可读存储介质的计算机程序、软件或固件中实现,以便由通用计算机或处理器执行。非暂时性计算机可读存储介质的示例包括只读存储器(ROM)、随机存取存储器(RAM)、寄存器、高速缓存存储器、半导体存储器装置、磁性介质(诸如内部硬盘和可移动磁盘)、磁光介质以及诸如CD-ROM盘和数字通用光盘(DVD)等光学介质。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号