一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

经由基于物理的渲染引擎的加速处理的制作方法

2023-04-12 06:55:26 来源:中国专利 TAG:


1.本公开的实施例总体上涉及计算机科学和架构,并且更具体地涉及经由基于物理的渲染引擎的加速处理。


背景技术:

2.在计算机图形中,光线(ray)追踪技术经常用于渲染三维场景的二维图像。光线追踪涉及将光线从特定视点传输到三维场景中并且确定这些光线与该三维场景中的不同对象的表面相交的不同点。对光线与特定对象的表面相交的每个位置执行材料着色操作以确定二维图像中的对应像素的颜色。
3.为了产生更逼真的结果,三维场景内的对象表面经常使用不同层的材料属性来建模,仅举几例,如抛光、反射率、漫射行为、半透明度和透明度。然后可以生成用于基于用于对对象表面进行建模的不同层材料属性来定义三维场景内的对象表面的材料属性的图形结构。除其他事项之外,图形结构基于对象表面的材料属性以及对象表面的材料属性之间的关系来指示光如何与三维场景内的对象表面相互作用。当渲染三维场景的二维图像时,材料图被编译成由处理器执行以执行相关材料着色操作的多个材料着色器程序。
4.为了加速图形渲染,图形处理计算常常被卸载到图形处理单元(gpu)。以高度并行化方式配置典型的gpu,其中多个处理核心利用simd(相同指令,多个数据)或simt(相同指令,多个线程)执行模型同时跨多个不同线程组处理图形数据或其他卸载的数据。通过simd或simt处理,线程组中的不同线程基于同一指令处理不同数据,这允许gpu内的处理核心快速且高效地执行高度并行的处理操作,以大幅增加总处理吞吐量。
5.然而,光线追踪的常见问题是光线追踪操作通常不能使用gpu以高度并行的方式执行,因为每个单独的光线典型地涉及不同的输入和不同的计算。例如,如果两条不同的光线与三维场景内的两个不同表面相交,则将需要对每条光线执行不同的材料着色器程序。由于这个原因,光线不能容易地参与simd或simt执行模型来进行有效的并行处理。相反,光线通常需要根据材料类型进一步分类,使得可以使用simd或simt处理原本不相关的光线组。因而,作为一般问题,不能容易地利用常规gpu的高度并行架构来加速光线追踪操作。
6.使gpu和其他类型的并行处理器能够更高效地执行光线追踪操作和其他串行处理任务的一种方式将是向这些处理器添加更多的晶体管。然而,为了增加处理器内的晶体管的数量,管芯尺寸将必须增加,晶体管将必须更密集地打包,或者晶体管将必须更小。增加管芯尺寸通常是不希望的。进一步,因为晶体管尺寸减小的速率和晶体管密度增加的速率减慢,所以将大量晶体管添加到处理器将可能导致较大的处理器,如先前所述,这将是不期望的。因而,将晶体管添加到gpu和其他类型的并行处理器以便在执行光线追踪操作和其他串行处理任务时改善处理性能不是可行的解决方案。
7.如前所述,在本领域中需要更有效的方式来在并行处理器上执行光线追踪操作和其他串行处理任务。


技术实现要素:

