首页 / 专利库 / 图形技术 / 光线跟踪 / 通过平滑锯齿边缘向计算机生成的图像添加更大的真实感

通过平滑锯齿边缘向计算机生成的图像添加更大的真实感

阅读:830发布:2020-05-13

专利汇可以提供通过平滑锯齿边缘向计算机生成的图像添加更大的真实感专利检索,专利查询,专利分析的服务。并且本 发明 公开了关于通过平滑锯齿边缘向计算机生成的图像添加更大的真实感的技术。在 渲染 图像期间,图像中的特定 像素 会被标识出来,其中 抗锯齿 将是有帮助的。然后对这些标识出的像素执行抗锯齿,其中抗锯齿是用于通过平滑锯齿边缘向数字图像添加更大的真实感的技术。这通过减少执行抗锯齿的图像中的像素数量,降低了执行抗锯齿的成本。,下面是通过平滑锯齿边缘向计算机生成的图像添加更大的真实感专利的具体信息内容。

1.一种方法,包括:
将时间抗锯齿(TAA)应用于图像;
标识由将所述TAA应用于所述图像而导致的失败像素;以及
使用光线跟踪和快速近似抗锯齿(FXAA)的组合,对每个所述失败像素执行抗锯齿。
2.根据权利要求1所述的方法,其中,使用将所述TAA应用于所述图像的结果、使用中间数据、或使用源几何来标识所述失败像素。
3.根据权利要求1所述的方法,其中所述图像是使用前向渲染或延迟渲染来创建的。
4.根据权利要求1所述的方法,其中所述失败像素是在所述TAA期间被标识的,其中:
所述TAA将前一中像素的历史值与当前帧中相邻像素的当前值进行比较,以及具有与相邻像素的所述当前值相差超过预定量的所述历史值的所述像素被标识为失败像素。
5.根据权利要求1所述的方法,其中通过比较像素的深度值和相邻像素的深度值来标识所述失败像素。
6.根据权利要求1所述的方法,其中通过比较像素的亮度值和相邻像素的亮度值来标识所述失败像素。
7.根据权利要求1所述的方法,其中使用哨兵值来标记所述失败像素。
8.根据权利要求1所述的方法,其中所述失败像素包含在分割掩码中。
9.根据权利要求1所述的方法,其中执行所述抗锯齿包括使用GPU光线跟踪确定每个所述失败像素内的子像素区域的点采样可视性。
10.根据权利要求1所述的方法,其中对所述失败像素执行所述抗锯齿的结果与将所述TAA应用于所述图像的结果相结合以创建输出图像。
11.根据权利要求1所述的方法,进一步包括:
标识原始图像中由于前一帧的遮挡或缺少时间数据而不存在数据的一个或更多个像素;以及
使用快速近似抗锯齿(FXAA)对所标识的像素执行抗锯齿。
12.一种系统,包括:
处理器,被配置为:
对图像应用时间抗锯齿(TAA);
标识由将所述TAA应用于所述图像而导致的失败像素;以及
使用光线跟踪和快速近似抗锯齿(FXAA)的组合,对每个所述失败像素执行抗锯齿;以及
存储器,被配置为存储所述抗锯齿的结果。
13.根据权利要求12所述的系统,其中,使用将所述TAA应用于所述图像的结果、使用中间数据、或使用源几何来标识所述失败像素。
14.根据权利要求12所述的系统,其中所述图像是使用前向渲染或延迟渲染来创建的。
15.根据权利要求12所述的系统,其中所述失败像素是在所述TAA期间被标识的,其中:
所述TAA将前一帧中像素的历史值与当前帧中相邻像素的当前值进行比较,以及具有与相邻像素的所述当前值相差超过预定量的所述历史值的所述像素被标识为失败像素。
16.根据权利要求12所述的系统,其中通过比较像素的深度值和相邻像素的深度值来标识所述失败像素。
17.根据权利要求12所述的系统,其中通过比较像素的亮度值和相邻像素的亮度值来标识所述失败像素。
18.根据权利要求12所述的系统,其中使用哨兵值来标记所述失败像素。
19.根据权利要求12所述的系统,其中所述失败像素包含在分割掩码中。
20.一种计算机可读存储介质,存储有指令,当所述指令由处理器执行时,使所述处理器执行以下步骤:
对图像应用时间抗锯齿(TAA);
标识由将所述TAA应用于所述图像而导致的失败像素;以及
使用光线跟踪和快速近似抗锯齿(FXAA)的组合,对每个所述失败像素执行抗锯齿。

说明书全文

通过平滑锯齿边缘向计算机生成的图像添加更大的真实感

[0001] 要求优先权
[0002] 本申请要求2018年4月12日提交的、题为“GPU光线跟踪的自适应时间抗锯齿和混合延迟抗锯齿(Adaptive Temporal and Hybrid Deferred Anti-Aliasing for GPU Ray-Tracing)”的62/656,951号美国临时申请(案号:17-MU-0287US01)的权益,其全部内容通过引用合并于此。此外,本申请要求2018年4月18日提交的、题为“时间抗锯齿的自适应光线跟踪(ADAPTIVE RAY TRACING FOR TEMPORAL ANTIALIASING)”的62/659,620号美国临时申请(案号:NVIDP1221+/18DU0112US01)的权益,其全部内容通过引用合并于此。

技术领域

[0003] 本发明涉及图像渲染,并且更具体地,涉及在图像渲染期间执行抗锯齿。

背景技术