8.本公开的实施例阐述了一种用于在包括在执行单元中的固定功能管线(fixed-function pipeline)内处理数据的计算机实现的方法。所述方法包括从第一处理单元接收第一输入,其中所述第一输入对应于第一固定功能。该方法还包括对第一输入执行第一固定功能以生成第一输出,其中在对从处理多条光线的多个处理核心接收的一个或更多个输入执行第一固定功能之前,对第一输入执行第一固定功能,并且其中每条光线表示从光源到三维(3d)环境内的至少一个点的路径。另外,所述方法包括将所述第一输出传输到所述第一处理单元以供进一步处理。
9.所公开的技术的至少一个技术优点是提供了渲染引擎,该渲染引擎被特别设计成相对于现有技术解决方案以提高的效率执行光线追踪操作和其他串行处理任务。因而,渲染引擎可被合并到gpu或其他并行处理单元中,并且不能跨gpu或其他并行处理单元内的常规处理元件有效地并行化的处理任务可被卸载到渲染引擎,这增加了总体处理性能和吞吐量。对此,在渲染引擎内实现多个mimd(多输入、多数据)处理核心,其中每个处理核心被配置为异步地处理不同的光线或串行处理工作的其他单元,这使得光线跟踪操作和其他串行处理任务能够跨不同的处理核心大部分并行地执行。另外,为了进一步改进总体处理吞吐量,渲染引擎包括被设计成执行某些专门处理任务的多个管线。在操作期间,处理核心可以将专门处理任务卸载到不同管线,并且驻留在渲染引擎内的调度器被配置成以优化方式跨不同管线调度所卸载的任务。这些技术优点提供了优于现有技术方法的一个或更多个技术进步。
附图说明
10.为了更详细地理解上述各种实施例的相关特征,可以通过参考各种实施例(其中一些已在附图中说明)对上述简要概括的本发明概念进行更具体的描述。但是,需要注意的是,所附的附图只说明发明概念的典型实施例,因此并不是以任何方式限制范围,还存在其他同样有效的实施例。
11.图1是示出了被配置成用于实施各个实施例的一个或更多个方面的计算机系统的框图;
12.图2是根据一个实施例的包括在图1的并行处理子系统中的并行处理单元的框图;
13.图3是根据一个实施例的图2的并行处理单元的通用处理集群的框图;
14.图4是根据一个实施例的包括在图3的纹理处理单元中的渲染引擎的框图;
15.图5a-b是示出了根据一个实施例的用于使用图4的渲染引擎执行光线的材料着色的数据流的框图;
16.图6是根据一个实施例的用于使用图4的渲染引擎对光线执行材料着色的方法步骤的流程图;
17.图7是根据一个实施例的用于使用图4的渲染引擎执行一组材料着色指令的方法步骤的流程图;
18.图8是示出了根据一个实施例的用于使用图4的渲染引擎的固定功能管线来执行流式多处理器的操作的数据流的框图;
19.图9是根据一个实施例的用于使用图4的渲染引擎的固定功能管线来执行流式多
处理器的操作的方法步骤的流程图;
20.图10a-10c是示出了根据一个实施例的用于使用图4的渲染引擎从压缩纹理块中提取单个纹理元素的数据流的框图;
21.图11a是根据一个实施例的用于确定目标纹理块的地址的方法步骤的流程图;
22.图11b是根据一个实施例的用于从纹理块中提取目标纹理元素而不解压缩或提取纹理块中的其他纹理元素的方法步骤的流程图;
23.图12是示出了根据一个实施例的用于使用图4的渲染引擎对光线执行重要性采样的数据流的框图;
24.图13a是根据一个实施例的用于使用图4的渲染引擎对光线执行重要性采样的方法步骤的流程图;
25.图13b是根据一个实施例的用于使用图4的渲染引擎来执行一组重要性采样指令的方法步骤的流程图;
26.图14是示出了被配置成用于实现各个实施例的一个或更多个方面的计算设备的框图;
27.图15是示出了根据一个实施例的示例材料图的概念图;以及
28.图16是根据一个实施例的用于将材料图编译成字节代码指令的方法步骤的流程图。
具体实施方式
29.在下面的描述中,阐述了大量的具体细节,以提供对各个实施例的更全面理解。然而,对于本领域技术人员来说,可以在没有一个或更多个这些具体细节的情况下实践这些发明概念。
30.系统概述
31.图1为示出了被配置为实现各个实施例的一个或更多个方面的计算机系统100的框图。如图所示,计算机系统100包括但不限于中央处理单元(cpu)102、系统存储器104,其经由存储器桥105和通信路径113耦连至并行处理子系统112。存储器桥105进一步地经由通信路径106耦连至i/o(输入/输出)桥107,i/o桥107又耦连至交换机116。
32.在操作中,i/o桥107被配置为从输入设备108(诸如键盘或鼠标)接收用户输入信息,并经由通信路径106和存储器桥105将输入信息转发给cpu 102进行处理。交换机116被配置为在i/o桥107和计算机系统100的其他组件(如网络适配器118和各种附加卡120和121)之间提供连接。
33.还如图所示,i/o桥107耦合至系统盘114,系统盘114可以被配置为存储内容、应用程序和数据,以供cpu 102和并行处理子系统112使用。一般来说,系统盘114为应用程序和数据提供非易失性存储器,可包括固定的或可移除的硬盘驱动器、闪存设备和cd-rom(光盘只读存储器)、dvd-rom(数字多功能盘-rom)、蓝光、hd-dvd(高清dvd)或其他磁、光或固态存储设备。最后,虽然未明确示出,其他组件(诸如通用串行总线或其他端口连接、光盘驱动器、数字多功能盘驱动器、胶片录制设备等)也可以连接到i/o桥107。
34.在各个实施例中,存储器桥105可以是北桥芯片,i/o桥107可以是南桥芯片。此外,可以用任何技术上合适的协议(包括但不限于agp(加速图形端口)、超文本传输
(hypertransport)或本领域公知的任何其他总线或点对点通信协议)在计算机系统100内实现通信路径106和113以及其他通信路径。
35.在一些实施例中,并行处理子系统112包括图形子系统,该图形子系统向显示设备110输送像素,该显示设备可以是任何常规的阴极光线管、液晶显示器、发光二极管显示器等。在这种实施例中,并行处理子系统112合并了针对图形和视频处理优化的电路,包括例如视频输出电路。如下图2中更详细地描述的,此类电路可以跨并行处理子系统112中包括的一个或更多个并行处理单元(ppu)合并。在其他实施例中,并行处理子系统112合并了针对通用和/或计算处理而优化的电路。同样,此类电路可以跨并行处理子系统112中包括的一个或更多个ppu合并,这些ppu被配置为执行此类通用和/或计算操作。在其他实施例中,并行处理子系统112中包括的一个或更多个ppp可配置为执行图形处理、通用处理和计算处理操作。系统存储器104包括至少一个设备驱动器103,该驱动程序配置为管理并行处理子系统112中的一个或更多个ppu的处理操作。系统存储器104还包括在cpu 102上执行并可发出控制ppu的操作的命令的软件应用程序125。
36.在各种实施例中,并行处理子系统112可与图1的一个或更多个其他元素集成,以形成单个系统。例如,并行处理子系统112可以与cpu 102和其他连接电路集成在单个芯片上,以形成片上系统(soc)。
37.应理解,本文所示的系统是说明性的,并且变化和修改是可能的。连接拓扑(包括网桥的数量和布置、cpu 102的数量和并行处理子系统112的数量)可以根据需要进行修改。例如,在一些实施例中,系统存储器104可以直接连接到cpu 102,而不是通过存储器桥105连接到cpu 102,并且其他设备将经由存储器桥105和cpu 102与系统存储器104进行通信。在其他替代拓扑中,并行处理子系统112可以连接到i/o桥107或直接连接到cpu 102,而不是连接到存储器桥105。在其他实施例中,i/o桥107和存储器桥105可以集成到单个芯片中,而不是作为一个或更多个分立器件存在。最后,在某些实施例中,图1所示的一个或更多个组件可以不存在。例如,可以消除交换机116,网络适配器118和附加卡120、121会直接连接到i/o桥107。
38.图2是根据一个实施例的图1的并行处理子系统112中包括的并行处理单元(ppu)202的框图。尽管图2描述了一个ppu 202,如上文所述,但并行处理子系统112可以包括任意数量的ppu 202。如图所示,ppu 202耦合到本地并行处理(“pp”)存储器204。ppu 202和pp存储器204可采用一个或更多个集成电路器件实现,例如可编程处理器、应用专用集成电路(“asic”)或存储器设备,或者任何其他技术上可行的方式。
39.一些实施例中,ppu 202包括图形处理单元(“gpu”),该gpu可配置为实现图形渲染管线,以基于cpu 102和/或系统存储器104提供的图形数据执行与生成像素数据相关的各种操作。在处理图形数据时,pp存储器204可用作存储一个或更多个常规帧缓冲区(如果需要,还可以存储一个或更多个其他渲染目标)的图形存储器。除其他事项外,pp存储器204可用于存储和更新像素数据,并将最终像素数据或显示帧传输至显示设备110以进行显示。在一些实施例中,ppu 202也可以配置为通用处理和计算操作。
40.在操作中,cpu 102是计算机系统100的主处理器,控制和协调其他系统组件的操作。特别是,cpu 102发出控制ppu 202操作的命令。在一些实施例中,cpu 102将用于ppu 202的命令流写入数据结构(图1或图2未明确示出)中,该数据结构可以位于系统存储器
104、pp存储器204或cpu 102和ppu 202两者可访问的另一个存储位置。指向数据结构的指针被写入推送缓冲区以启动对数据结构中命令流的处理。ppu 202从推送缓冲区读取命令流,然后相对于cpu 102的操作异步地执行命令。在生成多个推送缓冲区的实施例中,应用程序可以经由设备驱动器103为每个推送缓冲区指定执行优先级,以控制不同推送缓冲区的调度。
41.还如图所示,ppu 202包括i/o(输入/输出)单元205,其经由通信路径113和存储器桥105与计算机系统100的其余部分进行通信。i/o单元205生成数据包(或其他信号)以在通信路径113上传输,并且还从通信路径113接收所有传入数据包(或其他信号),将传入数据包定向到ppu 202的相应组件。例如,与处理任务相关的命令可定向到主机接口206,而与存储器操作相关的命令(例如,从pp存储器204读取或写入pp存储器204)可以定向到交叉开关单元210。主机接口206读取每个推送缓冲区,并将存储在推送缓冲区中的命令流发送到前端212。
42.如上结合图1所述,ppu 202与计算机系统100的其余部分的连接可以变化。在一些实施例中,并行处理子系统112(其包括至少一个ppu 202)作为附加卡实现,其可插入计算机系统100的扩展槽中。在其他实施例中,ppu 202可采用总线桥集成在单个芯片上,诸如存储器桥105或i/o桥107。同样,在其他实施例中,ppu 202的一些或全部元件可与cpu 102一起被包括在单个集成电路或片上系统(soc)中。
43.在操作中,前端212将从主机接口206接收的处理任务发送到任务/工作单元207内的工作分配单元(未示出)。工作分配单元接收指向处理任务的指针,这些任务被编码为任务元数据(“tmd”)并存储在存储器中。指向tmd的指针包括在命令流中,该命令流存储为推送缓冲区,并由前端单元212从主机接口206接收。可以编码为tmd的处理任务包括与要处理的数据相关联的索引,以及定义如何处理数据的状态参数和命令。例如,状态参数和命令可以定义要对数据执行的程序。任务/工作单元207从前端212接收任务,并确保在启动每个tmd指定的处理任务之前将gpc 208配置为有效状态。可以为每个tmd指定优先级,该优先级用于调度处理任务的执行。处理任务也可以从处理集群阵列230接收。可选地,tmd可以包括控制是否将tmd添加到处理任务列表(或指向处理任务的指针列表)的头部或尾部,从而提供对执行优先级的另一级控制的参数。
44.ppu 202基于处理集群阵列230有利地实现了高度并行处理体系架构,处理集群阵列230包括一组c个通用处理集群(gpc)208,其中c≥1。每个gpc 208能够同时执行大量(例如数百或数千个)线程,其中每个线程都是程序的实例。在各种应用中,可以分配不同的gpc 208来处理不同类型的程序或执行不同类型的计算。gpc 208的分配可根据每种类型的程序或计算产生的工作负载而不同。
45.存储器接口214包括一组d个分区单元215,其中d≥1。每个分区单元215耦合到驻留在ppm存储器204内的一个或更多个动态随机存取存储器(dram)220。在一个实施例中,分区单元215的数量等于dram 220的数量,每个分区单元215耦合到不同的dram 220。在其他实施例中,分区单元215的数量可以与dram 220的数量不同。本领域普通技术人员可以认识到,dram 220可更换为任何其他技术上合适的存储设备。在操作中,各种渲染目标(诸如纹理映射和帧缓冲区)可以跨dram 220存储,允许分区单元215并行写入每个渲染目标的部分,从而有效地使用pp存储器204的可用带宽。
46.给定的gpc 208可以处理要写入pp存储器204中的任何dram 220的数据。交叉开关单元210被配置为将每个gpc 208的输出路由到任何分区单元215的输入或任何其他gpc 208以进行进一步处理。gpc 208经由交叉开关单元210与存储器接口214通信,以从各个dram 220读取或写入各个dram 220。在一个实施例中,交叉开关单元210除了经由存储器接口214连接到pp存储器204之外,还连接到i/o单元205,从而使不同gpc 208中的处理核能够与系统存储器104或非ppu 202本地的其他存储器进行通信。在图2的实施例中,交叉开关单元210与i/o单元205直接连接。在各种实施例中,交叉开关单元210可以使用虚拟通道分隔gpc 208和分区单元215之间的业务流。
47.同样,gpc 208可以被编程为执行与各种应用相关的处理任务,包括但不限于线性和非线性数据变换、视频和/或音频数据的过滤、建模操作(例如,应用物理定律以确定对象的位置、速度和其他属性)、图像渲染操作(例如,曲面细分着色程序、顶点着色程序、几何着色程序和/或像素/片段着色程序)、通用计算操作等。在操作中,ppu 202被配置为将数据从系统存储器104和/或pp存储器204传输到一个或更多个片上存储器单元,处理该数据,并将结果数据写回系统存储器104和/或pp存储器204。然后,其他系统组件(包括cpu 102、并行处理子系统112中的另一ppu 202或计算机系统100中的另一并行处理子系统112)可以访问该结果数据。
48.如上所述,并行处理子系统112中可包括任意数量的ppu 202。例如,单个附加卡上可提供多个ppu 202,或者多个附加卡可以连接到通信路径113,或者一个或更多个ppu 202可以集成到桥芯片中。多ppu系统中的ppu 202可彼此相同或不同。例如,不同的ppu 202可能具有不同数量的处理核和/或不同数量的pp存储器204。在存在多个ppu 202的实现方式中,这些ppu可以并行操作,以比采用单个ppu 202所可能的吞吐量更高的吞吐量处理数据。包括一个或更多个ppu 202的系统可以以各种配置和形式因素实现,包括但不限于台式机、笔记本电脑、手持式个人计算机或其他手持设备、服务器、工作站、游戏机、嵌入式系统等。
49.图3是根据一个实施例的图2的ppu 202中包括的gpc 208的框图。如图3所示,每个gpc 208包括用于处理任务的多个硬件单元。在一个实施例中,每个gpc 208包括管线管理器305、一个或更多个纹理处理集群(tpc)310、存储器管理单元(mmu)345、预光栅操作单元(prerop)355和工作分布交叉开关360。应当理解,图3的gpc 208可以包括代替图3中所示的单元或除了图3中所示的单元之外的其他硬件单元。
50.在操作中,gpc 208可以被配置为并行执行大量线程以执行图形、通用处理和/或计算操作。如本文所用,“线程”是指在特定输入数据集上执行的特定程序的实例。在一些实施例中,单指令、多数据(“simd”)指令发出技术用于支持大量线程的并行执行,而无需提供多个独立的指令单元。在其他实施例中,单指令、多线程(“simt”)技术用于使用被配置为向gpc 208中的一组处理引擎发出指令的通用指令单元来支持大量通常同步的线程的并行执行。与simd执行体系(其中所有处理引擎通常执行相同的指令)不同,simt执行允许不同的线程更容易通过给定程序遵循不同的执行路径。本领域普通技术人员应当认识到,simd处理体系表示simt处理体系的函数子集。
51.gpc 208的操作由管线管理器305控制。管线管理器305管理一个或更多个tpc 310的配置,用于处理分配给gpc 208的任务。管线管理器305还可以被配置为将从任务/工作单元207内的工作分配单元(未示出)接收的数据路由到gpc 208内的适当逻辑单元,例如路由
到一个或更多个tpc 310,用于由图元引擎320或sm 325处理。管线管理器305还可以被配置为通过指定tpc 310输出的目的地处理数据来控制工作分布交叉开关360。
52.每个tpc 310包括m管道控制器(mpc)315、图元引擎320、一个或更多个流式多处理器(sm)325、树遍历单元(ttu)330、渲染引擎(pbru)335、以及一个或更多个纹理单元340。
53.mpc 315控制tpc 310的操作,将从管线管理器305接收的数据路由到tpc 310中的适当单元。例如,可将与顶点相关联的数据路由到图元引擎320,所述图元引擎320经配置以从存储器204提取与所述顶点相关联的顶点属性。相比之下,可将与着色器程序相关联的数据发送到sm 325。
54.sm 325包括被配置成用于处理由多个线程表示的任务的一个或更多个可编程流式传输处理器。每个sm 325是多线程的并且被配置为并发地执行来自特定组线程的多个线程(例如,32个线程)。在一个实施例中,sm 325实现simd(单指令,多数据)架构,其中线程组(即,线程束)中的每个线程被配置成基于同一指令集来处理不同的数据集。线程组中的所有线程执行相同指令。在另一个实施例中,sm 325实现simt(单指令,多线程)架构,其中线程组中的每个线程被配置成基于同一指令集来处理不同的数据集,但是其中允许线程组中的各个线程在执行期间发散。换句话说,当调度用于所述线程组的指令以用于执行时,所述线程组中的一些线程可为活动的,借此执行所述指令,而所述线程组中的其他线程可为不活动的,借此执行无操作(nop)而非执行所述指令。
55.此外,每个sm 325包括一组函数执行单元(图3中未示出),如执行单元和加载存储单元。特定于任何函数执行单元的处理操作可以被管线化,这使得新的指令能够在先前的指令已经完成执行之前被发出用于执行。可提供给定sm 325内的函数执行单元的任何组合。在各种实施例中,函数执行单元可以被配置为支持多种不同的操作,包括整数和浮点算术(例如,加法和乘法)、比较操作、布尔操作(and、or、xor)、位移和各种代数函数的计算(例如,平面插值和三角函数、指数函数和对数函数)。有利地,同一函数执行单元可被配置为执行不同的操作。
56.尽管图3中未示出,但每个sm 325包含一级(l1)高速缓存或使用sm 325之外的对应l1高速缓存中的空间来支持由执行单元执行的加载和存储操作,等等。每个sm 325还可访问在ppu 202中的所有gpc 208之间共享的二级(l2)高速缓存(未示出)。l2高速缓存可以用于在线程之间传输数据。最后,sm 325还可访问片外“全局”存储器,片外“全局”存储器可包括pp存储器204和/或系统存储器104。应当理解,ppu 202外部的任何存储器可以用作全局存储器。此外,一点五级(l1.5)高速缓存(未示出)可以被包括在gpc 208内并且被配置成用于接收和保存由sm325经由存储器接口214从存储器请求的数据。这样的数据可以包括但不限于指令、统一数据和常数数据。在gpc 208内具有多个sm 325的实施例中,sm 325可有利地共享缓存在l1.5高速缓存中的共同指令和数据。
57.如图3中所示,sm 325耦合到树遍历单元(ttu)330、渲染引擎(pbru)335和一个或更多个纹理单元340。在一些实施例中,ttu 330、pbru 335或纹理单元340中的一个或更多个可以被包括在sm 325中,或者被实现在ppu 202内并且由一个或更多个gpc 208或由一个或更多个sm 325共享。
58.在一些实施例中,ttu 330被配置成用于执行树遍历操作。树遍历操作可用于例如计算机图形中的光线跟踪算法。然而,ttu 330可以针对一般树遍历操作进行优化,并且不
具体地限于光线追踪技术。
59.树遍历操作可以包括通过遍历树数据结构的节点执行的任何操作。树数据结构可以包括但不限于二叉树、八叉树、四叉树、k-d树、二进制空间分割(bsp)树和边界体积分级(bvh)树。在一个实施例中,树遍历操作包括用于将查询形状与树相交的多个指令。查询形状可以是例如光线、边界框、截头体、锥体、球体等。在各个实施例中,查询形状可以由查询数据结构指定。查询数据结构可以包括用于指定与树相交的查询形状的任何技术上可行的技术。例如,查询数据结构可以使用两个三坐标向量来指定光线的起始点和终止点。在另一示例中,查询数据结构可以使用六个32位浮点坐标指定轴对齐的边界框的六个平面。不同查询数据结构可包括用于指定查询形状的属性的任何数量的字段。
60.一种类型的树遍历操作(ttu 330可以针对其进行优化)是使光线与bvh数据结构相交,所述bvh数据结构表示表示3d场景或3d模型中的对象的几何图元中的每一者。ttu 330在光线追踪应用中可能特别有用,在光线追踪应用中,数百万或者甚至数十亿的光线与由bvh数据结构表示的3d模型的几何图元相交。
61.在一些实施例中,pbru 335是被配置成用于并行地执行光线追踪操作和其他串行处理任务的渲染引擎。串行处理任务是通常涉及不同输入和不同计算的任务,并且因此不能由sm 325并行处理。如下文进一步详细描述的,pbru 335包括多个mimd(多输入、多数据)处理核心,其中每个处理核心被配置为异步地处理不同光线或串行处理工作的其他单元。由此,多个处理核心可以主要并行地处理多条光线或其他组的串行处理任务。如图3所示,pbru 335耦合至sm 325和ttu 330两者。sm 325和/或ttu 330将光线处理或其他串行处理任务卸载到pbru 335以便由pbru 335更有效地执行。
62.作为示例,pbru 335可以被优化来执行的一种类型的光线追踪操作是材料着色。在识别3d场景中的光线与对象之间的相交部的位置之后,执行材料着色以确定在相交部位置处对应于对象的表面的颜色。材料着色计算基于针对对象的表面定义的多个不同材料属性。由此,可以针对具有不同材料属性的不同表面执行不同的材料着色计算。作为另一示例,pbru 335可以被优化以执行的第二类型的光线追踪操作是重要性采样。执行重要性采样以确定当光线与3d场景中的对象的表面相交时产生的辅助光线的方向。类似于材料着色,重要性采样计算基于针对对象的表面定义的多个不同材料属性,并且可以针对具有不同材料属性的不同表面执行不同的重要性采样计算。因而,pbru 335对于其中数百万或数十亿光线与3d场景中的对象的相交正被评估以分别产生对应颜色和方向的材料着色和重要性采样应用可能特别有用。
63.在一些实施例中,纹理单元340被配置成用于从存储器204加载纹理图(例如,纹理元素的2d阵列)并且对纹理图进行采样以产生采样的纹理值以供在由sm 325执行的着色器程序中使用。纹理单元340使用mip-map(即,具有不同细节层次的纹理图)实施纹理操作,例如滤波操作。在一个实施例中,每个tpc 310包括两个(2)纹理单元340。
64.每个tpc 310将经处理的任务传输至工作分布交叉开关330以便将该经处理的任务提供至另一gpc 208用于进一步处理或者经由交叉开关单元210将经处理的任务存储在l2高速缓存(未示出)、并行处理存储器204或系统存储器104中。另外,预光栅操作(prerop)单元325经配置以接收由tpc产生的数据,将数据引导到分区单元215内的一个或一个以上光栅操作(rop)单元,执行用于颜色混合的优化,组织像素颜色数据,以及执行地址转换。
65.将理解的是,在此描述的核心架构是示意性的并且变化和修改是可能的。除了别的以外,任何数目的处理单元(例如tpc 310、sm 325、ttu 330、pbru 335、纹理单元340或prerop单元355)可包括在gpc 208内。此外,如以上结合图2所描述的,ppu 202可以包括被配置为在函数上彼此类似的任何数量的gpc 208,使得执行行为不依赖于哪个gpc 208接收特定的处理任务。此外,每个gpc 208独立于ppu 202中的其他gpc 208运行以执行一个或更多个应用程序的任务。鉴于上述内容,本领域的普通技术人员将了解,图1-3中所描述的架构决不限制本发明的范围。
66.图4是根据一个实施例的包括在图3的tpc 310中的pbru 335的框图。pbru 335是被设计成并行地执行光线追踪操作和其他串行处理任务的mimd渲染引擎。如图4所示,pbru 335包括l0高速缓存410、核心调度器420、多个处理核心430以及多个管线440。
67.核心调度器420被配置成用于尤其从sm 325和ttu 330接收数据;将任务指派给处理核心430;将与所指派的任务相关联的数据发送至处理核心430;从处理核心430接收请求;将来自处理核心430的请求调度和分发到适当的单元,诸如到sm 325的管线440和l1高速缓存;从处理核心430接收经处理的数据;以及将经处理的数据发送到sm 325和ttu 330。
68.在一些实施例中,核心调度器420从sm 325和/或ttu 330接收多个光线。每条光线表示从光源向3d场景或3d环境内的方向延伸的路径。另外,对于每条光线,核心调度器420接收对应于有待在该光线上执行的光线追踪操作的指令集、或对应于该指令集的地址。例如,核心调度器420可以接收光线和一组材料着色指令,其对应于光线相交的3d场景或环境内的对象的表面。材料着色指令基于与对象的表面相关联的一个或更多个材料属性,并且当被执行时,生成与光线与对象的表面的交点相关联的颜色。作为另一示例,核心调度器420可以接收光线和与3d场景或环境内的该光线相交的对象的表面相对应的一组重要性采样指令。重要性采样指令还基于与对象的表面相关联的一个或更多个材料属性,并且当被执行时,针对通过光线与对象的表面的相交而产生的辅助光线生成方向。
69.核心调度器420将每个光线指派给多个处理核心430中的不同处理核心430。处理核心430包括多个mimd处理核心。每个处理核心430与其他处理核心430自主地操作。处理核心430各自针对其所指派的光线执行指令集以生成对应的一个或更多个结果集合。
70.每个处理核心430将其结果集合发送至核心调度器420。核心调度器420从处理核心430接收不同的结果集合,并将不同的结果集合发送回sm 325和/或ttu 330以供进一步处理。作为示例,处理核心430可以执行一组材料着色指令以生成对应于光线的颜色。处理核心430将该光线和颜色发送到核心调度器420,并且核心调度器420将该光线和颜色发送到sm 325和/或ttu 330。
71.处理核心430访问l0高速缓存410。如图4中所示,l0高速缓存410包含指令高速缓存412和纹理高速缓存414。指令高速缓存412存储由处理核心430执行的指令。每个处理核心430接收相应的指令集以执行并且在指令高速缓存412中高速缓存相应的指令集。在一些实施例中,每个指令集为固定大小,例如32字节。另外,指令集可以是将由处理核心430执行的较大指令集的子集。
72.在处理核心430完成执行指令集之后,处理核心430请求包括在该较大指令集中的下一组指令。在一些实施例中,处理核心430向核心调度器420发送请求。核心调度器420从sm 325的l1高速缓存请求下一组指令。sm 325将所请求的一组指令发送到核心调度器420。
在一些实施例中,当核心调度器420接收到所请求的指令集时,核心调度器420向处理核心430发送所请求的指令集。在一些实施例中,核心调度器420将所请求的指令集存储在指令高速缓存412中,并通知处理核心430所请求的指令集在指令高速缓存412中可用。
73.纹理高速缓存414存储由处理核心430在执行指令时使用的纹理块。纹理块包括纹理像素(纹理元素)的阵列,包含可以应用于3d对象的表面的颜色数据。在一些实施例中,纹理块包括使用一个或更多个纹理压缩技术生成的压缩纹理块。当执行一组指令时,处理核心430可以加载压缩的纹理块,在纹理高速缓存414中高速缓存压缩的纹理块,以及从压缩的纹理块中提取或解码一个或更多个纹理元素。高速缓存的纹理块可以被需要相同纹理块的其他处理核心430访问。
74.在一些实施例中,如果处理核心430要求不在l0高速缓存410中的纹理块,则处理核心430向核心调度器420发送请求。核心调度器420从sm 325的l1高速缓存请求纹理块。sm 325将所请求的纹理块发送到核心调度器420。在一些实施例中,当核心调度器420接收到所请求的纹理块时,核心调度器420将所请求的纹理块发送到处理核心430。在一些实施例中,核心调度器420将所请求的纹理块存储到纹理高速缓存414,并通知处理核心430所请求的纹理块在纹理高速缓存414中是可用的。
75.当处理核心430发送对纹理块或指令集的请求时,纹理块或指令集可以不在sm 325的l1高速缓存中,即,高速缓存未命中。如果所请求的纹理块或指令集不在l1高速缓存中,则处理核心430可以等待很长时间,例如数百个时钟周期,以使所请求的纹理块或指令集被发送回。在一些实施例中,在等待阈值数量的时钟周期之后,处理核心430自己发出光线停止指令。在一些实施例中,核心调度器420检测到高速缓存未命中发生,或者由sm 325通知高速缓存未命中发生,并且向处理核心430发出光线停止指令。响应于接收到光线停止指令,处理核心430停止处理该光线并且将该光线发送到核心调度器420。
76.在一些实施例中,发送光线包括发送由处理核心430执行的最新指令集的地址、由处理核心430执行的最后指令的最新指令集内的索引、以及与该光线相关联的堆栈。核心调度器420将该光线发送到ttu 330。在一些实施例中,ttu 330存储临时光线阵列。ttu 330接收光线并将光线存储在临时阵列中。当所请求的数据在sm 325的l1高速缓存中可用时,ttu 330将该光线发送回pbru 335。由于光线包括针对光线执行的最新指令集的地址、最后执行指令的索引和堆栈,因此当光线被发送回pbru 335并被指派给处理核心430时,处理核心430可以在索引所指示的位置处恢复执行最新指令集。由此,处理核心430可以被指派另一条光线以在等待所请求的数据时工作,并且在下一组指令或纹理块变得可用之后重试对下一组指令或纹理块的请求。
77.处理核心430共享对多个管线440的访问。每个管线440是对应于特定固定功能的cisc(复杂指令集计算机)管线。每一管线440经配置以接收与对应固定功能相关联的输入且对输入执行对应固定功能以产生对应输出。在一些实施例中,每个固定功能是与评估材料图有关的函数,诸如确定纹理块的地址、从纹理块提取纹理元素、或执行诸如反射率、镜面反射、光泽等的计算。
78.如图4所示,管线440包括一个或更多个astc_a(地址)管线442、一个或更多个astc_dp(数据路径)管线444、一个或更多个ggx管线446、一个或更多个oren-nayar管线448、一个或更多个施利克菲涅尔(schlick fresnel)管线450、一个或更多个光泽(sheen)
管线452、一个或更多个次表面(subsurface)管线454、以及一个或更多个基于单元的照明管线456。尽管图4中说明特定类型的固定功能管线,但管线440可包括对应于任何类型的固定功能的任何数目和/或类型的管线。
79.在一些实施例中,固定功能对应于多个管线440,包含执行固定功能以产生用于材料着色(例如,颜色)的一个或更多个输出的一个或更多个第一管线440和执行固定功能以产生用于重要性采样(例如,辅助光线的方向)的一个或更多个输出的一个或更多个第二管线440。
80.在指令集的执行期间,处理核心430确定指令对应于与管线440相关联的固定功能,并且向相应的管线440发送请求以执行该指令。在一些实施例中,将请求发送到对应管线440包括将固定功能的一个或更多个输入发送到对应管线440。处理核心430将针对固定功能的一个或更多个输入弹出其堆栈,并且将该一个或更多个输入和针对相应管线440的请求发送到核心调度器420。核心调度器420向管线440发送请求和一个或更多个输入。管线440基于该一个或更多个输入生成一个或更多个输出,并将该一个或更多个输出发送给核心调度器420。核心调度器420确定该一个或更多个输出与发送该请求的处理核心430相关联,并且将该一个或更多个输出发送回处理核心430。处理核心430将一个或更多个输出推送到其栈的顶部,并且继续其指令集中的下一指令。
81.作为示例,处理核心430可以执行包括用于确定纹理块的地址的指令的指令集。处理核心430确定用于确定纹理块的地址的指令对应于astc_a管线442。响应于确定指令对应于astc_a管线442,处理核心430将与确定纹理块的地址相关联的一个或更多个输入发送到核心调度器420,核心调度器420将该一个或更多个输入发送到astc_a管线442。astc_a管线442基于一个或更多个输入来生成纹理块的地址,并将纹理块的地址发送到核心调度器420。核心调度器420从astc_a管线442接收地址,确定所述地址与发送对astc_a管线442的请求的处理核心430相关联且将所述地址发送到处理核心430。处理核心430将纹理块的地址推送到其堆栈上。
82.在一些实施例中,管线440还被配置成直接从sm 325接收请求。在执行其自身的一组指令时,sm 325可确定指令可利用管线440中的一者。sm 325将用于对应于管线440的固定功能的一个或更多个输入发送到管线440以同步执行。管线440基于该一个或更多个输入生成一个或更多个输出,并将该一个或更多个输出发送给sm 325。在一些实施例中,管线440将一个或更多个输出直接发送到发出请求的sm 325。在一些实施例中,管线440向核心调度器420发送一个或更多个输出。核心调度器420确定该一个或更多个输出与sm 325相关联,并将该一个或更多个输出发送给sm 325。
83.在一些实施例中,核心调度器420从多个处理核心430接收对管线440的多个请求。核心调度器420确定来自每个处理核心430的请求何时可以被发送到适当的管线440。在一些实施例中,核心调度器420每个时钟周期向每个管线440发送一个请求,例如,一个或更多个astc_a管线442、一个或更多个astc_dp管线444、一个或更多个ggx管线446、一个或更多个oren-nayar管线448、一个或更多个schlick fresnel管线450、一个或更多个光泽管线452、一个或更多个次表面管线454和一个或更多个基于单元的照明管线456中的每一个。核心调度器420可以实现用于选择要发送到管线440的特定请求的任何技术上可行的手段,诸如循环调度算法。
84.在一些实施例中,来自sm 325的对于管线440的请求优先于来自处理核心430的请求。当sm 325向管线440发送请求时,核心调度器420被通知管线440已经从sm 325接收到请求。响应于接收到通知,核心调度器420不从处理核心430向管线440发送该时钟周期的请求。
85.尽管在此参考材料着色和重要性采样操作描述了实施例,pbru 335可以用于执行其他光线追踪操作和/或其他类型的串行处理任务。另外,虽然在此参考发送和接收光线来描述实施例,但是可以在pbru 335、sm 325和ttu 330之间以及在pbru 335的元素之间传输任何类型的技术上可行的数据。
86.使用渲染引擎的材料着色
87.当渲染3d场景的二维图像时,生成源自特定光源并且在3d场景中朝不同方向延伸的多个光线。对于每一光线,识别所述光线与3d场景中的对象的表面之间的交叉点。在所述交叉点处执行材料着色以确定对应于所述交叉点处的所述对象的所述表面的颜色。由材料着色产生的颜色表示当被来自光源的光(例如由光线表示的光束)撞击时对象表面的颜色。
88.使用指示光如何与对象表面相互作用的材料属性(如抛光、反射率、扩散行为、半透明度、透明度等)的不同层来对对象表面进行建模。每个材料属性是使用一个或更多个计算和/或函数来定义的,这些计算和/或函数是基于由一个或更多个其他材料属性所产生的一个或更多个变量和/或一个或更多个值来评估的。
89.材料图可以用于表示与对象表面相关联的不同材料属性以及不同材料属性之间的关系。当执行材料着色时,基于光线的性质(诸如光线的到达方向和光线在交叉点处的宽度)以及对象的表面的性质(诸如表面法线、着色法线、归一化切线和/或对应于交叉点的uv坐标)来评估不同材料性质的计算和/或函数。如下文在图14-16中更详细地描述的,为了使用pbru 335来评估材料图,材料图被编译成可以由pbru 335执行的一组材料着色指令。
90.图5a是示出了根据一个实施例的用于使用pbru 335执行光线的材料着色的数据流的框图。
91.如图5a所示,sm 325向ttu 330发送光线510用于处理。ttu 330执行一个或更多个树遍历操作以确定光线510与3d场景内的对象的表面之间的交叉点。
92.ttu 330向pbru 335发送光线510用于对光线510执行材料着色。在一些实施例中,光线510包括用于标识光线510的光线标识符。通常,光线追踪涉及识别数百、数千或者甚至数百万光线与3d场景中的对象的交集。光线标识符提供了一种在光线由ttu 330和pbru 335处理时跟踪和识别该光线的方式。在一些实施例中,ttu 330计算与光线510相关联的一个或更多个变量的值,诸如对应于交叉点的uv坐标、交叉点处的uv覆盖的分数、对象表面的法向量、用于对对象表面着色的法向量、光线510的方向、入射光的方向等中的一个或更多个。ttu 330包括在向pbru 335发送光线510时的一个或更多个变量值。在一些实施例中,当光线510从sm 325发送到ttu 330时,一个或更多个变量的值由sm 325计算并且包括在光线510中。ttu 330可以包括在向pbru 335发送光线510时由sm 325计算的变量值中的一个或更多个。
93.在一些实施例中,ttu 330基于交叉点来确定对应于在该交叉点处的对象的表面的材料着色指令520的集合。材料着色指令520的集合包括字节代码指令,当由pbru 335执行时,所述字节代码指令评估在对象表面的材料图中定义的不同材料属性,以生成对应于
光线510和交叉点的颜色。在一些实施例中,交叉点与指示对应于交叉点处的对象的表面的材料的数据和/或指示材料着色指令520的集合的地址的数据相关联。ttu 330基于与交叉点相关联的数据来确定材料着色指令520的集合。
94.在一些实施例中,ttu 330将该材料着色指令520的集合或其一部分与光线510一起发送至pbru 335。在一些实施例中,ttu 330发送对应于该材料着色指令520的集合的地址。另外,ttu 330可以发送指示在材料着色指令520的集合内执行的下一指令的位置的索引值。例如,ttu 330可以发送索引值0,指示pbru 335应该在材料着色指令520的集合中的第一指令处开始执行。
95.在一些实施例中,发送光线510包括发送与光线510相对应的光线数据结构。光线数据结构存储光线标识符、材料着色指令520的集合的地址、材料着色指令520的集合内的起始指令的索引、以及包括与光线相关联的一个或更多个变量的堆栈。
96.pbru 335接收光线510和材料着色指令520的集合,并且执行材料着色指令520的集合以生成与光线510相关联的颜色530。如图5a所示,pbru 335将光线510和颜色530发送到ttu 330用于进一步处理。在一些实施例中,pbru 335将颜色530存储在与光线510相关联的堆栈中。将光线510和颜色530发送到ttu 330包括发送与光线510相关联的堆栈。ttu 330可以从堆叠读取颜色530的值。在一些实施例中,在接收到光线510和颜色530之后,ttu 330将光线510和颜色530发送回sm 325以供进一步处理。
97.图5b是示出根据一个实施例的用于使用pbru 335来执行光线的材料着色的数据流的框图。
98.如图5b所示,sm 325向ttu 330发送光线510用于处理。ttu 330执行一个或更多个树遍历操作以确定光线510与3d场景内的对象的表面之间的交叉点540。不是将光线510发送到pbru 335,ttu 330将光线510和交叉点540发送回sm 325。sm 325然后将光线510发送到pbru 335以便对光线510执行材料着色。在一些实施例中,sm 325执行一个或更多个操作以确定交叉点540,而不是将光线510发送到ttu 330以供处理。
99.在一些实施例中,光线510包括用于识别光线510的光线标识符。在一些实施例中,ttu 330计算与光线510相关联的一个或更多个变量的值,诸如对应于交叉点540的uv坐标、交叉点540处的uv覆盖的分数、对象表面的法向量、用于遮蔽对象表面的法向量、光线510的方向、入射光的方向等中的一个或更多个。ttu 330在向sm 325发送光线510时包括该一个或更多个变量值,并且sm 325在向pbru 335发送光线510时包括该一个或更多个变量值。在一些实施例中,sm 325在确定交叉点540之后或者在从ttu 330接收到光线510和交叉点540之后计算与光线510相关联的一个或更多个变量的值。sm 325在向pbru 335发送光线510时包括该一个或更多个变量值。
100.在一些实施例中,sm 325基于交叉点540确定与在交叉点540处的对象的表面相对应的材料着色指令520的集合。在一些实施例中,sm 325将该材料着色指令520的集合或其一部分与光线510一起发送到pbru 335。在一些实施例中,sm 325发送对应于材料着色指令520的集合的地址。另外,sm 325可以发送指示在材料着色指令520的集合内执行的下一指令的位置的索引值。例如,sm 325可以发送索引值0,指示pbru 335应该在材料着色指令520集合中的第一指令处开始执行。
101.在一些实施例中,发送光线510包括发送与光线510相对应的光线数据结构。光线
数据结构存储光线标识符、材料着色指令520的集合的地址、材料着色指令520集合内的起始指令的索引、以及包括与光线510相关联的一个或更多个变量的堆栈。
102.pbru 335接收光线510和材料着色指令520的集合,并且执行材料着色指令520的集合以生成与光线510相关联的颜色530。如图5b所示,pbru 335将光线510和颜色530发送到sm 325用于进一步处理。在一些实施例中,pbru 335将颜色530存储在与光线510相关联的堆栈中。向sm 325发送光线510和颜色530包括发送与光线510相关联的堆栈。sm 325可以从堆栈读取颜色530的值。
103.将理解的是,在此描述的操作和数据流是说明性的,并且变化和修改是可能的。例如,sm 325或ttu 330可以确定光线与3d场景中的对象之间的交叉点,计算与该光线相关联的变量值,确定对应于该交叉点的材料着色指令的集合,将该光线发射到pbru 335,和/或将该材料着色指令的集合发射到pbru 335。类似地,pbru 335可以向sm 325或ttu 330发送一个或更多个材料着色结果,而不管哪一个光线向pbru 335发送该光线。
104.图6是根据一个实施例的用于使用pbru对光线执行材料着色的方法步骤的流程图。虽然结合图1-4的系统来描述方法步骤,但所属领域的技术人员将理解,经配置以按任何次序执行所述方法步骤的任何系统落入本公开的范围内。
105.在步骤602中,pbru的核心调度器从sm或ttu接收光线。例如,核心调度器420从sm 325或ttu 330接收光线510。在一些实施例中,核心调度器420还从sm 325或ttu 330接收材料着色指令的集合。核心调度器420将该材料着色指令的集合存储到指令高速缓存412。在一些实施例中,核心调度器420从sm 325或ttu 330接收对应于材料着色指令的集合的地址。
106.在一些实施例中,核心调度器420接收表示光线510的光线数据结构。光线数据结构包括例如对应于光线510的光线标识符、材料着色指令集合的地址、材料着色指令520集合内的起始指令的索引、以及包括与光线510相关联的一个或更多个变量的堆栈。
107.在步骤604中,该核心调度器将该光线指派给处理核心。例如,核心调度器420向多个处理核心430中的特定处理核心430指派光线510。在一些实施例中,核心调度器420确定哪些处理核心430不具有指派的光线并且选择当前未指派任何光线的处理核心430。在一些实施例中,每个处理核心430可以处理多条光线。核心调度器420为每个处理核心430确定指派给每个核心的光线的数目,并且选择指派了最低光线数目的处理核心430。
108.在步骤606中,处理核心基于该光线执行该材料着色指令的集合以生成颜色。例如,处理核心430基于光线510执行该材料着色指令520的集合以生成颜色530。
109.图7是根据一个实施例的用于执行材料着色指令集合的方法步骤的流程图。虽然结合图1-4的系统来描述方法步骤,但所属领域的技术人员将理解,经配置以按任何次序执行所述方法步骤的任何系统落入本公开的范围内。
110.在步骤702中,pbru的处理核心从核心调度器接收光线。例如,处理核心430接收来自核心调度器420的光线510。在一些实施例中,接收光线510包括接收对应于光线510的光线标识符、对应于材料着色指令520的集合的地址、该材料着色指令的集合内的起始指令的索引、以及包括与光线510相关联的一个或更多个变量的堆栈。
111.在步骤704中,处理核心430请求下一个材料着色指令集合。在一些实施例中,处理核心430向核心调度器420发送对于与光线510一起接收的指令地址处的材料着色指令集合
的请求。核心调度器420接收该请求并且在指令地址处从sm 325的l1高速缓存读取或检索该指令集合。
112.处理核心430等待从核心调度器420接收该材料着色指令集合或从核心调度器420接收该材料着色指令集合在指令高速缓存412中可用的指示。在一些实施例中,将多个光线指派给处理核心430。处理核心430可以开始处理不同的光线,同时等待接收该材料着色指令集合或接收该材料着色指令集合可用的指示。在接收到要执行的下一个材料着色指令集合或接收到下一个材料着色指令集合在指令高速缓存412中的指示之后,该方法继续到步骤706。
113.在一些实施例中,如果核心调度器420随光线510接收到一组材料着色指令,则核心调度器420将该材料着色指令集合存储在指令高速缓存412中或者将该材料着色指令集合与光线510一起发送到处理核心430。处理核心430可以确定下一个材料着色指令集合可用并且在不请求任何附加指令的情况下前进到步骤706。
114.在步骤706中,处理核心430对该材料着色指令集合中的下一个指令进行解码。此外,处理核心430对跟随下一指令的任何立即数进行解码。在一些实施例中,处理核心430基于指示材料着色指令的集合内的下一指令的索引值来确定材料着色指令的集合中的下一指令。处理核心430在由索引值指示的材料着色指令的集合内的位置处解码指令。处理核心430根据下一个指令执行一个或更多个不同的动作。
115.如果下一指令是光线停止指令,则在步骤708中,处理核心停止对该光线执行材料着色指令并且将该光线发送到核心调度器。例如,处理核心430向核心调度器420发送光线510。如果处理核心430生成颜色530,则处理核心430还将颜色530发送到核心调度器420。
116.在一些实施例中,向核心调度器420发送光线510包括发送光线510的堆栈。如果处理核心430生成颜色530,则颜色530被存储在光线510的堆栈的顶部。如果处理核心430尚未生成颜色530,则该堆栈反映已经对光线510完成的计算。
117.在一些实施例中,发送光线510包括发送表示光线510的更新后的光线数据结构。更新后的光线数据结构包括例如与光线510相对应的光线标识符;处理核心430执行的最新材料着色指令集合的地址;由处理核心430执行的最新材料着色指令集合内的最后指令的索引;以及与光线510相关联的堆栈。
118.如果下一指令是可以由处理核本地执行的指令,则在步骤710中,处理核心在本地执行指令,而不涉及核心调度器。可在本地执行的指令包括例如堆栈运算(诸如推、加载和存储)和固定点算术(诸如加法、乘法和线性插值(lerp))。在本地执行指令之后,处理核心前进到下一指令(如果可用的话)。
119.如果下一指令不是可以由处理核心在本地执行的指令,那么在步骤712中,处理核心向核心调度器发送请求。
120.作为示例,如果指令对应于固定功能,诸如纹理地址、纹理数据路径、ggx、oren-nayar、schlick-fresnel、sheen等,则处理核心430向核心调度器420发送对对应管线440的请求。向核心调度器420发送请求可以包括将固定功能的一个或更多个变元弹出堆栈外,并且将一个或更多个变元与请求包括在一起。核心调度器420将请求和一个或更多个变元发送到对应的管线440。管线440接收一个或更多个变元作为一个或更多个输入,并且对一个或更多个输入执行对应的固定功能以生成固定功能的一个或更多个输出。管线440将一个
或更多个输出传输回核心调度器420,并且核心调度器420将一个或更多个输出发送到处理核心430。
121.作为另一个示例,如果指令是读取纹理块,则处理核心430向核心调度器420发送读取纹理块的请求。向核心调度器420发送请求可以包括从栈上弹出纹理块的地址并且在请求中包括纹理块的地址。核心调度器420在指定的地址从sm 325的l1高速缓存请求纹理块。在一些实施例中,核心调度器420将纹理块发送到处理核心430。在一些实施例中,核心调度器420将纹理块高速缓存在纹理高速缓存414中并且向处理核心430发送纹理块在l0高速缓存410中可用的指示。
122.在一些实施例中,发送请求包括发送与请求一起的光线510相对应的标识符。在一些实施例中,对应于光线510的标识符包括对应于光线510的光线标识符。在一些实施例中,对应于光线510的标识符包括对应于处理核心430的标识符。如果多条光线被指派给处理核心430,则该标识符还包括索引值,该索引值与指派给处理核心430的多条光线内的光线510的索引相对应。当该一个或更多个输出被传输至核心调度器420时,该标识符与该一个或更多个输出一起被包括。核心调度器420使用该标识符来确定一个或更多个输出应当被发送到处理核心430。
123.在将请求发送至核心调度器420之后,处理核心430等待,直到在步骤714,处理核心430从核心调度器420接收到一个或更多个结果。在一些实施例中,处理核心430被指派了多条光线。处理核心430可以在等待接收一个或更多个结果的同时开始处理不同的光线,并且在从核心调度器420接收一个或更多个结果之后返回到步骤714。如果一个或更多个结果包括一个或更多个值,诸如由管线440生成的一个或更多个值,则处理核心430将一个或更多个值推送到堆栈上。如果一个或更多个结果包括纹理块,则处理核心430在纹理高速缓存414中高速缓存纹理块。在从核心调度器420接收到一个或更多个结果之后,处理核心430前进到下一指令(如果可用的话)。
124.如果在该指令集合中没有剩余指令但处理核心430尚未到达光线停止指令并且停止执行针对该光线的指令,则该方法返回步骤704,在该步骤中处理核心430请求执行下一个指令集合。处理核心430请求与光线510一起接收的指令地址处的下一个材料着色指令集合,增加被执行的最后一个指令的索引。
125.如果在该指令集合中剩余有指令,则该方法返回步骤706,在该步骤中,处理核心430解码该指令集合中的下一个指令。在一些实施例中,光线510包括指示该指令集合内的下一指令的索引值,并且该索引值在返回至步骤706之前递增。
126.返回图6,在处理核心完成执行该材料着色指令集合之后,在步骤608,核心调度器从处理核心接收光线和颜色。例如,核心调度器420从处理核心430接收光线510和颜色530。在一些实施例中,核心调度器420接收来自处理核心430的光线510的堆栈,其中颜色530被存储在堆栈的顶部。在一些实施例中,核心调度器420从处理核心430接收表示光线510的更新后的光线数据结构。更新后的光线数据结构包括例如与光线510相对应的光线标识符;处理核心430执行的最新材料着色指令集合的地址;由处理核心430执行的最新材料着色指令集合内的最后指令的索引;以及与光线510相关联的堆栈。
127.在步骤610中,核心调度器将光线和颜色发送到sm和/或ttu以供进一步处理。例如,核心调度器420向sm 325和/或ttu 330发送光线510和颜色530。
128.在一些实施例中,处理核心430在生成颜色530之前停止执行光线510的指令。例如,如下文详细论述,如果编译器确定函数不能由pbru 335执行,那么编译器可产生对应于函数的可由sm 325执行的指令集合,且在材料着色指令的集合中产生光线停止指令。当sm 325接收到光线510时,sm 325执行对应于该函数的该指令集合。例如,sm 325可以基于存储在光线510的堆栈中的值来执行用户定义的函数。在一些实施例中,在sm 325完成执行对应于函数的指令集合之后,sm 325可以将结果推送到光线510的堆栈上,递增要执行的下一指令的索引值,并且将光线510发送回pbru 335。核心调度器420接收光线510并且将光线510指派给处理核心430以继续执行。
129.在操作中,核心调度器420从sm 325和/或ttu 330接收多条光线。核心调度器420可以同时接收多条光线,并且还可以随时间继续接收附加光线。对于核心调度器420接收的每条光线,重复上面图6和7中所讨论的步骤。因此,在任何给定时间,多个处理核心430中的每个处理核心可以针对所指派的光线执行相应的材料着色指令集合。
130.利用固定功能管线
131.在一些实施例中,除了向pbru 335发送任务以供pbru 335异步处理之外,sm 325可以直接向pbru 335的管线440发送同步请求。每个管线440对应于特定的固定功能。每一固定功能对应于可由pbru 335执行的不同字节代码指令。另外,每个固定功能可对应于可由sm 325执行的不同指令。当sm 325执行对应于管线440的指令时,sm 325可向管线440发送请求。在一些实施例中,发送请求包含从sm 325的寄存器读取固定功能的一个或更多个变元,且将一个或更多个变元与请求包括在一起。例如,如果sm 325正在执行需要计算光泽的操作,则sm 325可以向光泽管线452发送请求并且使光泽管线452执行计算。sm 325等待将由光泽管线452返回的结果。光泽管线452处理来自sm 325的请求,并将结果发送回sm 325。sm 325接收结果并利用从光泽管线452接收的结果恢复操作。在一些实施例中,向sm 325指派多个线程组,并且sm 325可以切换到执行用于不同线程组的指令,同时等待将由管线440返回的结果。
132.在一些实施例中,来自sm 325的请求的优先级高于来自pbru 335的处理核心430的请求的优先级。管线440在接收和处理来自处理核心430的请求之前接收并处理来自sm 325的请求。在一些实施例中,如果sm 325向管线440发送请求并且核心调度器420从处理核心430接收对相同管线440的请求,则核心调度器420在从处理核心430向管线440发送请求之前等待。
133.在一些实施例中,sm 325耦合到调度器(未示出),该调度器将来自sm 325的请求调度到管线440。如果多个sm 325具有对同一管线440的请求,那么调度器确定所述多个sm 325将请求发送到管线440的次序。
134.图8是示出了根据一个实施例的用于使用管线440来执行sm 325的操作的数据流的框图。
135.如图8所示,sm 325向管线440发送管线请求810(1)。管线请求810(1)包括对应于由管线440实施的固定功能的一个或更多个输入。
136.核心调度器420从处理核心430接收管线请求810(2)。管线请求810(2)也是针对管线440的。来自sm 325的管线请求810(1)的优先级高于来自处理核心430的管线请求810(2)的优先级。
137.在一些实施例中,当sm 325向管线440发送管线请求810(1)时,向核心调度器420通知管线440已经从sm 325接收到请求。例如,sm 325和/或管线440可以向核心调度器420发送信号或其他指示。作为另一实例,核心调度器420可监视管线440以确定管线440何时接收到请求。在一些实施例中,当sm 325向管线440发送请求时,sm 325还向管线440发送有效信号。核心调度器420监视管线并且如果有效信号被设置为1,则核心调度器420确定请求被发送到管线440。响应于被通知管线440已经从sm 325接收到请求,核心调度器420在向管线440发送管线请求810(2)之前等待预定时间量,例如一个时钟周期。
138.在一些实施例中,如果来自sm 325的附加请求由管线440接收,则这些附加请求还受到高于来自处理核心430的请求的优先级。核心调度器420继续等待以将管线请求810(2)发送到管线440,直到sm 325没有发送请求到管线440的时钟周期。在一些实施例中,sm 325可调度管线请求,使得可将来自处理核心430的请求周期性地发送到管线440。例如,sm 325可等待至管线440的每一请求之间的时间段。
139.管线440对包括在管线请求810(1)中的一个或更多个输入执行固定功能以生成管线输出820(1)。如图8中所示,管线440将管线输出820(1)发送到核心调度器420。核心调度器420确定管线输出820(1)与sm 325相关联且将管线输出820(1)发送到sm 325。在一些实施例中,每个管线输出包括标识符或与标识符相关联,所述标识符诸如为光线标识符、与处理核心430相关联的标识符、或与sm 325相关联的标识符。核心调度器420基于与管线输出820(1)一起包括或与管线输出820(1)相关联的标识符来确定管线输出820(1)与sm 325相关联。例如,与处理核心430相关联的管线输出可以包括或关联于光线标识符或对应于处理核心430的标识符,而与sm 325相关联的管线输出可以包括或关联于与光线标识符或处理核心标识符不同类型或格式的标识符,或者可以根本不包括或关联于任何标识符。
140.在一些实施例中,不是将管线输出820(1)发送到核心调度器420,管线440直接将管线输出820(1)发送回sm 325。在一些实施例中,管线440将管线输出820(1)写到sm 325的寄存器堆。
141.管线440对包括在管线请求810(2)中的一个或更多个输入执行固定功能以生成管线输出820(2)。管线440将管线输出820(2)发送到核心调度器420。核心调度器420确定管线输出820(2)与处理核心430相关联,且将管线输出820(2)发送到处理核心430。在一些实施例中,每个管线输出包括标识符或与标识符相关联,所述标识符诸如为光线标识符、与处理核心430相关联的标识符、或与sm 325相关联的标识符。核心调度器420基于与管线输出820(2)一起包括或与管线输出820(2)相关联的标识符来确定管线输出820(2)与处理核心430相关联。例如,管线输出820(2)可包括或关联于特定光线标识符,并且核心调度器420确定对应于该特定光线标识符的光线被指派给处理核心430。作为另一实例,管线输出820(2)可包含处理核心标识符或与处理核心标识符相关联,且核心调度器420确定处理核心标识符对应于处理核心430。
142.图9是根据一个实施例的用于使用pbru的管线来执行sm的操作的方法步骤的流程图。虽然结合图1-4的系统来描述方法步骤,但所属领域的技术人员将理解,经配置以按任何次序执行所述方法步骤的任何系统落入本公开的范围内。
143.在步骤902中,管线440接收来自sm 325的请求。管线440对应于特定固定功能,并且来自sm 325的请求包括对应于特定固定功能的一个或更多个第一输入。
144.在步骤904中,核心调度器420被通知管线440从sm 325接收到请求。在一些实施例中,sm 325和/或管线440向核心调度器420发送信号或其他通知,以指示管线440从sm 325接收到请求。在一些实施例中,核心调度器420监视管线440以检测管线440何时接收到请求。在一些实施例中,当sm 325向管线440发送请求时,sm 325还向管线440发送有效信号。核心调度器420监视管线并且如果有效信号被设置为1,则核心调度器420确定请求被发送到管线440。在确定管线440从sm 325接收到请求之后,如果核心调度器420从处理核心430接收到对相同管线440的请求,则核心调度器420将等待将请求发送到管线440。
145.在步骤906中,管线440接收来自处理核心430的请求。来自处理核心430的请求包括对应于固定功能的一个或更多个第二输入。在一些实施例中,经由核心调度器420接收来自处理核心430的请求。如以上所讨论的,核心调度器420从处理核心430接收请求并确定何时从处理核心430向管线440发送请求。
146.在步骤908,管线440处理来自sm 325的请求,以生成一个或更多个结果的第一集合。处理来自sm 325的请求包括对包括在来自sm 325的请求中的一个或更多个第一输入执行固定功能。
147.在步骤910,管线440向sm 325发送一个或更多个结果的第一集合。在一些实施例中,管线440将结果的第一集合发送到核心调度器420。核心调度器420确定结果的第一集合与sm 325相关联,并将结果的第一集合发送给sm 325。在一些实施例中,管线440将结果的第一集合直接发送到sm 325。在一些实施例中,管线440将结果的第一集合写到sm 325的寄存器堆。
148.在步骤912,管线440处理来自处理核心430的请求以生成一个或更多个结果的第二集合。处理来自处理核心430的请求包括对包括在来自处理核心430的请求中的一个或更多个第二输入执行固定功能。
149.在步骤914,管线440将一个或更多个结果的第二集合发送至处理核心430。在一些实施例中,管线440向核心调度器420发送结果的第二集合。核心调度器420确定结果的第二集合与处理核心430相关联并且向处理核心430发送结果的第二集合。在一些实施例中,管线440直接将结果的第二集合传输到处理核心430。
150.从纹理块提取单个纹理元素
151.评估对象表面的不同材料属性包括对针对材料属性定义的纹理进行采样并且基于所采样的纹理执行一个或更多个计算。对象表面的纹理存储为多个纹理块。每个纹理块包括纹理元素的阵列,其包含可以被应用到对象表面的颜色数据。在一些实施例中,每个纹理块对应于特定mip级别,其中每个mip级别对应于纹理的不同大小和分辨率。
152.为了减少多个纹理块所需的存储量和存储空间,使用一个或更多个纹理压缩技术来压缩每个纹理块。在一些实施例中,使用astc(自适应可缩放纹理压缩)压缩并存储每个纹理块。当需要纹理块中包含的纹理元素的值时,纹理块被解压缩。通常,被配置成加载和处理纹理块的执行单元,诸如纹理单元340,解压缩整个压缩纹理块以获得包含在压缩纹理块中的纹理元素的值。然而,因为由pbru 325执行的操作(例如,材料着色)是基于单个交叉点的,所以操作通常仅需要来自单个纹理元素的值。
153.图10a-c是示出了根据一个实施例的使用pbru 335从压缩纹理块中提取单个纹理元素的数据流的框图。虽然本文关于astc格式的经压缩纹理块描述了实例,但可使用任何
经压缩或未经压缩纹理块格式。提取单个纹理元素的特定步骤可根据特定纹理块格式而改变。另外,由于读取操作的最小粒度,围绕单个纹理元素的一个或更多个纹理元素可以被读取,但是一个或更多个纹理元素可以在被读取之后立即被丢弃。
154.如图10a所示,处理核心430向核心调度器420发送地址请求1010。处理核心430响应于执行纹理地址指令而发送地址请求1010。在一些实施例中,处理核心430从其堆栈弹出一个或更多个值并且将该一个或更多个值包括在地址请求1010中。一个或更多个值对应于在确定纹理块地址和/或纹理元素位置时使用的变量,诸如对应于光线和对象表面的交点和在该交点处的uv覆盖的分数的uv坐标。
155.核心调度器420将地址请求1010发送到纹理地址管线,例如astc_a管线442。astc_a管线442被配置为执行固定功能,该固定功能基于地址请求1010中包括的一个或更多个值来确定目标纹理块的块地址1020。在一些实施例中,astc_a管线442还可被配置成基于地址请求1010中包括的一个或更多个值来确定目标纹理元素在纹理块内的坐标。在一些实施例中,一个或更多个其他管线440被配置成确定目标纹理元素的坐标。
156.astc_a管线442将块地址1020发送到核心调度器420。在一些实施例中,astc_a管线442还向核心调度器420发送纹理元素的坐标。
157.核心调度器420从astc_a管线442接收块地址1020。此外,核心调度器420还可从astc_a管线442接收纹理元素坐标。核心调度器420确定块地址1020和纹理元素坐标与处理核心430相关联,并且将块地址1020和纹理元素坐标发送到处理核心430。在一些实施例中,在接收到块地址1020和纹理元素坐标之后,处理核心430将块地址1020和纹理元素坐标推送到其堆栈上。
158.在处理核心430接收到块地址1020之后,处理核心430继续执行其所指派的指令集中的下一个指令。当处理核心430执行纹理读取指令时,处理核心430发送对位于块地址1020处的纹理块1040的请求。
159.如果纹理块1040被高速缓存在l0高速缓存410的纹理高速缓存414中,则处理核心430跳过纹理读取指令并且继续执行其所指派的指令集中的下一指令。
160.如果纹理块1040不在纹理高速缓存414中,则处理核心430从sm 325的l1高速缓存请求纹理块1040。如图10b所示,处理核心430向核心调度器420发送块请求1030。在一些实施例中,当处理核心430接收块地址1020时,处理核心430将块地址1020推送到其堆栈上。当执行纹理读取指令时,处理核心430从其堆栈弹出块地址1020,并将块地址1020与块请求1030包括在一起。
161.核心调度器420向sm 325发送块请求1030和块地址1020。响应于接收到块请求1030,sm 325将存储在块地址1020处的纹理块1040发送到核心调度器420。核心调度器420接收纹理块1040并确定纹理块1040与处理核心430相关联。如图10b中所示,核心调度器420将纹理块1040发送到处理核心430。处理核心430将纹理块1040存储在l0高速缓存410的纹理高速缓存414中,并且然后继续执行其所指派的指令集中的下一个指令。在一些实施例中,核心调度器420将纹理块1040存储在纹理高速缓存414中并且通知处理核心430纹理块1040在纹理高速缓存414中是可用的。处理核心430接收该通知并且继续执行其指派的指令集中的下一个指令。
162.当处理核心430执行纹理数据路径指令时,处理核心430发送对位于纹理块1040内
的纹理元素坐标(即,子坐标)处的纹理元素1060的请求。如图10c所示,处理核心430向核心调度器420发送纹理元素请求1050。处理核心430从纹理高速缓存414读取纹理块1040并包括具有纹理元素请求1050的纹理块1040。此外,处理核心430将纹理元素1060的坐标弹出其堆栈,并将纹理元素坐标与纹理元素请求1050包括在一起。
163.核心调度器420向纹理元素提取管线(诸如astc_dp管线444)发送纹理元素请求1050。astc_dp管线444被配置为执行固定功能,该固定功能基于包括在纹理元素请求1050中的纹理元素坐标从包括在纹理元素请求中的纹理块1040中提取解压缩的纹理元素1060。
164.astc_dp管线444向核心调度器420发送纹理元素1060。在一些实施例中,提取纹理元素1060包括提取对应于纹理元素1060的解压缩的rgba(红色、绿色、蓝色和阿尔法)值。astc_dp444将对应于纹理元素1060的rgba值发送到核心调度器420。
165.核心调度器420从astc_dp管线444接收纹理元素1060。在一些实施例中,接收纹理元素1060包括接收对应于纹理元素1060的rgba值。核心调度器420确定纹理元素1060与处理核心430相关联并向处理核心430发送纹理元素1060。在一些实施例中,在接收到纹理元素1060之后,处理核心430将纹理元素1060推送到其堆栈上。
166.图11a是根据一个实施例的用于确定目标纹理块的地址的方法步骤的流程图。虽然结合图1-4的系统来描述方法步骤,但所属领域的技术人员将理解,经配置以按任何次序执行所述方法步骤的任何系统落入本公开的范围内。
167.在步骤1102中,astc_a管线442接收对应于交叉点的一组uv坐标和该交叉点处的uv覆盖率的分数。在一些实施例中,astc_a管线442接收对应于uv覆盖率的分数平方根的值,而不是对应于uv覆盖率的分数的值。
168.在一些实施例中,astc_a管线442还接收确定纹理块地址所需的一个或更多个其他变量,诸如对应于纹理的纹理块集合的起始地址,其中纹理块集合中的每个纹理块对应于纹理的不同mip级别和纹理的维度。
169.在步骤1104中,astc_a管线442确定对应于该交叉点的细节级别。在一些实施例中,astc_a管线442基于交点处的光线的大小来确定细节级别。如果光线是窄的,则需要更高的细节级别来为纹理提供更高的分辨率。如果光线较宽,则它覆盖了更多的纹理,因此需要更低的细节级别。
170.在步骤1106中,astc_a管线442识别对应于细节级别的目标纹理块。在一些实施例中,确定细节级别包括确定目标mip级别。目标纹理块是纹理块集合内对应于目标mip级别的纹理块。
171.在步骤1108中,astc_a管线442确定目标纹理块的地址。在一些实施例中,确定目标纹理块的地址是基于包括目标纹理块的纹理块集合的起始地址。astc_a管线442基于目标mip级别计算偏移值,并且通过将偏移值应用于起始地址来确定目标纹理块的地址。
172.在步骤1110中,astc_a管线442确定目标纹理块内的目标纹理元素的坐标。在一些实施例中,astc_a管线442基于对应于交叉点的uv坐标和目标mip级别来确定目标纹理元素的坐标。astc_a管线442修改基于原始纹理的尺寸的uv坐标,以生成基于目标mip级别的纹理块的尺寸的修改后的uv坐标。
173.在一些实施例中,astc_a管线442在确定目标纹理块和目标纹理元素的坐标时的操作(如以上参照步骤1104-1110所描述的)可由以下伪代码来表示:
174.width_of_footprint=int(sqrt_fraction_uv_coverage*sqrt_texture_area);
175.mip_level=min(log2(width_of_footprint),coarsest_mip_level);
176.mip_block_offset=offset of first block for chosen mip level;
177.modified_u=int(u*mip_xsize);
178.modified_v=int(v*mip_ysize);
179.bx=modified_u/block_dimension_x;
180.by=modified_v/block_dimension_y;
181.block_address=block_set_address mip_block_offset bx by*mip_block_count_x;
182.texel_coord_x=modified_u