[0004] 通常在场景渲染期间使用抗锯齿,以去除由采样率不足所导致的图像伪影。然而,目前的用于执行抗锯齿的方法导致了高存储成本,并且在某些情况下可能遭受使用高带宽之苦。此外,使用图形硬件执行对复杂几何图形的抗锯齿延迟渲染的当前技术可能比较复杂,并且针对一场景可能需要若干个渲染通道(rendering pass)。附图说明
[0005] 图1示出了根据一实施例的、用于执行复杂像素标识以提高对计算机生成的图像的抗锯齿的方法的流程图
[0006] 图2示出了根据一实施例的并行处理单元。
[0007] 图3A示出了根据一实施例的、图2的并行处理单元内的通用处理集群。
[0008] 图3B示出了根据一实施例的、图2的并行处理单元的存储器分区单元。
[0009] 图4A示出了根据一实施例的、图3A的流多处理器。
[0010] 图4B示出了根据一实施例的、使用图2中的PPU实现的处理系统的概念图
[0011] 图4C示出了示例性的系统,在其中可以实现前面各个实施例的各种架构和/或功能。
[0012] 图5是根据一实施例的、图2的PPU实现的图形处理管线的概念图。
[0013] 图6示出了根据一个实施例的、用于执行混合延迟光线跟踪抗锯齿的方法的流程图。
[0014] 图7示出了根据一个实施例的、用于执行用于时间抗锯齿的自适应光线跟踪方法的流程图。
[0015] 图8示出了根据一个实施例的、在DXR光线跟踪API的上下文中的示例性自适应时间抗锯齿算法
[0016] 详细描述
[0017] 在计算机图形学中,抗锯齿是一种通过平滑锯齿边缘(如曲线和对线等上)来向数字图像添加真实感的技术。这些锯齿边缘可能是由于图像渲染期间采样率较低而显现的。然而,执行抗锯齿需要花费大量的处理资源和时间。作为响应,数字图像中抗锯齿对其有帮助的特定像素被明确标识,并且然后对这些标识的像素执行抗锯齿。通过减少执行抗锯齿的图像中的像素数量,可以降低执行抗锯齿的成本。
[0018] 图1示出了根据一实施例的、用于执行复杂像素标识以改进对计算机生成图像的抗锯齿的方法100的流程图。虽然方法100是在处理单元的上下文中描述的,但是方法100也可以由程序、定制电路或定制电路和程序的组合来执行。例如,方法100可以由GPU(图形处理单元)、CPU(中央处理单元)或任何能够通过散列执行并行路径空间过滤的处理器执行。进一步地,本领域普通技术人员将理解,执行方法100的任何系统都在本发明实施例的范围和精神之内。
[0019] 如操作102所示,要渲染的场景中的复杂像素被标识。在一个实施例中,每个所述复杂像素可以包括像素,其包含导致锯齿的像素属性(例如覆盖、深度、材料等)的一个或更多个不连续。在另一个实施例中,每个所述复杂像素可以包括场景中的几何图形的一个或更多个实例(例如,一个或更多个多边形等)所部分覆盖的可见像素。
[0020] 此外,在一个实施例中,可以使用保守光栅化来标识复杂像素。例如,保守光栅化可以标识几何图形的一个或更多个实例与场景中像素的任何部分的交点,即使几何图形没有击中像素中心或像素内的任何样本(如果使用多个样本)。在另一个示例中,保守光栅化可以标识几何图形的实例和像素之间的一个或更多个非零交点,并可以对像素进行光栅化。
[0021] 进一步地,在一个实施例中,保守光栅化可以通过场景中的几何图形的一个或更多个实例的多个通道(pass)来实现。例如,保守光栅化的第一通道可以包括深度预通道(pre-pass)。例如,深度预通道可以针对最近的完全覆盖像素创建存储深度的深度缓冲器
[0022] 更进一步地,在一个实施例中,保守光栅化的第二通道可以包括像素标识通道(pixel identification pass)。例如,像素标识通道可以标识和标记复杂像素(例如,场景中被几何图形的一个或更多个实例部分覆盖的可见像素)。在另一个示例中,可以使用所实现的像素着色器来标记像素。在另一个示例中,像素标识通道还可以递增计数器。
[0023] 此外,在一个实施例中,像素标识通道还可以针对每个像素计数接触该像素的几何图形的实例的数目。这可以被存储为像素的原始计数。在另一个实施例中,像素标识通道可以导致包含复杂像素的非零值的二维表面,其中非零值可指示像素中潜在可见的图元的数目。
[0024] 以这种方式,在抗锯齿期间,可以使用保守光栅化来标识出场景中值得采用更高采样率的像素(例如部分覆盖的像素等)。
[0025] 此外,在一个实施例中,保守光栅化可以包括内保守光栅化。例如,内保守光栅化可以分析场景中的几何图形的一个或更多个实例,并可以针对场景中的每个像素,指示几何图形的一个或更多个实例是否覆盖了该像素的至少一部分,以及像素是否被完全覆盖。在另一个示例中,像素的完全覆盖可以由与该像素关联的标志(flag)指示。例如,二进制标志值0可以指示相关像素被部分覆盖,而二进制标志值1可以指示相关像素被完全覆盖。
[0026] 此外,如操作104所示,使用光线跟踪,对场景中的每个复杂像素执行抗锯齿。在一个实施例中,执行抗锯齿可以包括对场景中的复杂像素执行光线跟踪。例如,执行抗锯齿可以包括使用GPU光线跟踪确定每个复杂像素内的子像素区域的点采样可视性。这可以包括经由光线跟踪对复杂像素的区域进行采样,并近似该复杂像素的几何覆盖。
[0027] 例如,基于每个复杂像素的原始计数,光线可以分布在复杂像素上。在另一个例子中,可以通过与具有较小像素计数的复杂像素相比具有较大像素计数的复杂像素跟踪更多的光线。这可以使用光线跟踪框架/引擎来执行。
[0028] 再进一步地,在一个实施例中,执行抗锯齿可以包括针对每个复杂像素,对该复杂像素的几何表面及其覆盖进行分析性求解。例如,执行抗锯齿可以包括存储关于与复杂像素相交的几何图形的附加数据。例如,附加数据可以包括一个或更多个边缘方程。在另一个例子中,执行抗锯齿可以包括使用附加数据来计算边缘/光线交点。这可以由GPU执行,而无需使用光线跟踪框架/引擎。
[0029] 此外,在一个实施例中,执行抗锯齿可以包括分析性地评估可见性。例如,分析的可见性可以指示复杂像素的多少区域被特定的图元占据(例如,通过求解表面积分等)。
[0030] 以这种方式,在抗锯齿期间,可以标识出场景中值得采用更高采样率的像素(如部分覆盖的像素等)。因此,在抗锯齿期间,可以通过将采样聚焦在具有只部分覆盖像素的图元的像素内来降低采样成本。此外,在抗锯齿期间,可以使用光线跟踪来根据每个像素调整发送至每个像素的样本数量。
[0031] 在另一个实施例中,使用并行处理单元(PPU)(如图2中所示的PPU200)对场景中的每个复杂像素执行抗锯齿。
[0032] 现在,将根据用户的需要,阐述关于可用于实现上述框架的各种可选架构和特征的更多说明性信息。应该格外注意的是,下列信息是为了说明目的而阐述的,并且不应被解释为以任何方式进行限制。下列任何特征都可以可选地与所描述的其他特征合并或不排除所描述的其他特征。
[0033] 并行处理架构
[0034] 图2示出了根据一实施例的并行处理单元(PPU)200。在一实施例中,PPU 200是在一个或更多个集成电路装置上实现的多线程处理器。PPU 200是被设计用于并行处理多个线程的延迟隐藏架构。线程(即,执行线程)是被配置为由PPU 200执行的一组指令的实例化。在一实施例中,PPU 200是被配置为实现图形渲染管线的图形处理单元(GPU),用于处理三维(3D)图形数据以便生成二维(2D)图像数据,以用于在诸如液晶显示器(LCD)装置之类的显示装置上显示。在其他实施例中,PPU 200可用于执行通用计算。虽然本文提供了一个示例并行处理器用于说明目的,但是应该强烈指出,这样的处理器仅出于说明目的进行阐述,并且可以使用任何处理器来补充和/或替代相同的处理器。
[0035] 一个或更多个PPU 200可以被配置为加速数千个高性能计算(HPC)、数据中心机器学习应用程序。PPU 200可以配置为加速多个深度学习系统和应用程序,包括自主车辆平台、深度学习、高精度的演讲、图像以及文本识别系统、智能视频分析、分子模拟、药物发现、疾病诊断、天气预报、大数据分析、天文学、分子动学模拟、金融建模、机器人、工厂自动化、实时语言翻译、在线搜索优化、以及个性化的用户推荐等等。
[0036] 如图2所示,PPU 200包括输入/输出(I/O)单元205、前端单元215、调度器单元220、工作分配单元225、集线器230、交叉开关(Xbar)270、一个或更多个通用处理集群(GPC)250和一个或更多个分区单元280。PPU200可以经由一个或更多个高速NVLink 210互连连接到主机处理器或其他PPU 200。PPU 200可以经由互连202连接到主机处理器或其他外围装置。PPU 200还可以连接到包括多个存储器装置204的本地存储器。在一实施例中,本地存储器可以包括若干动态随机存取存储器(DRAM)装置。DRAM装置可以配置为高带宽存储器(HBM)子系统,每个装置中都堆叠有多个DRAM裸晶(die)。
[0037] NVLink 210互连使系统能够扩展并包含与一个或更多个CPU相组合的一个或更多个PPU 200,支持PPU 200与CPU之间的高速缓存一致性,以及CPU主控。数据和/或命令可以由NVLink 210通过集线器230发送到PPU 200的其他单元或自PPU 200的其他单元发送,所述其他单元诸如一个或更多个复制引擎、视频编码器、视频解码器、电源管理单元等(未明确示出)。结合图4B对NVLink 210进行了更详细的描述。
[0038] I/O单元205被配置为通过互连202从主机处理器(未示出)发送和接收通信(即命令、数据等)。I/O单元205可以经由互连202直接与主机处理器通信,或通过一个或更多个中间装置(如内存桥)与主机处理器通信。在一实施例中,I/O单元205可以经由互连202与一个或更多个其他处理器(诸如一个或更多个PPU 200)通信。在一实施例中,I/O单元205实现用于通过PCIe总线通信的外围组件互连高速(PCIe)接口,并且该互连202是PCIe总线。在可选的实施例中,I/O单元205可实现用于与外部装置通信的其他类型的已知接口。
[0039] I/O单元205解码经由互连202接收的分组。在一实施例中,分组表示被配置为使PPU 200执行各种操作的命令。I/O单元205根据命令所指定的将解码后的命令发送到PPU 200的各个其他单元。例如,一些命令可以被发送到前端单元215。其他命令可以被发送到集线器230或PPU 200的其他单元,诸如一个或更多个复制引擎、视频编码器、视频解码器、电源管理单元等(未明确示出)。换句话说,I/O单元205被配置为在PPU 200的各个逻辑单元之间和之中路由通信。
[0040] 在一实施例中,由主机处理器执行的程序在缓冲器中编码命令流,该缓冲器将工作负载提供给PPU 200进行处理。工作负载可以包括若干指令和将由这些指令处理的数据。缓冲器是存储器中可由主机处理器和PPU 200两者访问(即,读/写)的区域。例如,I/O单元
205可以被配置为经由在互连202上传输的存储器请求来访问连接到互连202的系统存储器中的缓冲器。在一实施例中,主机处理器将命令流写入缓冲器,然后将指向命令流起点的指针发送到PPU 200。前端单元215接收指向一个或更多个命令流的指针。前端单元215管理一个或更多个流,从流中读取命令并将命令转发到PPU 200的各个单元。
[0041] 前端单元215耦连到调度器单元220,调度器单元220配置各个GPC 250以处理由一个或更多个流定义的任务。调度器单元220被配置为跟踪与调度器单元220管理的各种任务相关的状态信息。状态可以指示任务被指派给哪个GPC 250、任务是活动的还是不活动的、与任务相关联的优先级等等。调度器单元220管理在一个或更多个GPC 250上的多个任务的执行。
[0042] 调度器单元220耦连到工作分配单元225,工作分配单元225被配置为分派任务用于在GPC 250上执行。工作分配单元225可以跟踪从调度器单元220接收的多个被调度的任务。在一实施例中,工作分配单元225为每个GPC 250管理待定(pending)任务池和活动任务池。待定任务池可以包括若干个时隙(例如,32个时隙),其包含被指派为由特定GPC 250处理的任务。活动任务池可以包括用于由GPC 250正在主动处理的任务的若干时隙(例如,4个时隙)。当GPC 250完成任务的执行时,将从GPC 250的活动任务池中逐出该任务,并且待定任务池中的其他任务之一被选中和调度,以在GPC 250上执行。如果GPC 250上的活动任务已经空闲,诸如在等待数据依赖关系得到解决时,那么该活动任务可以从GPC 250中逐出,并返回到待定任务池,同时待定任务池中的另一任务被选中并调度,以在GPC 250上执行。
[0043] 工作分配单元225经由XBar 270与一个或更多个GPC 250通信。XBar 270是将PPU 200的许多单元耦连到PPU 200的其他单元的互连网络。例如,XBar 270可以被配置为将工作分配单元225耦连到特定的GPC 250。虽然没有明确示出,但PPU 200的一个或更多个其他单元也可以经由集线器230连接到XBar 270。
[0044] 任务由调度器单元220管理,并由工作分配单元225分派到GPC 250。GPC 250被配置为处理任务并生成结果。结果可以由GPC 250中的其他任务使用,经由XBar 270路由到不同的GPC 250,或者存储到存储器204中。结果可以经由分区单元280写入存储器204,分区单元280实现了存储器接口,用于从存储器204读取数据/将数据写入存储器204。结果可以经由NVLink 210发送到另一个PPU 200或CPU。在一实施例中,PPU 200包括数目为U个分区单元280,该数目等于与PPU 200耦连的独立且不同的存储装置204的数目。下面将结合图3B更详细地描述分区单元280。
[0045] 在一实施例中,主机处理器执行实现应用程序编程接口(API)的驱动器内核,其使能在主机处理器上执行的一个或更多个应用程序以调度用于在PPU 200上执行的操作。在一实施例中,多个计算应用程序由PPU 200同时执行,并且PPU 200为多个计算应用程序提供隔离、服务质量(QoS)和独立的地址空间。应用程序可生成指令(即,API调用),其使驱动器内核生成一个或更多个任务,用于由PPU 200执行。驱动器内核将任务输出到由PPU 200处理的一个或更多个流。每个任务可以包括一个或更多个相关线程组,在这里称为线程束(warp)。在一实施例中,线程束包括可并行执行的32个相关线程。协作线程可以指多个线程,包括执行任务的指令和可以通过共享存储器交换数据的指令。结合图4A对线程和协作线程进行了更详细的描述。
[0046] 图3A示出了根据一实施例的图2的PPU 200的GPC 250。如图3A所示,每个GPC 250包括用于处理任务的若干硬件单元。在一实施例中,每个GPC 250包括管线管理器310、预光栅操作单元(PROP)315、光栅引擎325、工作分配交叉开关(WDX)380、存储器管理单元(MMU)390和一个或更多个数据处理集群(DPC)320。可以理解的是,图3A中的GPC 250可以包括其他硬件单元来代替或补充图3A中所示的单元。
[0047] 在一实施例中,GPC 250的操作由管线管理器310控制。管线管理器310管理一个或更多个DPC 320的配置,以用于处理分配给GPC 250的任务。在一实施例中,管线管理器310可以配置一个或更多个DPC 320中的至少一个,以实现图形渲染管线的至少一部分。例如,可以将DPC 320配置为在可编程流多处理器(SM)340上执行顶点着色程序。管线管理器310还可以配置为将从工作分配单元225接收的分组路由到GPC 250中的适当的逻辑单元。例如,一些分组可以路由到PROP 315和/或光栅引擎325中的固定功能硬件单元,而其他分组可以路由到DPC 320,以由图元引擎335或SM 340处理。在一实施例中,管线管理器310可以配置一个或更多个DPC 320中的至少一个,以实现神经网络模型和/或计算管线。
[0048] PROP单元315被配置为将光栅引擎325和DPC 320生成的数据路由到光栅操作(ROP)单元,其结合图3B更详细地描述。PROP单元315还可以配置为执行颜色混合的优化、组织像素数据、执行地址转换等。
[0049] 光栅引擎325包括若干固定功能硬件单元,其被配置为执行各种光栅操作。在一实施例中,光栅引擎325包括设置引擎、粗光栅引擎、剔除引擎、裁剪引擎、精细光栅引擎和图合并引擎。设置引擎接收转换后的顶点,并生成与由顶点定义的几何图元相关联的平面方程。该平面方程被发送到粗光栅引擎,以生成图元的覆盖信息(例如,图块的x、y覆盖掩码)。粗光栅引擎的输出被发送到剔除引擎,在此引擎中与未通过z测试的图元相关联的片段被剔除掉,并被发送到裁剪引擎,在此引擎中位于视锥体外部的片段被裁剪掉。那些经过裁剪和剔除后留下来的片段可以被传递至精细光栅引擎,以基于由设置引擎生成的平面方程生成像素片段的属性。光栅引擎325的输出包括要由例如在DPC 320中实现的片段着色器处理的片段。
[0050] GPC 250中包括的每个DPC 320包括M管道控制器(MPC)330、图元引擎335和一个或更多个SM 340。MPC 330控制DPC 320的操作,将从管线管理器310接收的分组路由到DPC 320中的适当单元。例如,与顶点关联的分组可以被路由到图元引擎335,图元引擎335被配置为从存储器204中取回与顶点相关联的顶点属性。相反,与着色器程序相关联的分组可以被发送到SM 340。
[0051] SM 340包括可编程的流处理器,其被配置为处理由若干线程表示的任务。每个SM 340都是多线程的,并被配置为同时执行来自特定线程组的多个线程(例如,32个线程)。在一实施例中,SM 340实现SIMD(单指令、多数据)架构,其中线程组(即线程束)中的每个线程被配置为基于相同指令集处理不同的数据集。线程组中的所有线程执行相同的指令。在另一实施例中,SM 340实现SIMT(单指令、多线程)架构,其中线程组中的每个线程被配置为基于相同的指令集处理不同的数据集,但是其中线程组中的各个线程在执行期间可以发散。
在一实施例中,针对每个线程束维护程序计数器、调用栈和执行状态,当线程束内的线程发散时,使能线程束和线程束内的串行执行之间的并发性。在另一实施例中,针对每个个体线程维护程序计数器、调用栈和执行状态,使能所有线程之间、线程束内和线程束之间的相等的并发性。当为每个个体线程维护执行状态时,执行相同指令的线程可以收敛且并行执行,以获得最大的效率。下面将结合图4A更详细地描述SM 340。
[0052] MMU 390提供了GPC 250和分区单元280之间的接口。MMU 390可以提供将虚拟地址转换为物理地址、存储器保护和对存储器请求的仲裁。在一实施例中,MMU 390提供一个或更多个转换后备缓冲器(TLB),用于执行将虚拟地址转换为存储器204中的物理地址。
[0053] 图3B示出了根据一实施例的图2的PPU 200的存储器分区单元280。如图3B所示,存储器分区单元280包括光栅操作(ROP)单元350、二级(L2)高速缓存360和存储器接口370。存储器接口370耦连到存储器204。存储器接口370可以实现32位、64位、128位、1024位等用于高速数据传输的数据总线。在一实施例中,PPU 200包含U个存储器接口370,每对分区单元280有一个存储器接口370,其中每对分区单元280连接到相应的存储器装置204。例如,PPU 
200可以连接到最多Y个存储器装置204,诸如高带宽存储器堆叠或图形双数据速率、版本5、同步动态随机存取存储器或其他类型的永久存储。
[0054] 在一实施例中,存储器接口370实现HBM2存储器接口,并且Y等于U的一半。在一实施例中,HBM2存储器堆叠与PPU 200位于相同的物理封装上,与传统的GDDR5SDRAM系统相比,节省了大量的电能和面积。在一实施例中,每个HBM2堆叠包括4个存储器裸晶,并且Y等于4,HBM2堆叠的每个裸晶包括两个128位通道,共8个通道,并且数据总线宽度为1024位。
[0055] 在一实施例中,存储器204支持单错校正双错检测(SECDED)纠错码(ECC)以保护数据。ECC为对数据损坏敏感的计算应用程序提供了更高的可靠性。可靠性在大型集群计算环境中尤其重要,其中,PPU 200处理非常大的数据集和/或长时间运行应用程序。
[0056] 在一实施例中,PPU 200实现了多级存储器层级结构。在一实施例中,存储器分区单元280支持统一存储器,以为CPU和PPU 200存储器提供单个统一的虚拟地址空间,使能虚拟存储器系统之间的数据共享。在一实施例中,跟踪PPU 200对位于其他处理器上的存储器的访问频率,以确保将存储器页移动到正在更频繁地访问这些页面的PPU 200的物理存储器中。在一实施例中,NVLink 210支持地址转换服务,其允许PPU 200直接访问CPU的页表,并提供PPU 200对CPU存储器的完全访问。
[0057] 在一实施例中,复制引擎在多个PPU 200之间或PPU 200与CPU之间传输数据。复制引擎可以为没有映射到页表中的地址生成页面错误。存储器分区单元280可以服务于页面错误,将地址映射到页表中,然后复制引擎可以执行传输。在传统的系统中,用于多个处理器之间的多个复制引擎操作的存储器是固定的(即非可分页的),极大地减少了可用存储器。当存在硬件页面错误时,可以将地址传递至复制引擎,而不必担心存储器页面是否是常驻的,而且复制过程是透明的。
[0058] 来自存储器204或其他系统存储器的数据可以由存储器分区单元280取回并存储在L2高速缓存360中,L2高速缓存360位于芯片上并在不同的GPC 250之间共享。如图所示,每个存储器分区单元280包括L2高速缓存360的一部分,该部分与相应的存储器装置204相关联。较低级别的高速缓存可以在GPC 250内的不同单元中实现。例如,每个SM 340都可以实现一级(L1)高速缓存。L1高速缓存是专用于特定SM 340的专用存储器。来自L2高速缓存360的数据可以被取回并存储在L1高速缓存中的每个高速缓存中,以用于在SM 340的功能单元中进行处理。L2高速缓存360耦连到存储器接口370和XBar 270。
[0059] ROP单元350执行与像素颜色相关的图形光栅操作,诸如颜色压缩、像素混合等。ROP单元350还与光栅引擎325一起实现深度测试,从光栅引擎325的剔除引擎接收与像素片段相关联的样本位置的深度。针对与片段关联的样本位置,测试相对于深度缓冲器中的对应深度的深度。如果片段通过了样本位置的深度测试,那么ROP单元350将更新深度缓冲器,并将深度测试的结果发送到光栅引擎325。可以领会的是,分区单元280的数量可能与GPC 
250的数量不同,并且因此,每个ROP单元350可以与GPC250中的每一个相耦连。ROP单元350跟踪来自不同GPC 250的分组,并确定由ROP单元350生成的结果通过Xbar 270路由到了哪个GPC 250。虽然ROP单元350包括在图3B中的存储器分区单元280中,但在其他实施例中,ROP单元350可以位于存储器分区单元280之外。例如,ROP单元350可以驻于GPC 250或其他单元中。
[0060] 图4A示出了根据一实施例的图3A的流多处理器340。如图4A所示,SM 340包括指令高速缓存405、一个或更多个调度器单元410(K)、寄存器文件420、一个或更多个处理核心450、一个或更多个特殊功能单元(SFU)452、一个或更多个加载/存储单元(LSU)454、互连网络480、共享存储器/L1高速缓存470。
[0061] 如上所述,工作分配单元225将任务分派到PPU 200中的GPC 250上执行。任务被分配给GPC 250内的特定DPC 320,并且,如果任务与着色器程序相关联,则任务可以被分配给SM 340。调度器单元410(K)从工作分配单元225接收任务,并管理指派给SM 340的一个或更多个线程块的指令调度。调度器单元410(K)调度线程块用于作为并行线程的线程束来执行,其中每个线程块被分配至少一个线程束。在一实施例中,每个线程束执行32个线程。调度器单元410(K)可以管理多个不同的线程块,将线程束分配给不同的线程块,然后在每个时钟周期期间将来自多个不同协作组的指令分派给各个功能单元(即,核心450,SFU 452和LSU 454)。
[0062] 协作组是用于组织通信线程组的编程模型,其允许开发人员表示线程通信的粒度,从而使能对并行分解的更丰富、更高效的表达。协作启动API支持线程块之间的同步,以执行并行算法。传统的编程模型为同步协作线程提供了一种单一的、简单的构造:跨线程块的所有线程的屏障(即,syncthreads()函数)。然而,程序员常常想要以比线程块粒度更小的粒度定义线程组,并在定义的组中同步,以集体的全组功能接口的形式来实现更强的性能、设计灵活性和软件重用。
[0063] 协作组允许程序员能够以子块(即与单个线程一样小)和多块粒度明确地定义线程组,并对协作组中的线程执行诸如同步之类的集体操作。编程模型支持跨软件边界的干净组合,这样函数库和实用函数就可以在其本地上下文中安全地同步,而不必对收敛性做任何假设。协作组图元支持新的协作并行模式,包括生产者-消费者并行、机会并行和跨整个线程块网格的全局同步。
[0064] 分派单元415被配置为向一个或更多个功能单元发送指令。在该实施例中,调度器单元410(K)包括两个分派单元415,其使来自同一线程束的两个不同指令能够在每个时钟周期期间被分派。在可选实施例中,每个调度器单元410(K)可包括单个分派单元415或附加的分派单元415。
[0065] 每个SM 340包括寄存器文件420,其为SM 340的功能单元提供一组寄存器。在一实施例中,寄存器文件420在每个功能单元之间划分,使得每个功能单元被分配寄存器文件420的专用部分。在另一个实施例中,寄存器文件420在由SM 340执行的不同线程束之间被划分。寄存器文件420为连接到功能单元的数据路径的操作数提供临时存储。
[0066] 每个SM 340包括L个处理核心450。在一实施例中,SM 340包括大量(如128个等)不同的处理核心450。每个核心450可以包括完全管线化的、单精度、双精度和/或混合精度处理单元,其包括浮点算术逻辑单元和整数算术逻辑单元。在一实施例中,浮点算术逻辑单元实现用于浮点算术的IEEE 754-2008标准。在一实施例中,核心450包括64个单精度(32位)浮点核心、64个整数核心、32个双精度(64位)浮点核心和8个张量核。
[0067] 张量核被配置为执行矩阵运算,并且在一实施例中,一个或更多个张量核包括在核心450中。具体地,张量核被配置成执行深度学习矩阵算术,诸如用于神经网络训练和推理的卷积运算。在一实施例中,每个张量核运算于4x4矩阵上,并执行矩阵乘法和累加运算D=A×B+C,其中A、B、C和D为4x4矩阵。
[0068] 在一实施例中,矩阵乘法输入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个线程。
[0069] 每个SM 340还包括执行特殊函数(例如,属性评估、平方根倒数等)的M个SFU 452。在一实施例中,SFU 452可以包括被配置为遍历分层树数据结构的树遍历单元。在一实施例中,SFU 452可以包括被配置为执行纹理映射过滤操作的纹理单元。在一实施例中,纹理单元被配置为从存储器204加载纹理映射(例如,纹理像素的二维阵列),并对纹理映射进行采样,以产生经采样的纹理值,用于在SM 340执行的着色器程序中使用。在一实施例中,纹理映射存储在共享存储器/L1高速缓存370中。纹理单元实现纹理操作,诸如使用mip-map(即,不同细节平的纹理映射)的过滤操作。在一实施例中,每个SM 340包括两个纹理单元。
[0070] 每个SM 340还包括N个LSU 454,其实现共享存储器/L1高速缓存470和寄存器文件420之间的加载和存储操作。每个SM 340包括互连网络480,其将每个功能单元连接到寄存器文件420,并将LSU 454连接到寄存器文件420、共享存储器/L1高速缓存470。在一实施例中,互连网络480是交叉开关,其可被配置为将任何功能单元连接到寄存器文件420中的任何寄存器,并将LSU 454连接到寄存器文件和共享存储器/L1高速缓存470中的存储器位置。
[0071] 共享存储器/L1高速缓存470是片上存储器的阵列,其允许数据存储以及SM 340与图元引擎335之间和SM 340中的线程之间的通信。在一实施例中,共享存储器/L1高速缓存470包括128KB的存储容量,并且位于从SM 340到分区单元280的路径中。共享存储器/L1高速缓存470可用于高速缓存读和写。共享存储器/L1高速缓存470、L2高速缓存360和存储器
204中的一个或更多个是后备存储。
[0072] 将数据高速缓存和共享存储器功能组合到单个存储器块中,可以为这两种类型的存储器访问提供最佳的总体性能。该容量可由不使用共享存储器的程序用作高速缓存。例如,如果将共享存储器配置为使用一半的容量,则纹理和加载/存储操作可以使用剩余的容量。在共享存储器/L1高速缓存470内的集成使共享存储器/L1高速缓存470能够起到高吞吐量管道的作用,其用于流化数据同时为频繁重用的数据提供高带宽和低延迟访问。
[0073] 当配置用于通用并行计算时,可以使用比图形处理更简单的配置。具体来说,图2中所示的固定功能图形处理单元被绕过,从而创建了简单得多的编程模型。在通用并行计算配置中,工作分配单元225将线程块直接指派和分发给DPC 320。块中的线程执行相同的程序,在计算中使用唯一的线程ID以确保每个线程生成唯一的结果,使用SM 340执行程序和执行计算,使用共享存储器/L1高速缓存470以在线程之间通信,以及使用LSU454以通过共享存储器/L1高速缓存470和存储器分区单元280读写全局存储器。当被配置用于通用并行计算时,SM 340还可以写入调度器单元220可用于在DPC 320上启动新工作的命令。
[0074] PPU 200可以包括在台式电脑、笔记本电脑平板电脑服务器、超级计算机、智能手机(例如无线手持装置)、个人数字助理(PDA)、数码相机、车辆、头戴显示器、手持电子装置等之中。在一实施例中,PPU 200体现为单个半导体衬底。在另一个实施例中,PPU 200与一个或更多个其他装置(诸如附加的PPU 200、存储器204、精简指令集计算机(RISC)CPU、存储器管理单元(MMU)、数模转换器(DAC)等)一起包括在片上系统(SoC)中。
[0075] 在一实施例中,PPU 200可以包括在包括一个或更多个存储器装置204的图形卡上。图形卡可配置为与台式计算机主板上的PCIe插槽接口。在另一个实施例中,PPU 200可以是包含在主板芯片组中的集成图形处理单元(iGPU)或并行处理器。
[0076] 示例性计算系统
[0077] 随着开发人员在诸如人工智能计算之类的应用中公开和使用更多的并行性,具有多个GPU和CPU的系统被用于各种行业。具有数十到数千个计算节点的高性能GPU加速系统被部署在数据中心、研究机构和超级计算机中,以解决更大的问题。随着高性能系统中处理装置数量的增加,通信和数据传输机制需要扩展以支持增加的带宽。
[0078] 图4B是根据一实施例的、使用图2中的PPU 200实现的处理系统400的概念图。示例性的系统465可以配置为实现图1中所示的方法100。处理系统400包括CPU 430、交换机410和多个PPU 200,每个PPU 200具有各自的存储器204。NVLink 210在每个PPU 200之间提供高速通信链路。尽管图4B中示出了特定数量的NVLink 210和互连202连接,但是到每个PPU 200和CPU 430的连接的数量可以不同。交换机410在互连202和CPU 430之间接口。PPU 200、存储器204和NVLink 210位于单个半导体平台上,以形成并行处理模块425。在一实施例中,交换机410支持两个或更多个协议,以用于在各种不同的连接和/或链接之间接口。
[0079] 在另一个实施例(未示出)中,NVLink 210在每个PPU 200和CPU 430之间提供一个或更多个高速通信链路,交换机410在互连202和每个PPU200之间接口。PPU 200、存储器204和互连202可以位于单个半导体平台上,以形成并行处理模块425。在另一个实施例(未示出)中,互连202在每个PPU 200和CPU 430之间提供一个或更多个通信链路,交换机410使用NVLink 210在每个PPU 200之间接口,以在PPU 200之间提供一个或更多个高速通信链路。在另一个实施例(未示出)中,NVLink 210通过交换机410在PPU 200和CPU 430之间提供一个或更多个高速通信链路。在另一个实施例(未示出)中,互连202在每个PPU 200之间直接提供一个或更多个通信链路。一个或更多个NVLink 210高速通信链路可以实现为物理NVLink互连,也可以使用与NVLink 210相同的协议实现片上(on-chip)或裸晶上(on-die)互连。
[0080] 在本说明书的上下文中,单个半导体平台可以指在裸晶或芯片上制造的单独的基于单一半导体的集成电路。需要注意的是,术语“单个半导体平台”也可以指具有增加的连接性的多芯片模块,该模块模拟芯片上的操作,并且对使用常规总线实现有很大的改进。当然,根据用户的需要,各种电路或器件也可以单独安装或以各种半导体平台的组合形式安装。可选地,并行处理模块425可以实现为电路板基板,而每个PPU 200和/或存储器204可以是封装的器件。在一实施例中,CPU 430、交换机410和并行处理模块425位于单个半导体平台上。
[0081] 在一实施例中,每个NVLink 210的信令速率为20到25Gb/秒,并且每个PPU 200包含六个NVLink 210接口(如图4B所示,每个PPU 200包含五个NVLink 210接口)。每个NVLink 210在每个方向上提供25Gb/秒的数据传输速率,其中6个链路提供300Gb/秒的数据传输速率。当CPU 430还包含一个或更多个NVLink 210接口时,NVLink 210可以专门用于如图4B所示的PPU到PPU通信,或者是PPU到PPU和PPU到CPU的某种组合。
[0082] 在一实施例中,NVLink 210允许从CPU 430到每个PPU 200的存储器204的直接加载/存储/原子访问。在一实施例中,NVLink 210支持一致性操作,允许从存储器204读取的数据存储在CPU 430的高速缓存层级中,从而降低CPU 430的高速缓存访问延迟。在一实施例中,NVLink 210包括对地址转换服务(ATS)的支持,允许PPU 200直接访问CPU 430中的页表。NVLink 210中的一个或更多个也可以配置为在低功耗模式下操作。
[0083] 图4C示出了示例性的系统465,其中可以实现前面各种实施例的各种架构和/或功能。示例性的系统465可以配置为实现图1中所示的方法100。
[0084] 如图所示,系统465包括连接到通信总线475的至少一个中央处理单元430。可以使用任何合适的协议实现通信总线475,诸如PCI(外围组件互连)、PCI-Express、AGP(加速图形端口)、超传输或任何其他总线或一个或更多个点对点通信协议。系统465还包括主存储器440。控制逻辑(软件)和数据存储在主存储器440中,其可以采用随机存取存储器(RAM)的形式。
[0085] 系统465还包括输入装置460、并行处理系统425和显示装置445,即传统的CRT(阴极射线管)、LCD(液晶显示器)、LED(发光二极管)、等离子显示器等。可以从输入装置460接收用户输入,例如键盘鼠标触摸板、麦克等。每一个上述模块和/或装置甚至可以位于单个半导体平台上以形成系统465。此外,根据用户的需要,各模块还可以单独设置或以半导体平台的各种组合的形式设置。
[0086] 进一步地,系统465可出于通信目的通过网络接口435耦连到网络(例如电信网络、局域网(LAN)、无线网络、广域网(WAN),诸如因特网、对等网络、线缆网络等)。
[0087] 系统465还可以包括辅助存储(未示出)。辅助存储包括,例如,硬盘驱动器和/或可移除存储驱动器,其表示软盘驱动器、磁带驱动器、光盘驱动器、数字多功能磁盘(DVD)驱动器、记录装置、通用串行总线(USB)闪存。可移除存储驱动器以众所周知的方式从可移除存储单元读取和/或写入可移除存储单元。
[0088] 计算机程序或计算机控制逻辑算法可以存储在主存储器440和/或辅助存储中。这种计算机程序在执行时使系统465能够执行各种功能。存储器440、存储和/或任何其他存储都是计算机可读介质的可能例子。
[0089] 前面各种图形的架构和/或功能可以在通用计算机系统、电路板系统、娱乐专用游戏机系统、特定于应用程序的系统和/或任何其他所需系统的上下文中实现。例如,系统465可以采取台式电脑、笔记本电脑、平板电脑、服务器、超级计算机、智能手机(例如,无线手持装置)、个人数字助理(PDA)、数码相机、车辆、头戴式显示器、手持电子装置、移动电话装置、电视、工作站、游戏机、嵌入式系统和/或任何其他类型的逻辑的形式。
[0090] 虽然上面已经描述了各种实施例,但是应该理解,它们只是作为示例而不是限制来提供的。因此,优选实施例的广度和范围不应受上述示例性实施例中的任何一个的限制,而应仅根据权利要求及其等同物来定义。
[0091] 图形处理管线
[0092] 在一实施例中,PPU 200包括图形处理单元(GPU)。PPU 200被配置为接收指定用于处理图形数据的着色器程序的命令。图形数据可以定义为一组图元,诸如点、线、三角形、四边形、三角形条等。通常,图元包括为该图元指定若干顶点的数据(例如,在模型空间坐标系中),以及与图元的每个顶点相关联的属性。PPU 200可以配置为处理图形图元来生成缓冲器(即,用于显示的每个像素的像素数据)。
[0093] 应用程序将用于场景的模型数据(即顶点和属性的集合)写入存储器,诸如系统存储器或存储器204。模型数据定义了显示器上可能可见的每个对象。然后,应用程序对驱动器内核进行API调用,该API调用请求渲染和显示模型数据。驱动器内核读取模型数据并向一个或更多个流写入命令,以执行处理模型数据的操作。这些命令可以引用不同的着色器程序,以在PPU 200的SM 340上实现,包括顶点着色器外壳着色器、域着色器、几何着色器和像素着色器中的一个或更多个。例如,可以将SM 340中的一个或更多个配置为执行顶点着色器程序,该顶点着色器程序处理由模型数据定义的多个顶点。在一实施例中,不同的SM 340可以配置为并发地执行不同的着色器程序。例如,SM 340的第一子集可以配置为执行顶点着色器程序,而SM 340的第二子集可以配置为执行像素着色器程序。SM 340的第一子集处理顶点数据以生成经处理的顶点数据,并将经处理的顶点数据写入L2高速缓存360和/或存储器204。在经处理的顶点数据被光栅化(即从三维数据转换为屏幕空间中的二维数据)以产生片段数据之后,SM 340的第二子集执行像素着色器以生成经处理的片段数据,然后将其与其他经处理的片段数据混合,并写入存储器204中的帧缓冲器。顶点着色器程序和像素着色器程序可以并发地执行,以管线化方式处理来自同一场景的不同数据,直到场景的所有模型数据都被渲染到帧缓冲器为止。然后,将帧缓冲器的内容发送到显示器控制器,以便在显示装置上显示。
[0094] 图5是根据一实施例的、图2的PPU 200所实现的图形处理管线500的概念图。图形处理管线500是被实现为从三维几何数据生成二维计算机生成图像的处理步骤的抽象流程图。众所周知,管线架构可以通过将操作划分为多个阶段来更有效地执行长延迟操作,其中每个阶段的输出与下一个连续阶段的输入耦连。因此,图形处理管线500接收从图形处理管线500的一个阶段发送到下一个阶段的输入数据501,以生成输出数据502。在一实施例中,图形处理管线500可以表示由 API定义的图形处理管线。作为一选项,图形处理管线500可以在前面的图和/或一个或更多个任何后续图的功能和架构的上下文中实现。
[0095] 如图5所示,图形处理管线500包括管线架构,其包含多个阶段。该阶段包括但不限于数据装配阶段510、顶点着色阶段520、图元装配阶段530、几何着色阶段540、视口缩放、剔除和裁剪(VSCC)阶段550、光栅化阶段560、片段着色阶段570和光栅操作阶段580。在一实施例中,输入数据501包括配置处理单元以实现图形处理管线500的各阶段以及各阶段要处理的几何图元(如点、线、三角形、四边形、三角形条或扇形等)的命令。输出数据502可包括像素数据(即,颜色数据),它被复制到存储器中的帧缓冲器或其他类型的表面数据结构中。
[0096] 数据装配阶段510接收输入数据501,该输入数据501指定用于高阶曲面、图元等的顶点数据。数据装配阶段510收集临时存储或队列中的顶点数据,例如通过接收来自主机处理器的命令,其包括指向存储器中的缓冲器的指针,并从缓冲器中读取顶点数据。然后将顶点数据发送到顶点着色阶段520进行处理。
[0097] 顶点着色阶段520通过对每个顶点每次执行一组操作(即,顶点着色器或程序)来处理顶点数据。顶点可以,例如,被指定为与一个或更多个顶点属性(例如颜色、纹理坐标、表面法线等)相关联的4坐标向量(即)。顶点着色阶段520可以操纵各个顶点属性,诸如位置、颜色、纹理坐标等。换句话说,顶点着色阶段520对顶点坐标或与顶点相关联的其他顶点属性执行操作。这些操作通常包括照明操作(即,修改顶点的颜色属性)和转换操作(即,修改顶点的坐标空间)。例如,顶点可以使用对象坐标空间中的坐标指定,其通过将坐标乘以一个矩阵来转换,该矩阵将对象坐标空间中的坐标转换为世界空间或归一化的装置坐标(NCD)空间。顶点着色阶段520生成转换后的顶点数据,这些数据被发送到图元装配阶段530。
[0098] 图元装配阶段530收集由顶点着色阶段520输出的顶点,并将顶点分组为几何图元,以便由几何着色阶段540进行处理。例如,图元装配阶段530可以配置为将每三个连续的顶点分组成一个几何图元(即三角形),用于发送到几何着色阶段540。在一些实施例中,特定的顶点可以针对连续的几何图元重用(例如,三角形带中的两个连续三角形可以共享两个顶点)。图元装配阶段530发送几何图元(即,关联顶点的集合)到几何着色阶段540。
[0099] 几何着色阶段540通过对几何图元执行一组操作(即,几何着色器或程序)来处理几何图元。曲面细分操作可以从每个几何图元生成一个或更多个几何图元。换句话说,几何着色阶段540可以将每个几何图元细分为两个或更多几何图元的更精细网格,以便由图形处理管线500的其余部分进行处理。几何着色阶段540将几何图元发送到视口SCC阶段550。
[0100] 在一实施例中,图形处理管线500可在流多处理器内运行,并且顶点着色阶段520、图元装配阶段530、几何着色阶段540、片段着色阶段570以及与之相关联的硬件/软件可顺序执行处理操作。一旦顺序处理操作完成,在一实施例中,视口SCC阶段550可以使用数据。在一实施例中,由图形处理管线500中的一个或更多个阶段处理的图元数据可以被写入高速缓存(例如L1高速缓存、顶点高速缓存等)。在这种情况下,在一实施例中,视口SCC阶段
550可以访问高速缓存中的数据。在一实施例中,视口SCC阶段550和光栅化阶段560实现为固定功能电路。
[0101] 视口SCC阶段550执行几何图元的视口缩放、剔除和裁剪。每个被渲染的表面都与一抽象的摄像机位置相关联。摄像机位置表示观看者观看场景的位置,并定义一个包围场景对象的视锥体。所述视锥体可包括一个视平面、一个后平面和四个裁剪平面。任何完全在视锥体之外的几何图元都可以被剔除(即丢弃),因为该几何图元不会对最终渲染的场景做出贡献。任何部分位于视锥体内部和部分位于视锥体外部的几何图元都可以被裁剪掉(即,转换为一个新的几何图元,该几何图元被包围在视锥体内)。此外,每个几何图元可以根据视锥体的深度进行缩放。然后,将所有可能可见的几何图元发送到光栅化阶段560。
[0102] 光栅化阶段560将三维几何图元转换为二维片段(例如,能够用于显示等)。光栅化阶段560可以配置为使用几何图元的顶点来设置一组平面方程,由其可以对各种属性进行插值。光栅化阶段560还可以为多个像素计算覆盖掩码,其指示像素的一个或更多个样本位置是否拦截几何图元。在一实施例中,还可以执行z测试,以确定几何图元是否被已光栅化的其他几何图元遮挡。光栅化阶段560生成片段数据(即,与每个覆盖像素的特定样本位置相关联的插值顶点属性),其被发送到片段着色阶段570。
[0103] 片段着色阶段570通过对每个片段执行一组操作(即,片段着色器或程序)来处理片段数据。片段着色阶段570可生成用于片段的像素数据(即,颜色值),例如通过执行照明操作或使用片段的经插值的纹理坐标采样纹理映射。片段着色阶段570生成像素数据,这些像素数据被发送到光栅操作阶段580。
[0104] 光栅操作阶段580可以对像素数据执行各种操作,诸如执行阿尔法测试、模板测试以及将像素数据与其他像素数据混合,该其他像素数据对应于与该像素相关联的其他片段。当光栅操作阶段580完成对像素数据(即,输出数据502)的处理后,像素数据可以被写入渲染目标,诸如帧缓冲器、颜色缓冲器等。
[0105] 可以理解的是,图形处理管线500还可包括一个或更多个额外阶段,以代替或补充上述的一个或更多个阶段。抽象图形处理管线的各种实现可以实现不同的阶段。此外,在一些实施例中,上述一个或更多个阶段(例如几何着色阶段540)可以被排除在图形处理管线之外。其他类型的图形处理管线被认为在本公开的范围内。进一步地,图形处理管线500的任何阶段都可以由图形处理器(诸如PPU 200)中的一个或更多个专用硬件单元实现。图形处理管线500的其他阶段可以由可编程硬件单元实现,诸如PPU200的SM 340。
[0106] 图形处理管线500可以经由主机处理器(诸如CPU)执行的应用程序来实现。在一实施例中,装置驱动器可以实现应用程序编程接口(API),其定义应用程序可以使用的各种函数,以便生成图形数据以供显示。该装置驱动器是包括控制PPU 200操作的多个指令的软件程序。API为程序员提供了抽象,其允许程序员使用专用的图形硬件(诸如PPU 200)来生成图形数据,而不需要程序员使用PPU 200的特定指令集。应用程序可以包括API调用,其被路由到PPU 200的装置驱动器。装置驱动器解释API调用并执行各种操作来响应API调用。在一些实例中,装置驱动器可以通过在CPU上执行指令来执行操作。在其他情况下,装置驱动器可以至少部分通过使用CPU和PPU 200之间的输入/输出接口在PPU 200上启动操作来执行操作。在一实施例中,装置驱动器被配置为使用PPU 200的硬件来实现图形处理管线500。
[0107] 为了实现图形处理管线500的各个阶段,可以在PPU 200中执行各种程序。例如,装置驱动器可以在PPU 200上启动内核,以对一个SM 340(或多个SM 340)执行顶点着色阶段520。装置驱动器(或由PPU 300执行的初始内核)也可以在PPU 300上启动其他内核,以执行图形处理管线500的其他阶段,诸如几何着色阶段540和片段着色阶段570。此外,图形处理管线500的一些阶段可以在固定的单元硬件上实现,例如在PPU 300中实现的光栅化器或数据汇编器上。可以理解的是,在由SM 340上的后续内核处理之前,一个内核的结果可以由一个或更多个中间固定功能硬件单元处理。
[0108] 机器学习
[0109] 在处理器(诸如PPU 200)上开发的深度神经网络(DNN)已被用于各种不同的用例,从自动驾驶汽车到更快的药物开发,从在线图像数据库中的自动图像字幕到视频聊天应用程序中的智能实时语言翻译。深度学习是一种建模人类大脑神经学习过程的技术,其不断学习,不断地变得更聪明,并随着时间的推移更快地提供更准确的结果。儿童最初是由成人教他们正确地标识和分类各种形状,最终能够在没有任何指导的情况下标识形状。同样,深度学习或神经学习系统也需要在对象识别和分类方面进行训练,使其在标识基本对象、被遮挡对象等方面变得更加智能和高效,同时也为对象指派上下文。
[0110] 在最简单的层面上,人类大脑中的神经元看到接收到的各种输入,并为这些输入中的每个输入指派重要性级别,然后将输出传递给其他神经元进行动作。人工神经元感知器是神经网络最基本的模型。在一个例子中,感知器可以接收表示对象的各种特征的一个或更多个输入,感知器被训练以识别和分类这些特征,并根据这些特征在定义对象形状时的重要性为每个特征指派某一权重。
[0111] 深度神经网络(DNN)模型包含多个层的许多相连接的感知器(例如,节点),其可以用大量的输入数据进行训练,以快速、高精度地解决复杂问题。在一个例子中,DLL模型的第一层将汽车的输入图像分解成不同的部分,并寻找基本的图案,如线和角。第二层将线条装配起来,以寻找更高级别的图案,如车轮挡风玻璃和镜子。下一层标识车辆的类型,最后几层生成输入图像的标签,用于标识特定汽车品牌的模型。
[0112] 一旦训练了DNN,就可以部署DNN,并在称为推理的过程中使用它来标识和分类对象或图案。推理的例子(DNN通过其从给定输入中提取有用信息的过程)包括识别存入ATM机的支票上的手写号码,识别照片中的朋友的图像,向5000多万用户递送电影推荐,识别并分类不同类型的汽车、行人和无人驾驶汽车中的道路危险,或实时翻译人类语言。
[0113] 在训练过程中,数据在前向传播阶段流经DNN,直到产生指示与输入对应的标签的预测为止。如果神经网络不能正确地标记输入,则分析正确的标签和预测的标签之间的误差,并在反向传播阶段期间调整每个特征的权重,直到DNN正确地标记训练数据集中的输入和其他输入为止。训练复杂的神经网络需要大量的并行计算性能,包括PPU 200支持的浮点乘法和加法。推理比训练的计算强度小,是一种对延迟敏感的过程,经训练的神经网络被应用于它以前从未见过的新输入,以分类图像,翻译讲话,并且一般地推断新信息。
[0114] 神经网络严重依赖于矩阵数学运算,并且复杂的多层网络在效率和速度上都需要大量的浮点性能和带宽。采用针对矩阵数学运算进行优化的数千个处理核心,并递送数十到数百个TFLOPS性能,PPU 200是一个能够提供基于深度神经网络的人工智能和机器学习应用程序所需性能的计算平台。
[0115] 混合延迟光线跟踪的抗锯齿
[0116] 在一个实施例中,作为对于场景的抗锯齿延迟渲染的一部分,可以对所识别的复杂像素执行抗锯齿。这可以通过针对场景实现混合延迟光线跟踪抗锯齿来执行。
[0117] 图6示出了根据一实施例的、用于执行混合延迟光线跟踪的抗锯齿的方法600的流程图。虽然方法600是在处理单元的上下文中描述的,但是方法600也可以由程序、定制电路或定制电路和程序的组合来执行。例如,方法600可以由GPU(图形处理单元)、CPU(中央处理单元)或任何能够通过散列执行并行路径空间过滤的处理器来执行。此外,本领域技术人员将理解,执行方法600的任何系统都在本发明实施例的范围和精神之内。
[0118] 如操作602所示,针对场景渲染非抗锯齿的G-缓冲器。例如,G-缓冲器可以包含存储关于每个像素下的场景几何图形的缓冲器。在另一个例子中,可以使用目标独立光栅化(TIR)来渲染多样本抗锯齿(MSAA)深度缓冲器。在又一个例子中,可以使用TIR渲染MSAA法线。
[0119] 进一步地,如操作604所示,识别场景中的复杂像素。例如,复杂像素可以包括场景中的一个或更多个不连续性(如深度、亮度等)周围的像素。在另一个例子中,标识场景中的复杂像素可以使用经渲染的MSAA深度和/或MSAA法线。
[0120] 又进一步地,如操作606所示,光线通过复杂像素进行跟踪,以生成用于G-缓冲器的样本。例如,可以为复杂像素的预定数量的G-缓冲器数据分配存储。在另一个例子中,可以通过每个复杂像素跟踪预定数量的光线。在另一个例子中,可以为最近的命中记录G-缓冲器数据。在另一个例子中,可以在接收到结果后迭代地跟踪其他光线。在另一个例子中,在延迟照明期间,可以为复杂像素计算光线命中。
[0121] 在另一个实施例中,可以使用并行处理单元(PPU)跟踪光线,如图2中所示的PPU 200。
[0122] 以这种方式,延迟光线跟踪抗锯齿可以使用通过场景的单一的光栅化通道执行。此外,抗锯齿可以通过结合单通道延迟GPU光栅化和GPU光线跟踪来实现。
[0123] 用于时间抗锯齿的自适应光线跟踪
[0124] 时间抗锯齿(TAA)算法在当今的视频游戏中得到了广泛的应用。然而,当前的TAA实现受限于,当在TAA期间标识出某个特定像素偏离了正确的值时,没有有效的方法来精确地对该像素进行着色(只有根据采样问题的根本原因的经常崩溃的启发式方法)。
[0125] 图7示出了根据一实施例的用于执行用于时间抗锯齿的自适应光线跟踪的方法700的流程图。虽然方法700是在处理单元的上下文中描述的,但是方法700也可以由程序、定制电路或定制电路和程序的组合来执行。例如,方法700可以由GPU(图形处理单元)、CPU(中央处理单元)或能够通过散列执行并行路径空间过滤的任何处理器执行。此外,本领域技术人员将理解,执行方法700的任何系统都在本发明实施例的范围和精神之内。
[0126] 如图702所示,时间抗锯齿(TAA)被应用于图像。在一个实施例中,图像可以是一系列光栅化图像中的一个。在另一个实施例中,可以使用一种或更多种渲染技术创建图像。例如,可以使用前向或延迟光栅化、光线跟踪、基于点的渲染、基于图像的渲染等方法创建图像。
[0127] 此外,在一个实施例中,可以将TAA应用于图像,以消除光栅化的图像内的锯齿效果(例如几何锯齿、时间锯齿、镜面锯齿等)。例如,TAA可以尝试纠正光栅化图像中主要可见表面的锯齿。在另一个实施例中,将TAA应用于光栅化图像的结果可以包括用于光栅化图像内的像素的颜色缓冲器。
[0128] 进一步地,如操作704所示,标识将TAA应用于图像所导致的失败像素。在一个实施例中,所述失败像素可以包括TAA失败的图像中的像素。在另一个实施例中,可以在TAA期间标识失败像素。例如,TAA可以将前一帧中像素的历史值与当前帧中相邻像素的当前值进行比较。在另一个示例中,具有与相邻像素的当前值相差超过预定量的历史值的像素可以被标识为失败像素。以这种方法,可以将像素标识为复杂的,并可以将其标记为失败像素。
[0129] 又进一步地,在一个实施例中,可以通过比较像素的深度值和相邻像素的深度值来标识失败像素。例如,响应于确定该像素的深度值与相邻像素的深度值相差超过预定量,可以将该像素标识为失败像素。以这种方式,可以将像素标识为与深度边缘相关联,并可以将其标记为失败像素。
[0130] 此外,在一个实施例中,可以通过比较像素的亮度值与相邻像素的亮度值来标识失败像素。例如,响应于确定该像素的亮度值与相邻像素的亮度值相差超过预定量,可以将该像素标识为失败像素。在另一个实施例中,失败像素可以被标记(例如,使用哨兵值(sentinel value)等)。在另一个实施例中,失败像素可以包括在分割掩码(segmentation mask)中。
[0131] 此外,如操作706所示,使用光线跟踪(例如GPU优化光线跟踪)和快速近似抗锯齿(FXAA)的结合,对每个失败像素执行抗锯齿。在一个实施例中,光线跟踪可以执行超采样。在另一个实施例中,执行抗锯齿可以包括通过每个失败像素跟踪多个光线。例如,执行抗锯齿可以包括使用GPU光线跟踪来确定每个失败像素内的子像素区域的点采样可视性。
[0132] 进一步地,在一个实施例中,针对每个失败像素执行抗锯齿可包括对几何曲面及其失败像素的覆盖进行分析性求解。在另一个实施例中,执行抗锯齿可以包括分析性地评估可见性。在另一个实施例中,针对每个失败像素执行抗锯齿可以导致光线跟踪抗锯齿纹理。
[0133] 又进一步地,对失败像素执行抗锯齿的结果(例如,第一组抗锯齿像素的纹理)可以与将TAA应用于图像的结果(例如,用于第二组抗锯齿像素的颜色缓冲器)相结合来创建输出图像。例如,对失败像素执行抗锯齿的抗锯齿纹理结果可以与将TAA应用于图像而产生的颜色缓冲器相混合。
[0134] 以这种方式,使用TAA抗锯齿失败的图像中的像素可以使用GPU光线跟踪来抗锯齿,并且结果可以相结合。这可能完全解决了TAA的问题(如模糊、重影等),同时分摊了光栅化图像中光线跟踪的成本。
[0135] 此外,在一个实施例中,可以标识出与原始图像中的去遮挡相关联的一个或更多个像素。例如,所标识的像素可以包括不存在时间信息的像素(例如,由于遮挡当前帧中的数据不可用,和/或像素的时间数据在之前的图像中不可用)。在一个实施例中,可以通过标识与像素相关联的一个或更多个运动矢量失败来标识这些像素。在另一个实施例中,可以使用快速近似抗锯齿(FXAA)对这些像素执行抗锯齿。例如,FXAA可以基于像素被标记为边缘的程度对这些像素的颜色图像值进行过滤。
[0136] 此外,在一个实施例中,与去遮挡相关联的像素可以包括在分割掩码中。在另一个实施例中,包括这些像素的分割掩码可以与包括失败像素的分割掩码相分离。在另一个实施例中,对失败像素执行抗锯齿的结果(例如,第一组经抗锯齿的像素)可以与将TAA应用到原始图像的结果(例如,第二组经抗锯齿的像素)以及对与去遮挡相关联的像素执行抗锯齿的结果(例如,第三组经抗锯齿的像素)相结合,以创建输出图像。
[0137] 在一个实施例中,可以使用渲染器来生成光栅化图像。此外,抗锯齿可以应用于使用TAA的光栅化图像。进一步地,使用TAA抗锯齿失败的像素可以被标识和标记,并可以丢弃针对这些像素的TAA结果。此外,抗锯齿可以应用于被标记的像素,使用超采样GPU光线跟踪,来创建光线跟踪的抗锯齿纹理结果。此外,光线跟踪的抗锯齿纹理结果可以与使用TAA创建的颜色缓冲器相混合。
[0138] 在另一个实施例中,可以使用并行处理单元(PPU)来执行抗锯齿,如图2中所示的PPU 200。
[0139] 以这种方式,可以标识出TAA失败的像素,并使用光线跟踪和FXAA的组合对这些像素执行AA,以改进AA的结果。此外,光线跟踪的成本可以通过选择性地将其应用于TAA的失败结果来分摊。进一步地,使用FXAA,可以对不存在时间信息的像素执行更廉价、更有效的AA。又进一步地,还可以在单个图像中使用TAA、光线跟踪和FXAA以选择性的和智能的方式执行AA。
[0140] 针对GPU光线跟踪的自适应时间和混合延迟抗锯齿
[0141] 抗锯齿是一种用于去除因采样率不足而导致的图像伪影的一类技术。多采样抗锯齿(MSAA)是一种流行的抗锯齿技术,其以与每图元每像素每次的典型着色率不同的速率采样可见性。虽然在几何抗锯齿方面有一定的效果,但由于以采样率存储深度和颜色样本,MSAA的存储成本较高。此外,在颜色压缩未能很好地压缩颜色数据的情况下,它可能会遭受更高的带宽使用。因此,应用MSAA产生的高图像质量带来了相对高的成本。
[0142] MSAA的图像质量是期望的,无需支付高昂的相关成本。当图元完全覆盖像素时,就不需要进行进一步的可见性计算。当像素被一个或更多个图元部分覆盖时,需要确定每个交叉图元覆盖了多少像素,以计算出正确的可见性。使用这一知识,本发明的实施例包括一种标识“复杂”像素(受益于比单个光栅样本更精确地计算可见性的像素和/或包含导致锯齿的深度或其他不连续性的像素)的方法。本发明的其他实施例提供了以提高的精度计算所标识像素的可见性的方法。
[0143] 使用保守光栅化的像素分类
[0144] 通过分析深度和/或图元ID缓冲器,可以标识本文描述的复杂像素;然而,这种方法可能会遗漏细小的几何特征。常见的问题是标准光栅化没有充分采样距离上的线缆或栅栏(fence)。本发明的实施例通过使用保守光栅化,能够避免在像素分类过程中使用多个子像素样本。
[0145] GPU硬件对保守光栅化的支持通常是指光栅化模式,其中,图元被部分覆盖的像素采用该光栅化模式被光栅化。这个特征有不同的层次(tier)。在第3层级,可以(选择性地)传入名为SV_InnerCoverage的系统变量,当保证像素被图元完全覆盖时,该变量的最低有效位(LSB)被设置为1。
[0146] 示例性的算法
[0147] 使用第3层(或类似的)保守光栅化器,优选实施例实现以下过程,用于标识可从更精确的可见性计算中获益的像素。
[0148] 通道1:深度预通道(pre-pass)
[0149] 从这个通道,生成深度缓冲器,其存储最近的完全覆盖像素的深度。根据优选实施例,深度预通道可按照以下步骤来执行:
[0150] 1.启用保守光栅化,并启用用于读和写的深度测试。
[0151] 2.像素着色器接受SV_InnerCoverage作为输入。其检查这个值,以找到被图元完全覆盖的像素,并丢弃未被完全覆盖的像素。结果是,只有被完全覆盖的像素的深度值才会被写入,并且因为它们被完全覆盖,所以它是真正的深度(而不是外推/夹紧的深度)。只被部分覆盖的像素将被丢弃,并且不会为这些像素更新深度值。
[0152] 通道2:像素标识通道
[0153] 经过此通道之后,获得2D表面,其包含用于具有一些部分可见图元并且需要进一步处理才能可见的像素的非零值。这些位置中的值表示可能在这些像素中可见的图元的数量。通过递增用于相同UAV的无序访问视图(UAV)计数器,可以跟踪覆盖所有感兴趣像素的图元的总数。注意,这是一个近似启发式,因为这些像素内部的实际可见性可能比接触这些像素的图元数量更复杂。
[0154] 根据优选实施例,可以按照以下步骤执行像素标识通道:
[0155] 1.启用保守光栅化和深度测试来读取,但是关闭写操作。
[0156] 2.将通道1中生成的深度-缓冲器绑定为深度缓冲器。
[0157] 3.将无序访问视图绑定为渲染目标的大小和格式UINT_8/16/32,并清除具有全部零的UAV。大小确定了能够接触像素的图元的最大数量(分别为256、64K或4G)。
[0158] 4.绑定接受SV_InnerCoverage作为输入的像素着色器,但是该通道跳过处理被完全覆盖的像素。而是,对于部分覆盖并通过深度测试的像素,通过每次调用UAV时在该位置对UAV递增一,着色器将这些像素标记为感兴趣的像素。
[0159] 改进的可见性计算
[0160] 一旦标识出复杂像素,就可以应用更精确的方法来计算这些像素的可见性。这可以通过以下两种方法之一实现:1)使用GPU光线跟踪提高子像素采样率,或者2)分析性地求解可见性。
[0161] 具有DXR的GPU光线跟踪
[0162] 根据优选实施例,通过使用GPU光线跟踪对子像素区域进行点采样,对复杂像素计算出改进的可见性估计。最近,微软宣布了DirectX光线跟踪(DXR)API,该API使用了NVIDIA的RTX光线跟踪技术,并且使GPU光线跟踪在实时应用中切实可行。GPU光线跟踪还消除了传统的基于光栅的管线中对像素内样本数量和定位的硬件限制。
[0163] 在一像素内多次点采样可见性使用足够多的样本提供了合理的近似(但不是精确的解)。跟踪到的光线(例如,来自DXR光线生成着色器)可以使用前面提到的图元计数作为对于如何在子像素区域内分布光线的指引。更多的光线可以专用于被更多的图元所接触的像素,或者针对每个复杂像素可以对动态数量的可见性或有彩色的子样本进行快照。
[0164] 采用基于非-DXR的光线跟踪的可见性
[0165] 使用分析性方法改进基于采样的可见性确定技术是可能的。示例的过程可以执行如下:
[0166] 1.针对每像素N个(光线样本的数量)64位条目,用足够的空间将缓冲器填充到0xffffffffffffff
[0167] 2.对于复杂像素(简单的像素可以由例如模板剔除),使用保守光栅重新渲染[0168] 3.使用快速GS将三角形的世界空间顶点传递给像素着色器
[0169] 4.在像素着色器中,对于每个样本s(1..N)
[0170] a.设置从眼睛到像素中样本s的WS位置的光线
[0171] b.计算当前三角形与光线(其击中三角形)的交点
[0172] i.像这样(深度值(DepthValue):ID)构造一个64位的词(32:32)
[0173] 1.ID是一个32位的字,其标识对象和对象中的图元
[0174] ii.使用AtomicMin64更新当前像素的样本s(旧的,(DepthValue:ID))[0175] iii.如果32个32位ID不够用,就需要使用ROV
[0176] 5.在所有复杂像素上运行
[0177] a.在所有N个样本上运行
[0178] i.提取ID并重新计算与三角形的光线交点
[0179] ii.光线交叉
[0180] iii.积累照明
[0181] b.将累计照明除以N
[0182] c.写入结果
[0183] 附加像素分类方法
[0184] 用于对像素进行分类并确定使用GPU光线跟踪时要投射多少光线的进一步实施例可以包括:
[0185] 1.计算相邻像素的亮度差异
[0186] 2.计算相邻像素的3-元组(图元ID、实例ID、drawCallID)的差异。如果启用了曲面细分,则可以针对每个三角形生成唯一的ID,曲面细分使用GS中的原子递增以及而不使用图元ID来生成该三角形。启用了曲面细分后,图元ID对应于补丁ID。
[0187] 3.计算相邻像素的材料ID或材料参数的差异。
[0188] 4.计算相邻像素的深度或表面法线的差异。
[0189] 5.结合1-4。
[0190] 6.1-4的结合的时间变化。
[0191] 混合延迟光线跟踪的抗锯齿
[0192] 通常抗锯齿是使用时间屏幕空间滤波器,或通过应用如聚合G-缓冲器抗锯齿(AGAA)等技术来执行。AGAA是一种使用图形硬件实现复杂几何图形的抗锯齿延迟渲染的技术。AGAA使用光栅化管线在每个像素内生成紧凑的、预先过滤的几何表示。然后以固定的速率、独立于几何复杂度执行着色。通过将阴影率与几何采样率解耦,该算法降低了几何缓冲器的存储和带宽成本,并允许扩展到抗锯齿的高可见性采样率。然而,传统的AGAA技术不能充分地处理复杂像素,而且单独的AGAA技术可能不足以为复杂像素自适应地生成每个子样本的新信息,这是一个复杂的过程,其对该场景通常需要多个渲染通道。
[0193] 本发明的进一步实施例指向一种新的替代方法,该方法仅在必要时生成额外的“子样本”。由于可以入射任意数量的光线,因此质量是可伸缩的。该解与时间滤波正交。根据这些实施例,不再需要对场景进行多次渲染/光栅化通道。用户可以只为某些几何类型(如树叶等)选择地生成更多的样本。
[0194] 根据一个或更多个实施例,提供了一个完全可扩展的抗锯齿解决方案,该解决方案使用协同处理(例如,经由树遍历单元(TTU))完美地结合了光栅化和加速光线跟踪的最佳效果,以生成对GPU的需求,其可以进行快速的和硬件加速的光线跟踪。
[0195] 一种示例性的实现方式如下:
[0196] 1.渲染非抗锯齿G-缓冲器(详见下文)
[0197] 2.找到在深度、亮度等方面围绕不连续点的像素。
[0198] 3.通过第2步中找到的像素入射若干光线(例如光线跟踪),以生成G-缓冲器样本。
[0199] 另一种示例性的实现方式如下:
[0200] 1.渲染非抗锯齿G-缓冲器
[0201] a.可选地只使用目标独立光栅化(TIR)渲染MSAA深度缓冲器
[0202] b.可选地使用TIR渲染MSAA法线
[0203] 2.检测复杂像素
[0204] a.寻找深度/亮度和其他不一致/不连续点
[0205] b.必要时使用MSAA深度和/或MSAA法线
[0206] 3.针对复杂像素的G缓冲器数据的N-样本分配存储
[0207] a.还可以使用每个复杂像素的子样本列表
[0208] 4.每个复杂像素入射N条光线(这里可以使用时间滤波器)
[0209] a.记录最近命中的G-缓冲器数据
[0210] b.可选地,可以对结果进行迭代,以自适应地入射更多光线
[0211] 5.在延迟照明期间-也针对复杂像素计算光线击中
[0212] 用于时间抗锯齿的自适应光线跟踪
[0213] 现有的时间抗锯齿算法(TAA)在目前的视频游戏中得到了广泛的应用。这种算法的主要限制之一是,当标识出某个特定像素偏离了正确的值时,没有很好的方法对该像素进行着色,并且只有一些启发式规则,取决于采样问题的根本原因这些启发式规则会崩溃。
[0214] 通常,当运动向量和帧之间的颜色表明正常算法不会做正确的事情时,启发式选择样本颜色。本发明的一个或更多个实施例没有使用启发式规则来选择颜色,而是将额外的样本直接投射到场景中,并收集选择正确颜色所需的信息。
[0215] 根据优选实施例,时间抗锯齿可按照以下描述的过程执行:
[0216] 1.使用现有的渲染器(前向或延迟…或甚至光线跟踪的原始光线),以照常生成光栅化的图像。可能是MIP-偏向过锐
[0217] 2.运行TAA通道
[0218] a.*检测TAA数据何时为“坏”/颜色可能不是像素的一部分(这显示为需要“颜色夹钳/裁剪”的点;也可以保持更智能的历史EMWVariance值)
[0219] b.不要对这个像素使用TAA结果…相反,针对超采样光线跟踪标记该像素。这可以是具有哨兵值或alpha通道。
[0220] 3.在TAA通道过程中,为标记的像素分派AA光线,将输出写入第二纹理[0221] a.*MSAA点击位置+时间子像素偏移量,但从不是已由光栅通道产生的中心像素。
[0222] b.*在光线击中上运行来自光栅通道的完全相同的“像素”着色器HLSL代码[0223] c.*……包括使用任何AO/SSRT/地下/阴影地图等屏幕空间输入,像素使用该屏幕空间输入来进行常规光栅通道。光栅着色应该匹配一致性
[0224] d.根据实施例,在假设透明度/颗粒/等具有其自己的流程用于作为单独的通道以通过管线并处理AA的情况下,该过程可应用于不透明表面,就像它们在如今的游戏引擎中所做的那样。
[0225] 4.混合光线跟踪抗锯齿纹理结果与颜色缓冲器
[0226] a.*使用光栅操作,因为在光线跟踪通道中使用原子会很慢。
[0227] 自适应时间抗锯齿
[0228] 在一个实施例中,提供了一种用于游戏中实时自适应超采样的实用算法。它通过自适应光线跟踪扩展了光栅图像的时间抗锯齿,并且符合商业游戏引擎和当今的GPU光线跟踪API的约束。该算法消除了与标准时间抗锯齿相关的模糊和重影伪影,并在大多数游戏所需的33ms帧预算内停留的同时实现了几何、阴影和材质的接近8x超采样的质量。
[0229] 介绍
[0230] 主要可见表面的锯齿是计算机图形学的最基本和最具挑战性的限制之一。几乎所有的渲染都对像素内的点上的表面进行采样,并且因此当被采样的点不能代表像素整体时,即主表面采样不足时,就会产生错误。不管这些点是通过投射光线还是光栅化的平摊光线投射来测试的,也不管使用什么阴影算法,都是如此。当然,分析渲染器,如在空间和时间上的完美光束跟踪,可以完全避免光线(欠)采样问题;尽管在有限的情况下有一些分析性的解,但是对于复杂几何、材料和阴影的高效渲染,来自光线或光栅交叉点的点采样仍然是唯一完全开发的方法。甚至“基于点的”渲染器实际上也可以通过光栅化将光线跟踪或溅射到光线上。
[0231] 这种由欠采样引起的锯齿表现为锯齿状边缘、空间噪声和闪烁(时间噪声)。试图通过在空间(如MLAA和FXAA)和时间(如SMAA和TAA)中更广泛和更复杂的重构过滤器来隐藏这些错误,可能将这些伪影转换为模糊(在空间中)或重影(在时间中模糊)。
[0232] 在对图像的每个像素的固定采样计数之下,对于锯齿的唯一真正的解决方法是增加采样密度和限制被采样的信号的带宽。增加密度有助于但不能以实时可承受的速率解决问题:超采样(SSAA)导致了与样本数量成线性正比的成本,而质量只随平方根增加;多采样(MSAA、CSAA、SBAA、SRAA)以不同的速率采样几何图形、材料和阴影,以启发式地降低了成本,但也降低了质量;以及聚合降低成本的力度更大,但仍在实际速度上限制质量。对于带宽受限的场景,通过MIP映射和变体(如LEAN)对材料进行预滤波,几何形状的细节级别和着色器细节级别提高了欠采样。它们还引入了其他过度模糊或弹出的问题(时间和空间不连续),同时使渲染系统复杂化,并且最终未能完全解决这个问题。
[0233] 实时渲染的标准是同时使用上述多个策略。在最好的情况下,这几乎可以消除观看者对锯齿伪影的感觉。尽管钦佩这些成功,但主要的锯齿挑战仍然保留着对实时的开放,因为它们是特定于游戏的解决方案,其需要大量的工程复杂性和设计者对场景的仔细手工调整。
[0234] 这些由实时欠采样光线和解决方案的不必要的成本或限制带来的问题都是由于每像素的固定的采样计数。对手能够总是在样本之间放置材质、几何或阴影特征,从而产生无界误差,例如非常明亮、非常小的光源,其很少由像素的中心采样。
[0235] 离线光线跟踪渲染器长期使用高的和自适应的采样计数来简单而优雅地解决锯齿问题,其中渲染器跟踪每像素的样本的一些高的最小数量(例如,64),并且然后跟踪该像素内的附加批的样本,直到达到最大阈值或稳定分布为止。由于几乎所有的实时渲染都是基于规则的光栅化采样率,因此以前没有实用的方法来实时自适应地采样。即使是模板化可能锯齿的像素并对其进行二次高密度通道的简单方法也是低效的:光栅化需要处理所有几何图形,即使只有几个像素受到影响。例如,需要抗锯齿的像素可以根据轨迹阴影和高分辨率几何通道进行主动标识,但可以达到与减少10%的帧时间的SSAA几乎相同的效果,尽管将阴影样本数量减半。
[0236] 提出了一种使用光线跟踪和光栅化的混合的用于实时自适应采样的方法。最近发布的DirectX光线跟踪API(DXR)可以启用此方法。DXR允许数据结构和用于在整个游戏引擎上的两种类型的渲染的着色器之间的完全互操作,消除了之前用于混合方法的光线和光栅API之间的复制那些的不实用性。
[0237] 自适应采样是建立在展示如何有效地结合这些用于现代图形硬件的技术,以及如何使用时间抗锯齿的上下文中的自适应采样,以在不会造成模糊或重影的同时仍然分摊光栅化样本在时间上的成本。
[0238] 时间抗锯齿
[0239] 在其可以处理的情况下,时间抗锯齿[8](TAA)是快速和相当好的。TAA对每一帧的图像平面位移应用子像素位移,并且然后在前几帧上累积指数加权移动平均值,每一帧只使用每像素一个样本进行渲染。在静态场景中,这接近于全屏超采样的质量。
[0240] 对于动态场景,TAA通过沿着光栅化器通道之前生成的每像素的运动向量偏移纹理取回来“重新投影”来自累积的历史缓冲器的样本。
[0241] TAA在一些情况下会失败。当新的屏幕区域被物体运动不遮挡(disocclude)(显示)时,它们不在历史缓冲器中表示,或者被运动向量错误表示。相机旋转和后向平移也会在屏幕边缘造成较厚的不遮挡。例如线和精细材料细节等子像素特征能够在连续的偏移样本之间滑动,并且因此在下一帧中无法被运动向量表示。透明表面创建像素,来自不透明对象的运动向量与被表示的对象的总运动在该像素不匹配。最后,阴影和反射不沿着被其遮蔽的表面的运动向量的方向移动。
[0242] 当TAA失败时,它要么产生重影(由于集成了不正确的值而变得模糊),要么将原始锯齿显示为锯齿、闪烁和噪声。标准TAA试图通过将历史样本与新帧中相应像素的本地邻居进行比较来检测这些情况。当它们出现太大的差异时,TAA会使用各种启发式方法在颜色空间中进行裁剪辑、箝位或插值。这些启发式规则的最佳实践经常变化,并且以前没有找到通用的解决方案。
[0243] 示例性的算法
[0244] 一种示例性的方法被设计成与传统游戏引擎兼容,并使用TAA的优势,同时明确而简单地解决其失败。
[0245] 一种示例性的想法是在大多数像素上运行TAA的基本方案,然后,不是尝试用启发式来对抗它的失败,而是输出说明它将在哪里失败以及为什么失败的保守的分割图像。在失败像素处,TAA的复杂启发式可以被适应图像内容的鲁棒的替代品所替代。
[0246] 图8示出了根据一个示例性实施例的、在DXR光线跟踪API的上下文中的示例性的自适应时间抗锯齿算法800。在图中,矩形图片802A-F表示缓冲器的可视化,并且圆角矩形804-812表示着色器通道。并未示出所有的中间缓冲器。例如,如果前一帧的输出作为输入反馈给TAA,则不显示相关的乒乓(ping-pong)缓冲器。
[0247] 在一个实施例中,分割图像实际上存储在TAA输出的alpha通道中。在图像中,光线跟踪超采样将应用于第一组像素。第一组像素表示历史样本与新帧(TAA的用于颜色裁剪和产生噪声的通常度量)中相应的邻居明显偏离的情况,以及被标识为深度边缘或高材料梯度的像素。包含额外的项确保了保守光线跟踪被应用于单独历史没能检测到的潜在锯齿源。图像中的第二组像素包括不遮挡。这对于光线跟踪来说将是昂贵的,因为它们可能很大,并且通常只针对单个帧呈现,例如在旋转时屏幕的边缘。第二组像素可以通过运动向量失败来标识,并且FXAA只在那些像素上运行。在相机剪切或场景加载后第一帧的特殊情况下,所有的像素都可以在第二组中进行分类。分割图像中的第三组像素是TAA在其基本情况下已经成功的像素。
[0248] 由于在第三组中,帧几乎总是由TAA像素控制,因此光线跟踪的成本是高度分摊的,并且要求远低于每像素一个样本的光线预算。例如,如果6%的分割落在第一组内,那么可以自适应地使用跟踪8x光线跟踪的超采样,成本低于每像素0.5光线。然而,其质量在各处都可以与8x超采样相比;否则,由于使用了不同的算法,分割区域之间的边界会在最终结果中闪烁。不需要在这些边界处填充过渡,这表明在这种分割方法下,所有三种集成策略都收敛为类似的结果。
[0249] 在另一个实施例中,第一组可被光线跟踪。例如,光线可以以8xMSAA n-rooks子像素采样模式进行投射,8xTAA使用的是相同的采样。可以不使用时间抖动。光线投射被实现为DXR光线生成着色器。在光线击中时,使用与光栅管线完全相同的HLSL代码可以直接运行完全基于UE4节点的材质图和着色管线。由于前向差分衍生物在光线生成着色器中是不可用的,它们可以被看作是无限的,以强制纹理的最高分辨率。因此,超采样可以单独用于解决材质锯齿(大多数胶片渲染器都是这样操作的,以获得最高的质量);另一种方法是使用距离和方位来分析性地选择MIP级别,或者使用光线差分来代替光栅差。
[0250] 使用FXAA处理的像素比TAA成功处理的第三组像素中的那些成本要低,但比超采样光线跟踪的像素要便宜得多。FXAA在这里表现良好,因为它不需要历史数据,而且它运行在低动态范围的后轮廓图输出上,以节省存储器带宽。通过仅在去遮挡像素上运行FXAA,与典型的全屏应用程序相比,降低了成本;通常降低了15%,即使是对于快速的物体和相机移动。
[0251] 结论
[0252] 主表面锯齿是计算机图形学中的基本问题。离线渲染的一种示例性的解决方案是自适应超采样。这在以前对于复杂材质和场景的上下文中的光栅化渲染器来说是不切实际的,因为没有有效地光栅化稀疏像素的方法。即使是最高效的GPU光线跟踪器也需要复制着色器和场景数据。虽然DXR解决了光栅化和光线跟踪相结合的技术挑战,但将光线跟踪应用于通过超采样来解决锯齿问题并非易事:当只给出1spp输入时,知道要对哪些像素进行超采样,并将成本降低到可伸缩的程度,这些都不是单纯的光线跟踪所能解决的。示范了该问题的一种实用的解决方案;它非常实用,可以在商业游戏引擎中运行,甚至可以在第一代实时光线跟踪商品硬件和软件上实时运行,并连接到整个着色器管线。当电影渲染器选择要通过首先在每个像素上投射多个光线来自适应地对其超采样的像素时,其通过使用TAA的历史缓冲器来检测锯齿,从而将成本分摊到许多帧上。此外,大的、瞬态的锯齿区域被标识,由于在其中使用了去遮挡和后处理的FXAA,而非扩大光线。这种混合策略使用了最复杂的实时抗锯齿策略的优点,但避免了它们的局限性。通过将超采样的结果反馈回TAA缓冲器,这些像素不会在后续帧上触发超采样的概率会增加,从而进一步降低成本。
[0253] 虽然上面已经描述了各种实施例,但是应该理解,它们只是以示例的方式呈现而并非限制。因此,优选实施例的宽度和范围不应受上述示例性实施例中的任何一个的限制,而应仅根据下文的权利要求及其等效物来定义。
高效检索全球专利

专利汇是专利免费检索,专利查询,专利分析-国家发明专利查询检索分析平台,是提供专利分析,专利查询,专利检索等数据服务功能的知识产权数据服务商。

我们的产品包含105个国家的1.26亿组数据,免费查、免费专利分析。

申请试用

分析报告

专利汇分析报告产品可以对行业情报数据进行梳理分析,涉及维度包括行业专利基本状况分析、地域分析、技术分析、发明人分析、申请人分析、专利权人分析、失效分析、核心专利分析、法律分析、研发重点分析、企业专利处境分析、技术处境分析、专利寿命分析、企业定位分析、引证分析等超过60个分析角度,系统通过AI智能系统对图表进行解读,只需1分钟,一键生成行业专利分析报告。

申请试用

QQ群二维码
意见反馈