bx*block_dimension_x;
183.texel_coord_y=modified_v

by*block_dimension_y;
184.根据以上伪代码,astc_a管线442基于uv覆盖的分数和纹理的大小来计算光线的覆盖区的宽度。目标mip级别基于覆盖区的大小来确定。如上述伪代码所示,所选择的mip级别不能小于最粗糙的mip级别。基于块集合的地址、对应于mip级别的偏移值、在目标mip级别的纹理块的维度以及原始纹理的维度来确定目标纹理块的块地址。另外,astc_a管线442基于经修改的uv坐标、在目标mip级别的纹理块的维度、以及原始纹理的维度来计算目标纹理元素的x和y坐标。
185.在步骤1112,astc_a管线442生成包括目标纹理块的地址和目标纹理元素在目标纹理块内的坐标的输出。
186.图11b是根据一个实施例的用于从纹理块中提取目标纹理元素而不解压缩或提取纹理块中的其他纹理元素的方法步骤的流程图。虽然结合图1-4的系统来描述方法步骤,但所属领域的技术人员将理解,经配置以按任何次序执行所述方法步骤的任何系统落入本公开的范围内。
187.在步骤1120中,astc_dp管线444接收纹理块以及对应于目标纹理元素的一组纹理元素坐标。例如,astc_dp管线444从核心调度器420接收纹理块1050和纹理元素坐标。
188.在一些实施例中,astc_dp管线444还接收纹理块的标头信息。在一些实施例中,astc_dp管线444读取纹理块且从纹理块提取标头信息。标头信息包括用于提取纹理块的目标纹理元素的元数据,诸如块模式、权重的位置、分区的位置、颜色端点模式等等。从纹理块提取目标纹理元素所需的标头信息可根据特定纹理块而变化。
189.在一些实施例中,如果块被标记为“空隙程度”,则纹理块存储常数颜色。astc_dp管线444输出存储在块中的常数颜色。
190.在步骤1124中,astc_dp管线444识别纹理块内对应于目标纹理元素的纹理块分区。在一些实施例中,astc_dp管线444基于目标纹理元素的坐标来确定纹理块分区。
191.在步骤1126中,astc_dp管线444确定纹理块分区的颜色端点。在一些实施例中,astc_dp管线444基于包含于纹理块的标头信息中的元数据来确定对应于分区的颜色端点模式。元数据指示用于纹理块的颜色端点模式。astc_dp管线444基于颜色端点模式解码纹理块分区的颜色端点。
192.在步骤1128,astc_dp管线444确定目标纹理元素的一个或更多个颜色通道权重。在一些实施例中,确定颜色通道权重是基于纹理块的标头信息中所包含的元数据。元数据
指示一个或更多个颜色通道权重在纹理块内的位置。另外,元数据可以包括指示如何从纹理块提取一个或更多个颜色通道权重的权重量化元数据。astc_dp管线444基于权重量化元数据从所指示的位置提取一个或更多个颜色通道权重。
193.在一些实施例中,astc_dp管线444确定两个颜色通道权重,并且astc_dp管线444进一步确定哪个颜色通道(红色、绿色、蓝色或α)对应于这两个颜色通道权重中的哪个。
194.在步骤1130中,基于颜色端点和颜色通道权重来计算目标纹理元素的rgba值。在一些实施例中,astc_dp管线444在计算目标纹理元素的rgba值时的操作可由以下伪代码来表示:
[0195][0196]
根据上述伪代码,astc_dp管线444计算rgba颜色通道中的每一者的值。astc_dp管线444基于在以上步骤1126和1128中确定的颜色通道权重和颜色端点来计算每个颜色通道的值。如果srgb正被使用,那么astc_dp管线444将值转换为rgba。如果astc_dp管线444未执行srgb转换,那么astc_dp管线444将0至0xffff之间的数字转换成0至1之间的值。
[0197]
在步骤1132,astc_dp管线444生成包括目标纹理元素的rgba值的输出。
[0198]
所公开的技术相对于现有技术的至少一个技术优点是,所公开的技术可从纹理块中提取单个纹理元素,而无需对整个纹理块进行解压缩。由于仅需要为目标纹理元素执行计算,并且纹理块中的其他纹理元素不被解压缩,与要求执行单元解压缩整个纹理块的现有方法相比,pbru可更高效地提取单个纹理元素。
[0199]
虽然以上步骤是关于astc格式的压缩纹理块进行描述的,但是可以使用任何压缩或未压缩的纹理块格式。提取单个纹理元素的特定步骤可根据特定纹理块格式而改变。例如,如果纹理块是未压缩的纹理块,特定纹理元素可以直接从对应于特定纹理元素的存储器位置读取,而不从存储器读取纹理块中的周围纹理元素。
[0200]
使用渲染引擎的重要性采样
[0201]
当渲染3d场景的二维图像时,生成源自特定光源并且朝向该3d场景中的不同方向延伸的多个光线。对于每个光线,识别所述光线与3d场景中的对象的表面之间的交叉点。在交叉点处执行重要性采样以生成与由光线与对象表面的交叉所产生的辅助光线相对应的方向。辅助光线源自交叉点并且朝向由重要性采样生成的方向延伸。辅助光线可表示例如当物体表面被来自光源的光(例如由光线表示的光束)撞击或被其他辅助光线撞击时产生
的阴影、反射、折射等。
[0202]
如以上所讨论的,使用指示光如何与对象的表面相互作用的材料属性(如抛光、反射率、漫射行为、半透明度、透明度等)的不同层来对对象表面进行建模。每个材料属性是使用一个或更多个计算和/或函数来定义的,这些计算和/或函数是基于由一个或更多个其他材料属性所产生的一个或更多个变量和/或一个或更多个值来评估的。
[0203]
材料图可以用于表示与对象表面相关联的不同材料属性以及不同材料属性之间的关系。当执行重要性采样时,从不同的材料属性中随机选择特定的材料属性,并且评估特定的材料属性的计算和/或函数以生成辅助光线的方向。如下文在图14-16中更详细地描述的,为了使用pbru 335基于材料图来执行重要性采样,材料图被编译成可由pbru 335执行的一组重要性采样指令。
[0204]
图12是示出了根据一个实施例的用于使用pbru 335对光线执行重要性采样的数据流的框图。
[0205]
如图12所示,sm 325向pbru 335发送光线1210,用于对光线1210执行重要性采样。在一些实施例中,光线1210包括用于标识光线1210的光线标识符。在一些实施例中,sm 325计算或接收与光线1210相关联的一个或更多个变量的值。sm 325在向pbru 335发送光线1210时包括该一个或更多个变量值。
[0206]
在一些实施例中,sm 325基于光线1210与3d场景中的对象的表面之间的交叉点来确定与在该交叉点处的对象的表面相对应的一组重要性采样指令1220。在一些实施例中,sm 325将该组重要性采样指令1220或其一部分与光线1210一起发送到pbru 335。在一些实施例中,sm 325发送对应于该组重要性采样指令1220的地址。另外,sm 325可发送指示下一指令的位置的索引值以在一组重要性采样指令1220内执行。例如,sm 325可发送索引值o,其指示pbru 335应在该组重要性采样指令1220中的第一指令处开始执行。
[0207]
在某些实施例中,发送该光线1210包括发送对应于该光线1210的光线数据结构。光线数据结构存储光线标识符、该组重要性采样指令1220的地址、该组重要性采样指令1220内的起始指令的索引、以及包括与光线1210相关联的一个或更多个变量的堆栈。
[0208]
pbru 335接收光线1210和该组重要性采样指令1220,并且执行该组重要性采样指令1220以生成与该光线相关联的辅助方向1230。如图12所示,pbru 335可以发送辅助方向1230至sm 325或ttu 330用于进一步处理。
[0209]
在一些实施例中,sm 325和/或ttu 330基于辅助方向1230产生源自交叉点并且朝向辅助方向1230延伸的辅助光线。sm 325和/或ttu 330可以确定辅助光线与3d场景中的对象的表面之间的第二交叉点,并且将辅助光线发送回pbru 335以用于材料着色和/或重要性采样。
[0210]
将认识到,在此描述的操作和数据流是示范性的并且变化和修改是可能的。例如,sm 325或ttu 330中的任一者可确定光线与3d场景中的对象之间的交叉点,计算与所述光线相关联的变量值,确定对应于所述交叉点的重要性采样指令的集合,将所述光线发送到pbru 335,和/或将所述重要性采样指令的集合发送到pbru 335。类似地,pbru 335可以向sm 325或ttu 330发送第二方向,而不管哪一个方向向pbru 335发送光线。
[0211]
图13a是根据一个实施例的用于使用pbru对光线执行重要性采样的方法步骤的流程图。虽然结合图1-4的系统来描述方法步骤,但所属领域的技术人员将理解,经配置以按
任何次序执行所述方法步骤的任何系统落入本公开的范围内。
[0212]
在步骤1302中,pbru的核心调度器从sm接收光线。例如,核心调度器420从sm 325接收光线1210。在一些实施例中,核心调度器420还从sm 325接收一组重要性采样指令。核心调度器420将该组重要性采样指令存储到指令高速缓存412。在一些实施例中,核心调度器420从sm 325接收对应于一组重要性采样指令的地址。
[0213]
在一些实施例中,核心调度器420接收表示光线1210的光线数据结构。光线数据结构包括例如与光线1210相对应的光线标识符、一组重要性采样指令1220的地址、该组重要性采样指令1220内的起始指令的索引、以及包括与光线1210相关联的一个或更多个变量的堆栈。
[0214]
在步骤1304中,该核心调度器将该光线指派给处理核心。例如,核心调度器420将光线1210指派给多个处理核心430中的特定的处理核心430。核心调度器420可确定哪些处理核心430未被指派光线并且选择当前未被指派任何光线的处理核心430。
[0215]
在步骤1306中,处理核心基于该光线执行该组重要性采样指令以生成辅助光线的方向。例如,处理核心430基于光线1210执行该组重要性采样指令1220以生成方向1230。
[0216]
图13b是根据一个实施例的用于执行一组重要性采样指令的方法步骤的流程图。虽然结合图1-4的系统来描述方法步骤,但所属领域的技术人员将理解,经配置以按任何次序执行所述方法步骤的任何系统落入本公开的范围内。
[0217]
在步骤1322中,pbru的处理核心从核心调度器接收光线。例如,处理核心430从核心调度器420接收光线1210。在一些实施例中,接收光线1210包括接收对应于光线1210的光线标识符、对应于一组重要性采样指令1220的地址、该组重要性采样指令1220内的起始指令的索引、以及包括与光线1210相关联的一个或更多个变量的堆栈。
[0218]
在步骤1324中,处理核心430请求下一组重要性采样指令。在一些实施例中,处理核心430向核心调度器420发送对于与光线1210一起接收的指令地址处的一组重要性采样指令的请求。处理核心430等待从核心调度器420接收该组重要性采样指令或从核心调度器420接收该组重要性采样指令在指令高速缓存412中可用的指示。在接收到要执行的下一组重要性采样指令或接收到下一组重要性采样指令在指令高速缓存412中的指示之后,该方法前进至步骤706。
[0219]
在一些实施例中,如果核心调度器420随光线1210接收到一组重要性采样指令,则核心调度器420将该组重要性采样指令存储在指令高速缓存412中或者将该组重要性采样指令与光线1210一起发送到处理核心430。处理核心430可以确定下一组重要性采样指令可用并且在不请求附加指令的情况下前进到步骤706。
[0220]
在步骤1326中,处理核心430对该组重要性采样指令中的下一个指令进行解码。此外,处理核心430对跟随下一指令的任何立即数进行解码。处理核心430根据下一个指令执行一个或更多个不同的动作。
[0221]
如果下一个指令是光线停止指令,则在步骤1328,处理核心停止针对该光线执行重要性采样指令并且将该光线发送到核心调度器。例如,处理核心430向核心调度器420发送光线1210。如果处理核心430生成辅助方向1230,则处理核心430还向核心调度器420发送辅助方向1230。
[0222]
在一些实施例中,向核心调度器420发送光线1210包括发送光线1210的堆栈。如果
处理核心430生成了辅助方向1330,那么辅助方向1230被存储在光线1210的堆栈的顶部。如果处理核心430尚未生成辅助方向1230,则该堆栈反映针对光线1210已经完成的计算。
[0223]
在一些实施例中,发送光线1210包括发送表示光线1210的更新的光线数据结构。更新后的光线数据结构例如包括:与光线1210相对应的光线标识符;处理核心430所执行的最新一组重要性采样指令的地址;由处理核心430执行的最近一组重要性采样指令内的最后一个指令的索引;以及与光线1210相关联的堆栈。
[0224]
如果下一个指令是可以由处理核心在本地执行的指令,则在步骤1330中,处理核心在本地执行该指令。可在本地执行的指令包括例如堆栈运算(诸如推、加载和存储)和固定点算术(诸如加法、乘法和线性插值)。在本地执行指令之后,处理核心前进到下一个指令(如果可用的话)。
[0225]
在一些实施例中,所述一组重要性采样指令包括多个情况(case)和从所述多个情况中选择特定情况以执行的随机选择指令。如果下一个指令是随机选择指令,则处理核心执行随机选择指令以选择要执行的特定情况。在一些实施例中,执行随机选择指令包括将多个权重从堆栈中弹出,其中每个权重对应于多种情况中的不同情况,以及基于多个权重随机选择情况编号。例如,假设第一情况对应于权重w0,第二情况对应于权重wl,第三情况对应于权重w2。执行随机选择指令包括将权重w0、w1和w2相加并且生成0到权重之和之间的随机数。如果随机数在0到w0之间,则选择第一情况。如果随机数在w0到w0和wl之和之间,则选择第二情况。最后,如果随机数介于w0和wl之和到所有权重之和之间,则选择第三情况。
[0226]
处理核心跳到与所选择的情况编号相对应的多个情况中的特定情况,并且继续执行特定情况内的下一指令。在一些实施例中,每个情况由情况指令和结束情况指令表示。处理核心可以重复地前进到下一个指令并且跳过下一个指令的执行,直到已经跳过正确数量的情况和结束情况指令对(即,所选择的情况数量减1)。
[0227]
如果下一个指令不是可以由处理核心在本地执行的指令,则在步骤1332中,处理核心向核心调度器发送请求。例如,如果指令用于固定功能,诸如纹理地址(ttex_a)、纹理数据路径(ttex_dp)、ggx、oren-nayar、schlick-fresnel、sheen等,则处理核心430向核心调度器420发送对相应管线440的请求。对于重要性采样,指令可用于固定功能的方向版本,其包含与常规固定功能相同的计算,但产生方向而非颜色。向核心调度器420发送请求可以包括将固定功能的一个或更多个变元弹出堆栈外,并且将一个或更多个变元与请求包括在一起。核心调度器420将请求和一个或更多个变元发送到对应的管线440。管线440接收一个或更多个变元作为一个或更多个输入,并且对一个或更多个输入执行对应的固定功能以生成固定功能的一个或更多个输出。管线440将一个或更多个输出传输回核心调度器420,并且核心调度器420将一个或更多个输出发送到处理核心430。
[0228]
在一些实施例中,发送该请求包括连同该请求一起发送与光线1210相对应的标识符。在一些实施例中,对应于光线1210的标识符包括对应于光线1210的光线标识符。在一些实施例中,对应于光线1210的标识符包括对应于处理核心430的标识符。如果多条光线被指派给处理核心430,则该标识符还包括与被指派给处理核心430的多条光线内的光线1210的索引相对应的索引值。当该一个或更多个输出被传输至核心调度器420时,该标识符与该一个或更多个输出一起被包括。核心调度器420使用该标识符来确定一个或更多个输出应当被发送到处理核心430。
[0229]
在将请求发送至核心调度器420之后,处理核心430等待,直到在步骤1334处,处理核心430从核心调度器420接收一个或更多个结果。如果一个或更多个结果包括一个或更多个值,诸如由管线440生成的一个或更多个值,则处理核心430将一个或更多个值推送到堆栈上。在从核心调度器420接收到一个或更多个结果之后,处理核心430前进到下一个指令(如果可用的话)。
[0230]
如果在该组指令中没有剩余指令但处理核心430尚未达到光线停止指令并且停止执行针对该光线的指令,则该方法返回至步骤1324,在该步骤中处理核心430请求执行下一组指令。处理核心430请求与光线510一起接收的指令地址处的下一组重要性采样指令,增加被执行的最后一个指令的索引。
[0231]
如果在该组指令中剩余有多个指令,那么该方法返回步骤706,在该步骤中,处理核心430对该组指令中的下一个指令进行解码。
[0232]
返回至图13a,在处理核心完成执行该组重要性采样指令之后,在步骤1308中,核心调度器接收来自处理核心的光线和辅助方向。例如,核心调度器420从处理核心430接收光线1210和辅助方向1230。在一些实施例中,核心调度器420接收来自处理核心430的光线1210的堆栈,其中辅助方向1230被存储在堆栈的顶部。在一些实施例中,核心调度器420从处理核心430接收表示光线1210的更新的光线数据结构。更新后的光线数据结构例如包括:与光线1210相对应的光线标识符;处理核心430所执行的最新一组重要性采样指令的地址;由处理核心430执行的最近一组重要性采样指令内的最后一个指令的索引;以及与光线1210相关联的堆栈。
[0233]
在步骤1310中,核心调度器将光线和辅助方向发送至sm和/或ttu以供进一步处理。例如,核心调度器420向sm 325和/或ttu 330发送光线1210和辅助方向1230。
[0234]
编译材料图
[0235]
图14是示出了被配置成用于实现各个实施例的一个或更多个方面的计算设备1410的框图。如图所示,计算设备1410包括一个或更多个处理器1412、存储装置1414和存储器1416。在一些实施例中,计算设备1410是与ppu 202(包括pbru 335)驻留在其上的计算设备分开的计算设备。在其他实施例中,计算设备1410可以是ppu 202和pbru 335驻留在其上的相同计算设备,诸如图1中所示的计算设备100。
[0236]
计算设备1410包括服务器计算机、台式计算机、膝上型计算机、智能电话、个人数字助理(pda)、平板计算机、或被配置成用于接收输入、处理数据和可选地显示图像的任何其他类型的计算设备,并且适用于实践一个或更多个实施例。本文描述的计算设备1410是说明性的,并且任何其他技术上可行的配置落入本公开的范围内。
[0237]
一个或更多个处理器1412包括被实现为中央处理单元(cpu)、图形处理单元(gpu)、专用集成电路(asic)、现场可编程门阵列(fpga)、人工智能(ai)加速器(如张量处理单元(tpu))、任何其他类型的处理单元、或不同处理单元的组合(如被配置成用于结合gpu进行操作的cpu)的任何合适的处理器。通常,一个或更多个处理器1412可以是能够处理数据和/或执行软件应用的任何技术上可行的硬件单元。进一步,在本公开的上下文中,计算设备1410中示出的计算元件可对应于物理计算系统(例如,数据中心中的系统)或者可以是在计算云内执行的虚拟计算实施例。
[0238]
存储装置1414包括用于应用和数据的非易失性存储,并且可以包括固定或可移动
磁盘驱动器、闪存设备、和cd-rom、dvd-rom、蓝光、hd-dvd、或其他磁性、光学或固态存储设备。材料图1418和编译器1420可以存储在存储装置114中并且在执行期间被加载到存储器1416中。
[0239]
存储器1416包括随机存取存储器(ram)模块、闪存单元、或任何其他类型的存储器单元或其组合。一个或更多个处理器1412被配置为从存储器1416读取数据和向存储器1416写入数据。存储器1416包括可以由一个或更多个处理器1412执行的不同软件程序以及与所述软件程序相关联的应用数据,包括编译器1420。
[0240]
如以上所讨论的,材料图是用于表示对象表面的不同材料属性和不同材料属性之间的关系的图结构。
[0241]
图15示出了示例材料图1418。如图所示,材料图1418包括多个节点。多个节点包括限定材料属性(诸如α图样、抛光、发光、金属、玻璃等)的多个材料属性节点1510。虽然在图15中未示出,但是每个材料属性节点1510可以包括多个附加节点,其进一步定义与材料属性节点1510相关联的一个或更多个变量以及对这些变量执行以计算对应于材料属性节点1510的一个或更多个值的一个或更多个计算。
[0242]
此外,多个节点包括定义材料属性之间的关系的多个关系节点1520。例如,关系节点1522指示材料属性扩散应当与材料属性表皮组合。虽然图15中未示出,但每个关系节点1522定义基于对应于关系节点1522的子节点的值执行以产生对应于关系节点1522的一个或更多个值的一个或更多个计算。
[0243]
当对与对象的表面相交的光线执行材料着色和/或重要性采样时,基于该光线评估不同的材料属性和这些不同的材料属性之间的关系。例如,每个材料属性节点1510基于光线被评估以生成对应于材料属性节点1510的一个或更多个值,并且基于针对材料属性节点1510生成的一个或更多个值评估每个关系节点1522以生成对应于关系节点1522的一个或更多个值。
[0244]
通常,可以将材料图编译成多个不同的着色器程序,其中,每个着色器程序对应于材料图的不同部分和/或用于不同材料属性的不同参数集。着色器程序可由例如cpu 102或sm 325等处理器执行。然而,由于着色器程序被编译成通用机器语言以供在各种处理器上执行,因此着色器程序包含显著开销。另外,由于材料图和/或具有不同材料属性参数的材料图的不同部分被编译成不同着色器程序,所以需要编译用于渲染3d场景的着色器程序的数目与3d场景中的不同类型的对象表面的数目相比可呈指数增长。例如,参见图15,每个材料属性节点1510可以对应于不同的着色器程序。
[0245]
编译器1420基于材料图生成一个或更多个字节代码指令集,而不是将材料图编译成多个着色器程序。每个字节代码指令集包括可由基于硬件的渲染引擎(例如pbru 335)执行的字节代码。当由pbru执行时,每个字节代码指令集使得pbru评估由材料图定义的不同材料属性以及不同材料属性之间的关系。
[0246]
如所示,编译器1420接收材料图1418并且基于材料图1418生成材料着色指令集1422和重要性采样指令集1424。材料着色指令集1422在由pbru执行时使得pbru生成与光线与具有由材料图1418定义的材料属性的对象表面的交点相关联的颜色。重要性采样指令集1424在由pbru执行时使得pbru生成当初级光线与具有由材料图1418定义的材料属性的对象表面相交时所生成的辅助光线的方向。
[0247]
在一些实施例中,编译器1420接收材料图1418的文本表示。编译器1420解析材料图1418的文本表示以生成表达树,诸如后缀表达树。对于材料图1418的每个节点,表达树包括对应于该节点的一个或更多个表达式。在一些实施例中,一个或更多个表达式对应于由节点定义的一个或更多个计算。包括在该表达树中的每个表达式被表示为该表达树中的一个或更多个节点的集合。
[0248]
在一些实施例中,编译器1420检查表达树的语义完整性以确定在表达树中是否包括任何错误。检查表达树的语义完整性包括例如确定变量是否在变量被使用之前在表达树中被定义和/或确定函数是否包括正确数量的变元。如果编译器1420确定表达树包括错误,则编译器1420不继续生成字节代码指令集合。
[0249]
在一些实施例中,编译器1420简化表达树中的一个或更多个表达式或子表达式。简化一个或更多个表达式或子表达式可包括例如:删除未使用的变量、折叠常数(例如,用对应于60的单个节点替换对应于5*12的节点集合)、简化表达式(例如,x 0、x*0、x 1、x/1、0/x)、确定纹理函数是否可用常数颜色替换、用常数替换评估常数的函数调用(例如,当粗糙度等于0时,用值1/pi替换oren-nayar函数)、或删除仅被使用一次的变量的存储。基于材料图1418中包括的不同函数和变量,可以对表达树执行任何技术上可行的简化和/或优化。
[0250]
在一些实施例中,如果编译器1420正在生成重要性采样指令,则编译器1420移除表达树的不影响方向和/或权重的一个或更多个部分,如与纹理函数相对应的一些节点。
[0251]
在一些实施例中,如果编译器1420正在生成重要性采样指令,则编译器1420创建包括在该表达树中的该多个叶节点的列表。编译器1420在多个叶节点之上生成随机选择节点,并用该随机选择节点替换表达树的根。为重要性采样而修改的表达树包括作为根节点的随机选择节点和在该随机选择节点下的多个叶节点。
[0252]
对于该多个叶节点中的每个叶节点,编译器1420确定与该叶节点相关联的权重。编译器1420将与叶节点相关联的权重指派给叶节点。在一些实施例中,向叶节点指派权重包括向表达树添加定义权重值和/或对应于与计算权重值相关联的指令的一个或更多个节点。如以下所讨论的,指派给叶节点的权重可以是特定权重,或者该权重可以通过执行对应于与叶节点相关联的材料图的部分的一个或更多个指令来动态生成。一个或更多个节点被添加到随机选择节点上方的表达树,使得相应的指令在执行随机选择指令之前被执行。
[0253]
在一些实施例中,该多个叶节点中的每个叶节点被指派相等的权重。例如,编译器1420可以计算值1除以叶节点的数量,并且将该值指派给多个叶节点中的每个叶节点。
[0254]
在一些实施例中,材料图1418指定对应于每个叶节点的权重。编译器1420确定针对每个叶节点指定的权重并将该权重指派给该叶节点。
[0255]
在一些实施例中,每个叶节点的权重基于该叶节点对材料图1418的贡献。即,每个叶节点的权重基于叶节点如何在材料图1418中被加权。例如,与贡献大值的第二叶节点相比,贡献小值的第一叶节点可以被指派更小的权重。在一些实施例中,编译器1420评估材料图1418以确定每个叶节点对由材料图1418生成的总体结果贡献的量。编译器1420基于所述量来确定每个叶节点的权重。
[0256]
编译器1420将由叶节点引用的函数调用转换成方向函数调用。例如,如果叶节点调用oren-nayar函数,则编译器1420修改叶节点以调用oren-nayar方向函数。另外,编译器1420基于方向函数调用修改叶节点的变元。参见以上示例,常规oren-nayar函数可以包括
与交叉光线的方向和粗糙度相对应的变元。oren-nayar方向函数不需要那些变元来计算方向,因此编译器1420从表达树移除那些变元。
[0257]
编译器1420基于表达树或经处理的表达树生成字节代码指令集。在一些实施例中,编译器1420遍历表达树,并且针对表达树的每个节点生成对应于该节点的一个或更多个字节代码指令。例如,如果表达树的节点定义变量的值,则编译器1420生成将变量的值推送到堆栈上的字节代码指令。作为另一实例,pbru经配置以执行多个内置函数,例如由pbru 335的管线440实施的固定功能。如果表达树的节点包括对内置函数的调用,则编译器1420生成调用该函数的字节代码指令。
[0258]
在一些情况下,材料图1418和对应的表达树可以包括不能被转换成字节代码指令的函数或操作。例如,表达树的节点可包括对不是内置函数或不能使用可用字节代码指令来表达的函数的调用。在一些实施例中,如果编译器1420确定函数无法转换成字节代码指令,那么编译器1420可产生光线停止指令以替换所述函数。另外,在一些实施例中,编译器1420可生成与可由处理器(诸如sm 325)而不是由pbru执行的函数对应的附加指令集。
[0259]
在一些实施例中,编译器1420使用自下而上遍历来遍历表达树。然而,对于随机选择节点,编译器1420执行自上而下遍历。对于随机选择节点,编译器1420生成与随机选择函数对应的字节代码指令。对于在随机选择节点下的每个叶节点,编译器1420生成情况指令、对应于叶节点的一个或更多个字节码指令、以及结束情况字节代码指令。由编译器1420产生的重要性采样指令1424包括多个情况,每个情况由情况和结束情况字节代码指令表示,并且随机选择函数从多个情况中选择特定情况以执行。
[0260]
在一些实施例中,在基于表达树生成字节代码指令集之后,编译器1420在字节代码指令集的结束处添加光线停止指令。在一些实施例中,表达树包括对应于光线停止指令的一个或更多个节点,并且编译器1420在基于表达树生成字节代码指令的同时生成光线停止指令。如果字节代码指令的集合以光线停止指令结束,那么编译器1420不在字节代码指令集合的结束处添加另一光线停止指令。
[0261]
由于编译器1420生成的字节代码指令针对pbru,因此字节代码指令的集合所需的开销与着色器程序所需的开销相比低得多。另外,因为每一字节代码指令仅占据一个字节,所以存储和执行对应于材料图的一组字节代码指令所需的存储装置和存储器的量远小于存储和执行所述多个着色器程序所需的存储装置和存储器的量。
[0262]
作为示例,着色器程序包括if语句(if-statements),但sm不擅长分支。由此,并非将分支包含在单个着色器程序中,可以编译着色器程序的不同版本,其各自在着色器程序内采取不同分支,且包含额外代码以确定着色器程序的哪一版本需要被执行。照此,使用常规技术,单个材料图可对应于大量着色器程序。相比之下,利用所揭示的技术,仅需要产生和执行一组字节代码指令。
[0263]
图16是根据一个实施例的用于编译材料图的方法步骤的流程图。尽管结合图14的计算设备来描述这些方法步骤,但本领域技术人员将理解,被配置成以任何次序来执行这些方法步骤的任何计算设备或系统落入本公开的范围内。
[0264]
在步骤1602中,编译器解析材料图以生成表达树。例如,编译器1420解析材料图1418以生成对应于材料图1418的表达树。对于材料图1418的每个节点,表达树包括对应于该节点的一个或更多个表达式。在一些实施例中,一个或更多个表达式对应于由节点定义
的一个或更多个计算。包括在该表达树中的每个表达式被表示为该表达树中的一个或更多个节点的集合。
[0265]
在步骤1604中,编译器1420处理该表达树以生成经处理的表达树。以类似于上文关于编译器1420所公开的方式执行对表达树的处理。
[0266]
在一些实施例中,编译器1420检查表达树的语义完整性以确定在表达树中是否包括任何错误。检查表达树的语义完整性包括例如确定在变量被使用之前变量是否在表达树中被定义和/或确定函数是否包括正确数量的变元。如果编译器1420确定表达树包括错误,则编译器1420不继续生成字节代码指令的集合。
[0267]
在一些实施例中,编译器1420简化表达树中的一个或更多个表达式或子表达式。简化一个或更多个表达式或子表达式可包括例如:删除未使用的变量、折叠常数(例如,用对应于60的单个节点替换对应于5*12的节点集合)、简化表达式(例如,x 0、x*0、x 1、x/1、0/x)、确定纹理函数是否可用常数颜色替换、用常数替换评估常数的函数调用(例如,当粗糙度等于0时,用值1/pi替换oren-nayar函数)、或删除仅被使用一次的变量的存储。
[0268]
在一些实施例中,如果编译器1420正在生成重要性采样指令,则编译器1420移除表达树的不影响方向和/或权重的一个或更多个部分,诸如对应于纹理函数的一些节点。编译器1420针对每个节点确定该节点是否需要用于计算叶节点的权重。如果不需要该节点来计算叶节点的权重,则编译器1420移除该节点。
[0269]
在一些实施例中,如果编译器1420正在生成重要性采样指令,则编译器1420移除表达树的一个或更多个部分,所述一个或更多个部分定义不用于方向函数的变量或变元。例如,常规(材料着色)oren-nayar函数可包括对应于相交光线的方向和粗糙度的变元,但是oren-nayar方向函数不包括那些变元,因为不需要变元来计算方向。编译器1420从表达树去除对应于相交光线的方向和粗糙度的节点。
[0270]
如果编译器1420正在生成材料着色指令,那么该方法进行到下面的步骤1614,在该步骤中,编译器1420基于经处理的表达树生成字节代码指令。
[0271]
如果编译器1420正在生成重要性采样指令,则该方法进行至步骤1606。在步骤1606,编译器1420在经处理的表达树中生成叶节点的列表。在一些实施例中,每个叶节点对应于函数调用,诸如ggx、oren-nayar、sheen等。
[0272]
在步骤1608,编译器1420在该多个叶节点之上生成随机选择节点。随机选择节点对应于从多个情况中随机选择要执行的情况的随机选择函数。在一些实施例中,包括在多个情况中的每个情况对应于叶节点列表中的叶节点。编译器1420用随机选择节点替换每个叶节点的父节点。此外,编译器1420用随机选择节点替换表达树的根。为了重要性采样而被修改的表达树包括作为根节点的随机选择节点和作为随机选择节点的子节点的多个叶节点。
[0273]
在步骤1610,编译器计算每个叶节点的权重并且将该权重指派给该叶节点。以与上文相对于编译器1420所公开的方式类似的方式执行计算每个叶节点的权重。
[0274]
在一些实施例中,包括在该多个叶节点中的每个叶节点被指派相等的权重。例如,编译器1420可以计算值1除以叶节点的数量,并且将该值指派给多个叶节点中的每个叶节点。
[0275]
在一些实施例中,材料图1418指定对应于每个叶节点的权重。编译器1420确定针
对每个叶节点指定的权重并将该权重指派给该叶节点。
[0276]
在一些实施例中,每个叶节点的权重基于叶节点对材料图1418的贡献。即,每个叶节点的权重基于叶节点如何在材料图1418中被加权。例如,与贡献大值的第二叶节点相比,贡献小值的第一叶节点可以被指派更小的权重。在一些实施例中,编译器1420评估材料图1418以确定每个叶节点对由材料图1418生成的总体结果贡献的量。编译器1420基于所述量来确定每个叶节点的权重。
[0277]
在步骤1612处,编译器用对方向指令的引用来转换对颜色指令的引用。在一些实施例中,每个叶节点对应于函数调用,诸如ggx、oren-nayar、sheen等。编译器1420用对函数的方向版本的调用来替换每个叶节点中的函数调用。例如,用针对ggx_direction的函数调用来替换针对ggx的函数调用。
[0278]
在步骤1612,编译器基于经处理的表达树生成字节代码指令。以类似于上文关于编译器1420所公开的方式执行产生字节代码指令。
[0279]
在一些实施例中,编译器1420遍历表达树,并且针对表达树的每个节点生成对应于该节点的一个或更多个字节代码指令。例如,如果表达树的节点定义变量的值,则编译器1420生成将变量的值推送到堆栈上的字节代码指令。作为另一实例,pbru经配置以执行多个内置函数,例如由pbru335的管线440实施的固定功能。如果表达树的节点包括对内置函数的调用,则编译器1420生成调用该函数的字节代码指令。
[0280]
在一些情况下,材料图1418和对应的表达树可以包括不能转换成字节代码指令的函数或操作。例如,表达树的节点可包括对不是内置函数或不能使用可用字节代码指令来表达的函数的调用。在一些实施例中,如果编译器1420确定函数无法转换成字节代码指令,那么编译器1420可生成光线停止指令以替换所述函数。另外,在一些实施例中,编译器1420可生成与可由处理器(诸如sm 325)而不是由pbru执行的函数对应的附加指令集。例如,如果函数对应于用户定义函数,则编译器1420可被配置成生成指令,这些指令在由诸如sm 325之类的处理器执行时调用用户定义函数。
[0281]
在一些实施例中,编译器1420使用自下而上遍历来遍历表达树。然而,对于随机选择节点,编译器1420执行自上而下遍历。对于随机选择节点,编译器1420生成与随机选择函数对应的字节代码指令。对于在随机选择节点下的每个叶节点,编译器1420生成情况指令、对应于叶节点的一个或更多个字节码指令、以及结束情况字节代码指令。由编译器1420产生的重要性采样指令1424包括多个情况,每个情况由情况和结束情况字节代码指令表示,并且随机选择函数从多个情况中选择特定情况以执行。
[0282]
在一些实施例中,在基于表达树生成字节代码指令的集合之后,如果在字节代码指令的集合的结束处不存在光线停止指令,则编译器1420在字节代码指令的集合的结束处添加光线停止指令。
[0283]
总之,所公开的技术使得能够针对材料着色有效地评估材料图。可编程渲染引擎耦合到一个或更多个树遍历单元和一个或更多个流式多处理器。渲染引擎包括多个mimd处理核心和在多个处理核心之间共享的多个管线。每个管线是被配置为执行与材料图相关联的特定复杂函数或评估的固定功能单元。材料图被编译成用于渲染引擎的汇编语言指令集合。
[0284]
当渲染引擎接收到光线时,渲染引擎将该光线指派给多个处理核心中的处理核
心。处理核心基于该光线和该相交表面执行经编译的材料图。当处理核心执行管线对应的指令时,处理核心将运行参数发送给管线并接收管线生成的相应输出。
[0285]
在一种方法中,流式多处理器向树遍历单元提供光线以用于评估。树遍历单元确定与光线相交的表面,并将光线和表面发送给渲染引擎进行素材着色。可替代地,流式多处理器可以向渲染引擎发送光线和表面以进行材料着色。渲染引擎执行经编译的材料图,并向树遍历单元或流式多处理器返回相应的颜色。
[0286]
在一种方法中,流式多处理器利用渲染引擎的多个管线来执行与管线相关联的函数或评估。流式多处理器将输入发送到多个管线中的特定管线,而不是发送到渲染引擎以用于指派到处理核心。管线对输入执行相关联的函数或评估,并将输出发送到流式多处理器。
[0287]
在一种方法中,流式多处理器向渲染引擎提供光线以用于重要性采样。除了生成用于执行材料图的汇编语言指令的集合之外,编译器还生成用于基于材料图执行重要性采样的汇编语言指令的集合。渲染引擎基于光线执行重要性采样指令,并将针对辅助光线的方向返回到流式多处理器。
[0288]
所公开的技术的至少一个技术优点是提供了渲染引擎,该渲染引擎被特别设计成相对于现有技术解决方案以提高的效率执行光线追踪操作和其他串行处理任务。因而,渲染引擎可被合并到gpu或其他并行处理单元中,并且不能跨gpu或其他并行处理单元内的常规处理元件有效地并行化的处理任务可被卸载到渲染引擎,这增加了总体处理性能和吞吐量。对此,在渲染引擎内实现多个mimd(多输入、多数据)处理核心,其中每个处理核心被配置为异步地处理不同的光线或串行处理工作的其他单元,这使得光线跟踪操作和其他串行处理任务能够跨不同的处理核心大部分并行地执行。另外,为了进一步改进总体处理吞吐量,渲染引擎包括被设计成执行某些专用处理任务的多个管线。在操作期间,处理核心可以将专用处理任务卸载到不同管线,并且驻留在渲染引擎内的调度器被配置成以优化方式跨不同管线调度所卸载的任务。此外,可以优化由管线执行的专用处理任务,以提高各个处理任务的处理吞吐量。
[0289]
另一技术优点是每个材料图被编译成用于渲染引擎的单个汇编语言指令集。与现有技术方法不同,不需要将材料属性和材料属性参数的不同置换分别编译成多个材料着色器程序。此外,在编译期间,编译器可基于材料图语义、不同材料属性参数和渲染引擎的硬件架构来优化指令。
[0290]
1.在一些实施例中,一种计算机实现的方法,用于处理包括在执行单元中的固定功能管线内的数据,所述方法包括:从第一处理单元接收第一输入,其中所述第一输入对应于第一固定功能;对所述第一输入执行所述第一固定功能以生成第一输出,其中在对从正处理多条光线的多个处理核心接收到的一个或更多个输入执行所述第一固定功能之前,对所述第一输入执行所述第一固定功能,并且其中每条光线表示从光源到三维(3d)环境内的至少一个点的路径;以及将所述第一输出传输至所述第一处理单元以供进一步处理。
[0291]
2.根据条款1所述的方法,还包括:从第二处理单元接收第二输入,其中所述第二输入对应于所述第一固定功能;以及对所述第二输入执行所述第一固定功能以生成第二输出,其中在对从所述多个处理核心接收到的所述一个或更多个输入执行所述第一固定功能之前,对所述第二输入执行所述第一固定功能。
[0292]
3.根据条款1或2所述的方法,还包括:将所述第二输出传输至所述第二处理单元以供进一步处理。
[0293]
4.根据条款1至3中任一项所述的方法,其中所述多个处理核心被包括在所述执行单元中。
[0294]
5.根据条款1至4中任一项所述的方法,其中所述第一处理单元与所述执行单元分离。
[0295]
6.根据条款1至5中任一项所述的方法,其中从所述多个处理核心接收到的所述一个或更多个输入由调度器发送。
[0296]
7.根据条款1至6中任一项所述的方法,还包括:响应于从所述第一处理单元接收到所述第一输入,使所述调度器在发送所述一个或更多个输入之前等待。
[0297]
8.根据条款1至7中任一项所述的方法,其中使所述调度器在发送所述一个或更多个输入之前等待包括:向所述调度器发送通知。
[0298]
9.根据条款1至8中任一项所述的方法,其中使所述调度器在发送所述一个或更多个输入之前等待包括:将信号设置为指示从所述第一处理单元接收到所述第一输入的值。
[0299]
10.根据条款1至9中任一项所述的方法,其中将所述第一输出传输至所述第一处理单元包括:将所述第一输出传输至调度器。
[0300]
11.根据条款1至10中任一项所述的方法,其中所述调度器确定所述第一输出与所述第一处理单元相关联并且将所述第一输出发送至所述第一处理单元。
[0301]
12.根据条款1至11中任一项所述的方法,其中从所述第一处理单元接收所述第一输入包括:接收与所述第一处理单元相关联的标识符,并且其中将所述第一输出传输至所述调度器包括:传输与所述第一处理单元相关联的所述标识符。
[0302]
13.根据条款1至12中任一项所述的方法,还包括:在对所述第一输入执行所述第一固定功能之后,对包括在从所述多个处理核心接收到的所述一个或更多个输入中的第二输入执行所述第一固定功能以生成第二输出。
[0303]
14.在一些实施例中,一种执行单元,包括:多个处理核心,所述多个处理核心至少部分地并行地对不同数据执行不同指令,其中所述不同数据与从并行处理单元接收的工作相关联;以及多个处理管线,所述多个处理管线对从所述多个处理核心接收到的数据执行专门函数。
[0304]
15.根据条款14所述的执行单元,还包括调度器,所述调度器从所述多个处理核心接收数据并且将所述数据发送到所述多个处理管线。
[0305]
16.根据条款14或15所述的执行单元,其中所述不同指令包括一个或更多个不同的材料着色指令集合。
[0306]
17.根据条款14至16中任一项所述的执行单元,其中所述不同指令包括一个或更多个不同的重要性采样指令集合。
[0307]
18.根据条款14至17中任一项所述的执行单元,其中所述多个处理管线包括第一处理管线,所述第一处理管线从所述多个处理核心和未包括在所述执行单元中的一个或更多个处理单元接收与第一专门函数相对应的多个输入,并且基于所述多个输入生成多个输出。
[0308]
19.根据条款14至18中任一项所述的执行单元,其中从所述多个处理核心接收到
的数据包括多条光线,并且每条光线表示从光源到三维(3d)环境内的至少一个点的路径。
[0309]
20.根据条款14至19中任一项所述的执行单元,其中所述专门函数包括一个或更多个材料图函数。
[0310]
以任何方式记载在任何权利要求中的任何权利要求元素和/或本技术中描述的任何元素的任何和所有组合均落入本发明和保护的范围内。
[0311]
出于说明目的已经呈现了各个实施例的描述,但并不意图穷尽为或限制为所公开的实施例。在不偏离所述实施例的范围和精神的情况下,对于本领技术人员来讲,许多修改和变化将是显而易见的。
[0312]
本实施例的方面可体现为系统、方法或计算机程序产品。因此,本公开的方面可采取完全硬件实施例、完全软件实施例(包括固件、常驻软件、微代码等)或组合软件和硬件方面的实施例的形式,本文中全部统称为“模块”、“系统”或“计算机”。此外,本公开描述的任何硬件和/或软件技术、工艺、功能、组件、引擎、模块或系统都可以作为电路或一组电路实现。此外,本公开的方面可采用一种或多种计算机可读介质中体现的计算机程序产品的形式,该计算机可读介质上包含计算机可读程序代码。
[0313]
可以使用一种或更多种计算机可读介质的任意组合。计算机可读介质可以是计算机可读信号介质或计算机可读存储介质。例如,计算机可读存储介质包括但不限于电子、磁、光、电磁、红外或半导体系统、装置或设备,或上述任何适当的组合。计算机可读存储介质的更具体的示例(非穷尽列举)可包括:具有一根或更多根电线的电气连接、便携式计算机磁盘、硬盘、随机存取存储器(ram)、只读存储器(rom)、可擦除可编程只读存储器(eprom或闪存)、光纤、便携式光盘只读存储器(cd-rom)、光存储设备、磁存储设备或上述任何合适的组合。在本文档的上下文中,计算机可读存储介质可以是任何有形介质,其可以包括或存储程序,以供指令执行系统、装置或设备使用或与指令执行系统、装置或设备结合使用。
[0314]
本公开的方面参照根据本公开的实施例的方法、装置(系统)和计算机程序产品的流程图和/或框图进行了描述。应理解,流程图和/或框图中的每个框,以及流程图和/或框图中的框的组合,都可以由计算机程序指令实现。这些计算机程序指令可以提供给通用计算机、专用计算机或其他可编程数据处理装置的处理器,以产生机器。该指令在由计算机或其他可编程数据处理装置的处理器执行时,使得能够实现流程图和/或框图的一个或更多个框中指定的功能/动作。此类处理器可以是但不限于通用处理器、专用处理器、特定于应用程序的处理器或现场可编程门阵列。
[0315]
图中的流程图和框图示出了根据本公开的各种实施例的系统、方法和计算机程序产品的可能实现的体系架构、功能和操作。在这方面,流程图或框图中的每个框可以表示代码的模块、段或部分,代码包括用于实现一个或更多个指定逻辑功能的一个或更多个可执行指令。还应指出,在一些替代实施例中,框中指出的功能可不按图中指出的顺序发生。例如,连续显示的两个框实际上可以大致同时执行,或者这些框有时可以相反的顺序执行,这取决于所涉及的功能。还应注意,框图和/或流程图中的每个框,以及框图和/或流程图中框的组合,可以由基于专用硬件的系统实现,该基于专用硬件的系统执行指定功能或动作或专用硬件和计算机指令的组合。
[0316]
虽然前述内容是针对本公开的实施例,本公开的其他和进一步实施例可以在不偏离其基本范围的情况下设计,其范围由所附权利要求确定。
再多了解一些

本文用于创业者技术爱好者查询,仅供学习研究,如用于商业用途,请联系技术所有人。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表