掌桥专利:专业的专利平台
掌桥专利
首页

对路径描边的补丁区段、顶端和连接统一编码

文献发布时间:2023-06-19 11:39:06


对路径描边的补丁区段、顶端和连接统一编码

本申请是Mark Kilgard于2019年12月13日提交的名为“用于矢量图形的极坐标描边(POLAR STROKING FOR VECTOR GRAPHICS”的序列号为16/714,621的美国申请的部分继续申请,其要求Mark Kilgard于2019年12月10日提交的名称为“用于矢量图形的极坐标描边(POLAR STROKING FOR VECTOR GRAPHICS”序列号为62/946,267的美国临时申请的优先权,该申请与本申请共同转让,并通过引用将它们的全部内容都并入本文。

技术领域

本申请总地涉及表示包括区段(segment)和接合点(junction)的路径,并更具体涉及编码路径。

背景技术

矢量图形(如在PostScript,PDF,可缩放矢量图形,OpenVG,Flash等中使用的)以两种方式之一渲染形状和文本:填充(本质上是“在形状内着色”)或描边(本质上是“描绘形状的轮廓”)。这些形状通常称为“路径(paths)”,渲染填充的或描边的(stroked)路径的过程通常称为“路径渲染”。

现有方法通过包含大量CPU预处理的较慢的CPU光栅化技术或较快的GPU方法来执行描边。对基于CPU的预处理的需求常常使GPU描边方法受到CPU运行的限制。此外,用于GPU描边方法的基于CPU的预处理通常会将渲染状态(例如描边宽度、顶端(cap)样式和连接(join)样式)组合到路径的GPU表示中,这样例如通过重新曲面细分更改起来就变得很昂贵。这样的GPU表示比路径的原始表示占用多得多的内存。

发明内容

在一方面,本公开提供一种编码路径的方法。在一个示例中,该方法包括:(1)接收具有多个链接的路径,其中该连接包括至少一个区段和至少一个接合点;以及(2)通过基于该链接的位置信息编码该链接来生成编码的链接,其中,该编码针对每个链接采用相同的数据结构。

在另一方面,本公开提供一种路径的描边系统。在一个示例中,该描边系统包括:(1)路径处理器,配置为将路径分解为链接并编码该链接,其中,该链接包括至少一个区段和至少一个接合点,其中,该路径处理器配置为针对每个链接采用相同的数据结构来编码该路径;以及(2)描边处理器,配置为将经编码的路径曲面细分为与路径的描边区域对应的几何图元。

在又一方面,本公开提供一种渲染器。在一个示例中,渲染器包括:(1)第一处理器,配置为将路径分解为链接并将该链接编码为经索引的链接,其中,该链接包括一个或更多个区段和一个或更多个接合点;以及(2)第二处理器,配置为使用经索引的链接基于每个链接的极坐标描边表示生成路径的描边曲面细分。

在再一方面,本公开提供一种从数据结构确定路径的链接的类型的方法。在一个示例中,该确定链接的类型的方法包括:(1)分析编码链接的数据结构,该数据结构具有涉及对应于该链接的控制点坐标数组的多个索引;以及(2)基于用于该索引中的至少一个索引的至少一个索引空值的存在确定链接的类型。

在又一个方面,本公开提供一种编码路径的方法,该路径包括多个区段和连接各个连续的相邻区段对的多个接合点。在一个示例中,该编码方法包括:(1)对于每个区段,并且对于每个区段使用相同的表示格式,将该区段编码为第一经索引的链接;以及(2)对于每个接合点,并且使用相同的表示格式,将接合点编码为第二经索引的链接。每个区段是三次贝塞尔区段,二次贝塞尔区段,锥形区段或线段,每个接合点是顶端或连接,并且第一经索引的链接和第二经索引的链接包括字段,该字段的值指示在给定的实例中区段或接合点是否被编码。

现在结合附图参考以下描述,其中:

图1示出了根据本公开原理的具有可以被编码的至少一个区段和至少一个接合点的路径的示例的图示;

图2示出了根据本公开原理的构造为编码路径的描边系统的示例的框图;

图3示出了根据本公开原理的构造为执行路径编码的渲染器的示例的框图;

图4示出了根据本公开原理的构造为执行路径编码的渲染器的另一示例的框图;

图5示出了根据本公开原理构造的使用经编码的路径的极坐标描边的方法的示例的流程图;

图6、图7、图8和图9示出了根据本公开原理构造的路径区段和其经索引的链接的编码的示例;

图10至图14示出了根据本公开原理的来自图1的路径和编码路径的不同链接的示例;

图15示出了根据本公开原理构造的图1的完整路径的编码的示例;

图16示出了根据本公开原理执行的从经索引的链接确定链接类型的示例的流程图;

图17示出了根据本公开原理的配置为利用极坐标描边显示路径的计算设备的示例的框图;以及

图18示出了根据本公开原理的配置为利用描边打印路径的打印机的示例的框图。

本公开提供了用于对路径进行编码的改进,该改进使路径区段和路径接合点统一。本公开采用经索引的链接编码来为路径区段和路径接合点两者提供统一的紧凑表示。紧凑的表示非常适合使用例如网格着色器进行GPU访问和GPU曲面细分。紧凑的表示是具有内存效率编码的数据结构,该编码采用索引来对路径的冗余控制点进行去重。可以使用区段和接合点的位置信息快速构建数据结构,而无需递归处理。另外,数据结构可以将映射从位置顶端和连接类型推迟(defer)到几何顶端和连接类型,直到渲染为止。因此,在改变描边宽度、顶端样式或连接样式的处理相对便宜的情况下,提供了灵活的渲染。

如本文所使用的路径是零个或更多个在本文中被称为链接(link)的路径组件的序列。路径的链接由控制点的有序集合指定,并且可以是路径区段或路径接合点。路径区段是从其第一个控制点到最后一个控制点指定描边路径区段的链接。路径接合点是按顺序连接两个区段或者未连接到任何区段的情况下开始或终止路径区段的链接。连接接合点是连接两个路径区段的链接。非连接接合点是不连接其他区段的区段的链接。连接接合点也称为连接(join);非连接接合点也称为顶端(cap)。

链接有利地提供了一种统一的方式来处理区段、顶端和连接,该方式也非常适合于并行处理(例如通过GPU)。如上所述,链接具有控制点,生成曲线(在本文中也称为生成方程)是由链接的控制点指定的参数曲线。控制点是确定的二维(2D)位置,被指定为(x,y)2D坐标对或用于锥形(有理)贝塞尔路径段的(x,y,w)有理2D坐标三元组。有两种类型的控制点,内插控制点和外推控制点。内插控制点是区段或接合点包括的控制点,外推控制点是建立区段或接合点的梯度方向的控制点。

路径可以包括连接在一起的不同链接的各种布置。一个示例是闭合链接序列,它是其中初始链接的初始控制点和末端链接的末端控制点位于同一位置并共享连接接合点的连接的区段的序列。因此,闭合链接序列缺少路径顶端。开放链接序列是另一个示例,它是其中初始区段链接的初始控制点和末端区段链接的末端控制点不共享连接接合点的连接的区段的序列。闭环序列也称为轮廓(contour),开放链接序列也称为轨迹。与闭合链接序列不同,开放链接序列具有路径顶端。路径顶端是标记路径的连接链接序列的开始或结束的非连接链接。更具体地说,初始路径顶端是开始连接的区段的开放序列的链接,而末端路径顶端是结束连接的区段的开放链接序列的链接。

本公开提供一种用于编码路径的方法和系统,该方法和系统对链接进行统一编码而不管链接是区段还是接合点。所公开的链接编码使用相同的数据结构,即链接结构,来编码路径的区段和接合点。数据结构包括紧凑格式的链接的必要位置信息,其允许对描边进行高效解码。位置信息可以是链接的坐标值,也可以是对坐标值的引用。除了紧凑之外,该数据结构还被构造为提供GPU的高效并行曲面细分(以及随后的光栅化)过程。GPU被设计为有效地处理索引的顶点数据,因此可以有效地处理所公开的紧凑数据结构。

用于紧凑地编码路径的数据结构可以是经索引的链接的数组(array),该经索引的链接的数组通过到路径的控制点坐标数组的控制点索引为每个链接指定控制点。控制点坐标数组是包括编码路径的控制点坐标的数组。每个经索引的链接是与个体链接相对应的数据结构,该个体链接为其链接指定了控制点作为到编码路径的控制点坐标数组中的控制点索引。索引值,称为空索引值,是被指定用于指示不必要的控制点的特殊索引值。空索引值可以为零。经索引的链接中一个或更多个空索引值的位置会编码链接的类型。控制点坐标数组包括至少一个空值,并且经索引的链接基于存在或不存在与空值相对应的一个或更多个空索引值来指示链接类型。

如上所述,数据结构可以是紧凑的。例如,经索引的链接可以具有8位或16位索引,用于表示由一个或两个区段或接合点“共享”的共享内插控制点。这样,可以存储链接的编码表示以及它们形成的路径,而无需大量内存。经索引的链接中的索引可以小到六个无符号字节(能够处理具有255个或更少控制点的任何路径)。实际上,此数量的控制点足以用于字形、简单徽标、圆角矩形和其他基本形状的大部分路径。当一控制点通常是两个32位浮点值(8个字节)时,六个字节的小链接大小小于单个控制点。对于具有多于255个控制点的路径,可以使用16位索引甚至32位索引,并且仍然保持紧凑的结构。

如本文所公开的索引还允许将控制点存储一次并将其索引几次。考虑到路径的标准情况是连接三次贝塞尔区段的序列,每个三次区段可以有三个新的控制点(24=3*8字节),因为每个区段与上一个区段的末端控制点“共享”其初始控制点。而且,每对连接的路径区段之间的连接接合点(连接)不需要额外的控制点,但可以索引来自其正在连接的两个路径区段的控制点。当绘制详细的图形(例如整个城市的街道地图时,尤其是当存在下水道管线,煤气管线,电子管线等时),这种紧凑性是有益的。复杂图形的另一个示例是印刷电路板(PCB)或芯片布图。

由于紧凑的数据结构的另一个优点是控制点坐标数组通常将是浮点x和y值(每个坐标四个字节,每个点八个字节),但是也可以是16位带符号的整数值(每个坐标2个字节,每个点4个字节)。因此,控制点坐标数组的大小可以减半。此外,可以将使用控制点编码为16位整数的路径转换为渲染(曲面细分和光栅化)过程的一部分,以将路径拉伸/平移/投影到任何替代坐标空间中。有利地,标准TrueType字体文件格式的字形被存储为16位带符号整数值,其允许匹配字体的路径渲染。在一些示例中,如果各种格式需要的话,则可以存储8位坐标。

描边路径曲面细分过程也表明了所公开的数据结构的紧凑性优势。例如,在描边路径曲面细分过程中会生成四边形序列。对于曲线的链接,链接可能会被曲面细分为数十个或数百个四边形。存储曲面细分比存储生成曲面细分的数据结构(如经索引的链接)需要更多的内存。即使线段与每个连接的区段之间的连接一起存储也是如此。每个线段的四边形仍将需要存储。与仅存储一个相比这意味着存储四个2D点,因为每个线段实际上只增加了一个新的控制点。需要附加的控制点的连接还必须处理;特别是对于圆形连接。

如上所述,数据结构允许对描边进行高效解码。该描边可以是采用沿路径的链接(区段和接合点二者)以切线角步进的极坐标描边,以提供路径的极坐标描边表示。沿路径以切线角步进包含“求解”,以确定一链接何时可能从顺时针转弯变化为逆时针转弯(反之亦然),然后在每个步骤中求解链接的梯度何时与每个切线角步长的90度旋转垂直。这种方法可以采用三角函数,并沿路径在每个步骤中求解线-曲线交点。

极坐标描边表示可以用于生成路径的描边曲面细分(tessellation)。例如,链接的极坐标描边表示可以是代表该链接的多边形(例如四边形)序列,并且可以用于生成描边曲面细分。对于采用CPU生成描边曲面细分的现有方法,切线角的步进将是一种昂贵的方法。诸如GPU之类的并行处理器的有效三角函数评估(sin,cos,atan2)使以切线角步进的求解步骤完全可行。例如,由于极坐标描边方法确定要采取多少步骤而无需递归处理,因此极坐标描边方法可以很好地映射到GPU曲面细分和网格着色器。整个极坐标描边方法(例如曲面细分、光栅化和着色)可以由GPU执行。

所公开的极坐标描边可以被用来在包括网络浏览器(可缩放矢量图形(SVG)),文档查看器(PDF),导航和地图系统以及插图应用程序(Adobe Illustrator,Inkscape)在内的几个不同领域中改善描边路径渲染的性能和质量。极坐标描边也可以用于控制根据输入路径执行操作的不同机器。例如,根据输入路径处理材料的计算机数控(CNC)机器。在描边扩展发生在与路径本身不同的坐标空间中的情况下,极坐标描边也很有用。典型的用途是窗口空间描边(在SVG中称为非缩放描边)。这对于诸如地图和导航系统之类的应用程序是有利的,在这些应用程序中,描边以像素为单位(通常为1)的宽度指定,因此在缩放到地图时,网格线或标记的宽度不会也缩放。如采用所公开的编码,极坐标描边方法还可以处理路径的每个链接,而无需针对不同类型的链接进行特殊安排。

现在转到附图,图1示出了根据本公开的原理进行编码的具有至少一个区段和至少一个接合点的路径100的示例的图。路径100包括起始顶端110,第一三次贝塞尔区段120,连接130,第二三次贝塞尔区段140和末端顶端150。起始顶端110和末端顶端150是非连接接合点的示例,连接130是连接接合点的示例。起始顶端110和末端顶端150是圆形顶端的示例。可以类似地编码其他类型的顶端,例如矩形顶端、三角形顶端或甚至没有顶端。连接130是圆形连接的示例。可以类似地编码其他类型的连接,例如,斜角(bevel)、三角形、尖角(miter)、截短的尖角和回复的尖角(reverted miter)。

还示出了路径100的控制点161至167。控制点161、164和167是在不同链接之间共享的内插控制点。控制点161在起始顶端110和第一三次贝塞尔区段120之间共享,控制点164在三次贝塞尔区段120、连接130和第二三次贝塞尔区段140之间共享,控制点167在第二三次贝塞尔区段140和末端顶端150之间共享。有利地,共享控制点可以在数据结构中被多次索引,并减少所需的存储容量的量。控制点162、163、165和166都是外推控制点。

用于链接的控制点161至167的坐标值在图1中也被示为x,y坐标。图10至图14示出了路径100的不同链接以及包括坐标值的路径100的对应的控制点坐标数组的示例。图10至图14还包括数据结构、经索引的链接的示例,其用于编码每个不同的链接。路径100可被提供给例如图2所示的描边系统,用于生成路径的描边表示。描边系统可以是根据图5的方法500操作的极坐标描边系统。

图2示出了根据本公开原理的构造成编码路径的描边系统200的示例的框图。描边系统200可以是绘制路径的描边曲面细分的渲染器,或者是其一部分。描边系统200可以是采用经编码的路径进行描边的极坐标描边系统。描边系统200可以位于单个计算设备上或分布在多个计算设备上。计算设备可以是例如膝上型计算机、台式计算机、计算板、智能电话或服务器。计算设备可以包括用于显示路径的至少一个屏幕。计算设备也可以是机器或用于控制机器。例如,描边系统200可以与诸如打印路径的打印机或使用路径处理材料的CNC机器之类的机器相关联或与之集成。在一些示例中,描边系统200是基于云的服务器的一部分,其可以用于基于云的渲染,也可以用于游戏流。游戏流允许用户从他们的输入设备(例如键盘、游戏控制器(包括虚拟现实输入控制器)和鼠标)控制和玩远程渲染的游戏。基于云的渲染平台和游戏流可以允许用户通过通信网络在视频游戏中与其他人进行远程竞争。描边系统200包括路径处理器210和描边处理器220。描边系统200可以包括不止一个路径处理器210或不止一个描边处理器220。路径处理器210可以是中央处理单元(CPU)或图形处理单元(GPU)。在一个示例中,路径处理器210是CPU,而描边处理器220是GPU。有利地,GPU可以包括多个并行处理器以允许并行处理多个链接。在一些示例中,路径处理器210和描边处理器220可以是单个处理器。

描边系统200被配置为接收要表示的路径并生成经编码的路径表示。所接收的路径可以是表示该路径的链接的生成方程的代码形式,例如SVG路径命令。每个链接的生成方程包括该链接的控制点。路径可以来自,例如Web浏览器,文档查看器,导航或地图系统,或插图应用程序,例如矢量图形程序。所接收的路径可以是简单的,例如图1的路径100,或复杂的,具有以多种组合形成序列的多种类型的区段和接合点。

路径处理器210被配置为将接收到的路径分解为链接,例如路径100的区段、顶端和连接,并针对每个链接使用相同的数据结构编码这些链接以进行存储。数据结构可以是如本文所公开的经索引的链接。例如,路径处理器210可以接收路径100并且将路径100分解为图1中所示的各个区段、顶端和连接,并对区段、顶端和连接进行编码以进行存储。编码的链接可以被存储在描边处理器220的存储器中。这样,路径处理器210将链接编码成可以存储和被描边处理器220读取的格式。编码的链接和链接的控制点被下载到描边处理器220以表示路径100。路径处理器210可以被配置为在指示描边处理器220生成链接的描边表示之前对链接执行附加处理以使能描边。附加处理可以对应于由图3的CPU 310执行的处理。

此时,路径处理器210将命令发送到描边处理器220,指示描边处理器220生成路径链接的描边表示。该描边表示可以是极坐标描边表示。可以通过编程接口将命令从路径处理器210发送到描边处理器220,其中命令表现为函数调用。链接可以生成为图元(例如补丁),也可以生成为任务。生成的极坐标描边表示可用于可视地表示路径。例如,描边处理器220可以将描边表示提供给计算设备屏幕以显示路径。计算设备可以是例如膝上型计算机,台式计算机,计算板,智能电话或具有能够显示极坐标描边表示的屏幕的另一种类型的计算设备。描边处理器220还可提供描边表示以打印路径或操作采用该路径的机器。例如,描边系统200可以与采用描边表示来打印路径的打印机集成。

描边处理器220可以被配置为基于由路径处理器210生成的经编码的路径生成描边表示。描边处理器220可以根据本文公开的极坐标描边算法进行操作。因此,描边处理器220可以有效地编码本文公开的算法,例如由图5的流程图表示的算法。

描边处理器220可以并行地生成链接的描边表示。在一些示例中,描边处理器220可以并行生成多个路径的描边表示。因此,描边处理器220可以并行地在多个路径上操作,同时还可以并行地在那些路径的多个链接上操作。如本文所使用的,“并行”包括至少部分地并行,并且指示处理是在并行路径中发生的,但不一定同时发生。

描边处理器220可以是GPU,并且根据图形管线进行操作,其中极坐标描边的某些步骤在沿着图形管线的特定阶段发生。描边处理器220可以经由图形管线的一个或更多个着色器来提供描边功能,诸如极坐标描边。可替代地,经编码的路径可以采用用于描边路径的其他方法(例如统一参数曲线细分)进行描边。着色器是在图形管线的特定阶段执行特定的一个或更多个功能的程序。极坐标描边着色器是已被编程为执行本文公开的极坐标描边功能的着色器的示例。极坐标描边着色器可以执行通常包含在图形管线中的附加功能,也可以作为图形管线的一个或更多个着色器的一部分执行。描边处理器220可以采用诸如图3或图4所示的图形管线的不同示例之一。

图3示出了根据本公开原理的渲染器300的示例的框图,该渲染器300包括被构造为执行极坐标描边的图形管线。渲染器300提供用于极坐标描边的系统的示例,例如图2的描边系统200。渲染器300使用极坐标描边来渲染路径。渲染器300包括CPU 310,GPU 320以及另一硬件组件,存储器330。

CPU 310被配置为接受或接收路径,将路径分解为链接,针对每个链接使用相同的数据结构来编码链接,以及通过图形命令将链接和控制点下载到GPU 320。CPU 310还被配置为绑定GPU 320的极坐标描边着色器。绑定可以包括建立用于极坐标描边着色器的当前配置并设置变量。CPU 310还为极坐标描边着色器设置统一变量(uniform)。在着色器处理过程中,统一变量的值不变。统一变量是极坐标描边过程持续时间内的常量。例如,描边宽度可以设置为5。配置的另一部分可以包括通过旋转,平移,缩放或投影来变换路径的坐标空间。此时,CPU 310向GPU 320发送命令,指示GPU 320绘制路径的链接。可以通过编程接口将命令从CPU 310发送到GPU 320,其中命令表现为函数调用。如上所述,链接可以绘制为补丁或任务。其他图元(例如三角形)也可以被图形管线采用来进行渲染。

GPU 320包括用于处理表示路径的图元的可编程图形管线321。该图元可以是补丁,并且将用作讨论图形管线321的操作的示例图元。图形管线321包括顶点拉取器322,顶点着色器323,曲面细分控制着色器324,曲面细分生成器325,曲面细分评估着色器326,图元组件和光栅化器327以及片段着色器328。某些阶段,诸如顶点拉取器322、曲面细分生成器325、图元组件和光栅化器327,是图形管线321的固定功能的GPU阶段。其他图解说明的阶段,即顶点着色器323、曲面细分控制着色器324、曲面细分评估着色器326和片段着色器328,是图形管线321的可编程着色器GPU阶段。能够使用OpenGL 4.0,用于嵌入式系统(ES)3.2的OpenGL,Direct3D 11或类似的图形应用程序编程接口的GPU提供具有这些阶段的此类可编程图形管线321。OpenGL 4.0和OpenGL ES 3.2可从位于俄勒冈州比弗顿的KhronosGroup公司获得,而Direct3D 11可从华盛顿州雷蒙德的Microsoft公司获得。可从加利福尼亚州圣塔克拉拉市的Nvidia公司获得的GPU,诸如具有Volta或Pascal架构的GPU,是可以提供可编程图形管线321的GPU的示例。如以下参照图5所述,图形管线321的各个阶段也可以被配置为执行极坐标描边方法500的步骤。

顶点拉取器322是图形管线321的第一阶段,其提取补丁的顶点。顶点着色器323然后描述每个顶点的各种特性。曲面细分控制着色器324、曲面细分生成器325和曲面细分评估着色器326协作将补丁曲面细分成三角形网格或相连的线。曲面细分控制着色器324和曲面细分评估着色器326是用于GPU曲面细分的两个可编程阶段,而曲面细分生成器325是固定功能的GPU阶段。曲面细分控制着色器324作为GPU曲面细分的第一阶段执行补丁范围的计算,例如计算每个补丁的细节水平(LOD)。曲面细分生成器325使用曲面细分水平将补丁分解为新的一组图元,并为每个顶点分配坐标。曲面细分评估着色器326基于曲面细分控制着色器324和曲面细分生成器325提供的信息评估网格顶点。曲面细分评估着色器326从曲面细分生成器325计算每个顶点的位置,控制曲面细分图案,并指定生成的补丁的方向。

在意图用于管线321的链接的示例表示中,具有六个控制点的补丁对每个链接进行编码。图10-图15示出了其中每个经索引的链接包括六个控制点的经索引的链接的数组的示例。六个控制点足以索引三次贝塞尔区段的四个控制点,另外两个足以索引初始和末端梯度控制点。其他类型的链接需要较少的控制点。特殊的控制点索引值(例如零)可用于编码特定类型的链接。熟练的从业人员将认识到这样的链接表示非常适合于顶点拉取器322,并且可以紧凑地存储在存储器中。

图元组件和光栅化器327将由曲面细分评估着色器326生成所得的曲面细分补丁划分为用于渲染的各个光栅化图元(通常为三角形)的序列。然后,片段着色器328计算基本补丁的每个像素的颜色和其他属性。存储器330从可编程图形管线321的片段着色器328接收像素更新。存储器330包括存储所接收的像素更新的帧缓冲器334,其提供用于显示的图像。在此示例中,图像是路径的描边曲面细分。在一些示例中,存储器330是视频存储器,其中一系列描边的曲面细分被编码为视频流。

用以完成适合于来自可编程图形管线321的路径描边的曲面细分的关键细节并不明显。曲面细分生成器325通常生成密集的矩形2D网格,网格的宽度和高度在一侧限制为64。描边路径段、顶端或连接的曲面细分通常需要被曲面细分为长条四边形(有时长100s),而不是密集的网格。为了精确地细分需要大量细分的链接,细分的条可能需要比细分生成器325可以生成的密集网格的最大宽度或高度(对于任何一个通常为64)长很多倍。一种非显而易见的技术(此处称为NaN中毒(NaN poisoning))(表示为非数字或NaN,是无效的浮点值),将密集的网格划分为适当的(可能很长)条带,以描边摸任意链接。在可编程图形管线321的示例使用中,在曲面细分评估着色器326上执行的极坐标描边着色器生成用于要丢弃的三角形的顶点的位置的NaN值。图元组件和光栅化器327无法处理具有一个或多个NaN位置值的光栅化图元,因此必须丢弃任何此类“NaN中毒”的图元。其余未丢弃的三角形具有由曲面细分评估着色器326计算的(无NaN)顶点位置,因此,当由图元组件和光栅化器327处理时,这些三角形将接缝在一起成一长条,以形成与预期的描边曲面细分相对应的连续三角形条。编排NaN中毒和条接缝涉及在曲面细分控制着色器324上运行的极坐标描边着色器,以将适当的网格和相关参数馈送到曲面细分生成器325和曲面细分评估着色器326。

图4示出了根据本公开原理的渲染器400的另一示例的框图,该渲染器包括构造为执行极坐标描边的图形管线。渲染器400提供了用于极坐标描边的系统的另一示例。渲染器400包括CPU 410、GPU 420和存储器430。GPU 420包括图形管线421,该图形管线421与图3中的GPU 320的图形管线321一样,类似地提供链接的描边的曲面细分。然而,图形管线421的GPU曲面细分由两个可编程阶段提供,由任务着色器424和网格着色器426,而不是图形管线321的曲面细分控制着色器324、曲面细分生成器325和曲面细分评估着色器326。图形管线421和渲染器400的其他组件可以被配置为并且作为与图3的图形管线321和渲染器300的相同命名的组件运行。这样,片段着色器428是另一个可编程着色器GPU阶段,图元组件和光栅化器427是固定功能的GPU阶段。可从Nvidia公司获得的GPU,诸如具有Turing架构的GPU,是可用于可编程图形管线421的GPU的一个示例。图2的路径处理器210可以作为图3的CPU 310和图4的CPU 410运行。虽然图形管线321在表示每个链接的补丁上操作,但是图形管线421在可表示一个或更多个链接的任务上操作,并且还生成繁衍网格着色器实例以生成必要的曲面细分。

任务着色器424被编程为执行图3的顶点着色器323和曲面细分控制着色器324的功能。这样,与图3不同,任务着色器424确定其一个或更多个链接的每个顶点的各种特性,并读取顶点数据本身,而在图3中是通过固定功能顶点拉取器322拉取顶点。然后,任务着色器424执行补丁范围(patch-wide)内的计算作为GPU曲面细分的第一阶段,类似于曲面细分控制着色器324。

网格着色器426被配置为执行剩余的GPU曲面细分功能,包括通过极坐标描边将一个或更多个链接分解成新的一组图元,为每个顶点分配坐标以及评估网格顶点。网格着色器426还被配置为计算每个顶点的位置并控制输出网格的曲面细分图案。然后,图元组件和光栅化器427将所得的网格划分为用于渲染的各个三角形的序列,并且片段着色器428计算基本链接的每个像素的颜色和其他属性。然后像素更新被提供给存储器430的帧缓冲器434,以用于显示路径的描边曲面细分。如以下参考图5所指出的那样,任务着色器424和网格着色器426也可以被配置为执行极坐标描边方法500的步骤。

图5示出了用于利用本文公开的经编码的路径生成极坐标描边表示的极坐标描边方法500的示例的流程图。极坐标描边表示可用于描边曲面细分。这样,方法500的一些步骤可以映射到诸如GPU 320或GPU 420之类的GPU。如下所述,可编程图形管线321和421的不同阶段可以被配置为执行极坐标描边方法500的至少一些步骤或特定功能。方法500的至少一些步骤也可以由图2的描边系统200执行。

方法500基本上包括两个步骤:为路径的每个链接确定极坐标描边中间位,并使用极坐标描边中间位评估用于生成每个链接的极坐标描边表示的多边形。对于方法500,四边形将用作示例多边形。方法500以接收路径开始于步骤515。该路径可以是预处理的路径,诸如从图2的路径处理器210接收的路径。

方法500进行到步骤516,在此确定是否存在要处理的路径的链接。该链接可以是区段或者接合点。链接数和链接类型将根据路径而变化。对于方法500的初始运行,将存在要处理的路径的至少一个链接。当没有要处理的路径的附加链接时,方法500继续至步骤590并结束。

当存在要处理的路径的链接(即,初始链接或下一个链接)时,方法500继续至步骤518,在该步骤中,读取链接的类型和索引。链接的类型和索引可以从表示路径的经索引的链接读取。链接的类型可以是例如由路径100的链接表示的区段、顶端或连接。例如,链接可以是起始顶端、末端顶端或连接,例如尖角连接或斜角连接。链接的索引指示链接的开始和结束。

在步骤520中,读取链接的控制点。控制点可以从每个链接的经索引的链接确定,该经索引的链接索引到路径的坐标控制点数组。如上所述,每个链接都有包括定义链接的控制点的生成方程。对于方法500,链接的表征包括链接类型,索引,生成方程和控制点。关于可编程图形管线321,步骤518和520可以由顶点拉取器322执行。

在诸如窗口空间描边的某些情况下,还根据需要在步骤530中变换控制点。变换控制点考虑用于路径的极坐标描边表示的任何旋转,平移,缩放或透视变换。关于可编程图形管线321,步骤530可以由顶点着色器323执行,而下面的步骤540可以由曲面细分控制着色器324执行。

在步骤540中,计算出链接的极坐标描边中间位。极坐标描边中间位可以使用圆弧切线从控制点计算出。极坐标描边中间位包括N,p,Ψ,δ,Δ

Ψ是与有序序列的每个元素p相对应的切线角。对于第一个p,Ψ指示链接最初朝向的角度。对于最后一个p,Ψ指示链接终止的角度。对于每个中间位p,Ψ指示其相应拐点的切线角。

δ是沿着拐点之间的链接的不同间隔要步进的度数,并且Δ

一旦获得极坐标描边中间位,就将其用于确定四边形。确定四边形是一个迭代过程,该过程从步骤550开始,并通过选择肋条(rib)继续进行到步骤560。肋条是四边形的一侧,其长度等于路径的描边宽度。一对连续的肋条可以形成四边形。对于肋条对的初始肋条,可以将索引值设置为零。在步骤570中评估肋条的位置和法线,并在步骤572中生成肋条的顶点。关于可编程图形管线321,步骤550和560可以由曲面细分生成器325执行,并且步骤570和572可以由曲面细分评估着色器326执行。每个肋条都是独立的,可以并行处理。

在步骤574中,确定是否已经评估了一对肋条。对于初始肋条,确定可以是是否为链接选择了不只一个肋条。如图5所示,可以通过将所选肋条的当前索引值与零进行比较来进行确定。如果一对肋条还没有被评估,则方法500继续至步骤580,在步骤580,确定是否有链接的更多的肋条要处理。当没有链接的其他肋条要处理时,方法500继续至步骤590并结束。对于第一次通过迭代肋条过程,将有另一个肋条要处理。当还有至少一个肋条要处理时,方法500返回步骤560,并选择下一个肋条。此时,索引可以增加一个以用于下一个肋条。在步骤570中评估下一肋条的位置和法线,并在步骤572中生成下一肋条的顶点。然后在步骤574中确定是否已经评估了一对肋条。如果否,则方法500继续至步骤580。如果是,则在步骤576中生成用于光栅化的四边形。该四边形由该对肋条的顶点限定。可以将四边形提供给光栅化器,例如图3-图4的图元组件和光栅化器327或427。可替代地,可以将四边形拆分并表示为共享公共边的两个三角形。方法500从步骤576继续到步骤580并继续。肋条的索引可以在例如步骤576或580中被重置为零,以在迭代过程中进一步指示肋条对。其他计数器或比较值也可以用于确定肋条对。例如,如图4中的网格着色器方法可生成肋条对以匹配网格着色器实例的线程并行性。

对链接的每个肋条重复生成肋条的顶点然后生成四边形的步骤。当在步骤580中确定没有链接的更多的肋条时,方法500继续至步骤516,在步骤516中,确定是否存在要处理的路径的另一链接。如果该路径没有更多链接,则方法500继续到步骤590并结束。然后,可以将用于路径链接的所有生成的四边形用于(例如)将路径渲染为描边细分。如果还有更多的链接要处理,则方法500继续到步骤518以继续下一个链接。如上所述,可编程图形管线321的不同阶段可以配置为执行方法500的指定步骤。关于可编程图形管线421,任务着色器424可以配置为执行步骤518至550,以及网格着色器426可以被配置为执行步骤560、570、572、574和576。

虽然被呈现为迭代过程,但是所有的肋条迭代可以独立地操作,因此方法500的至少部分可以在例如GPU上并行执行。可以并行地评估肋条的多个处理组,并且可以使用一个或更多个GPU来并行处理链接的多个处理组。在一个示例中,并行评估了32个肋条的序列。此外,可以同时并行评估多达32个肋条的若干这类序列。在一些示例中,来自八个链接的肋条被同时处理。

如上所述,方法500还可用于生成顶端和连接。矢量图形系统中的顶端可以是圆形,正方形,三角形或省略的。在极坐标描边中,顶端被处理为其中控制点都共同位于顶端的锚点处的退化链接。可以计算极坐标描边中间位N,p,Ψ,δ,Δ

类似地,矢量图形系统中的连接可以是圆形,斜角,尖角,三角形或省略的。在极坐标描边中,连接被作为其中控制点都共同位于连接的交接点处的退化链接处理。可以计算极坐标描边中间位N,p,Ψ,δ,Δ

路径区段的各种示例在图6-图9中示出,以显示作为数据结构的路径段的表示,该数据结构引用特定区段的控制点坐标数组,并用于编码每个不同的区段。在图6至图9中,控制点坐标数组包括空值和区段的控制点的坐标值的组合。图6至图9的每个示例数据结构都是经索引的链接。图6-图9中的经索引的链接具有被指定为索引0至5的六个坐标索引,其中六个索引中的四个被指定用于不同路径段的位置控制点,并且两个索引被指定用于不同路径段的梯度控制点。位置控制点索引是指控制点坐标数组中路径段的坐标值,而梯度控制点索引是特指路径段的梯度控制点的坐标值。每个链接的类型使用空值紧凑地编码,如随后在图16中公开的,因此路径段数据结构有利地不需要其索引以外的其他数据。

图6示出了三次贝塞尔区段600,对应的控制点坐标数组610和经索引的链接620。三次贝塞尔区段600包括四个控制点,分别表示为第一控制点602,第二控制点604,第三控制点606和第五控制点608,每个控制点具有存储在控制点坐标数组610中的坐标值。控制点坐标数组610具有十个索引槽或索引,其包括在索引2到9中的第一,第二,第三和第四控制点602、604、606和608的坐标值,以及在索引0到1中的空值。经索引的链接620的位置控制点索引0到3引用控制点坐标数组610的索引2、4、6和8。经索引的链接620的梯度控制点索引4至5引用控制点坐标数组610的索引4和6,它们是三次贝塞尔区段600的梯度控制点的坐标值。

图7示出了(无理)二次贝塞尔区段700,对应的控制点坐标数组710和经索引的链接720。(无理)二次贝塞尔区段700包括三个控制点,分别表示为第一控制点702,第二控制点704和第三控制点706,每个都具有存储在控制点坐标数组710中的坐标值。控制点坐标数组710具有八个索引,其中包括在索引2到7中的第一、第二和第三控制点702、704和706的坐标值,以及在索引0到1中的空值。经索引的链接720的位置控制点索引0到3引用控制点坐标数组710的索引2、4、0(空)和6。指向控制点坐标数组7120中的0(空)索引值的位置控制点索引2,编码该区段是二次的,而不是三次的,并反映了二次贝塞尔曲线区段仅需三个控制点的事实。经索引的链接720的梯度控制点索引4到5都引用控制点坐标数组710的索引4,其是(无理)二次贝塞尔区段700的单个梯度控制点的坐标值。如在讨论图8时要清楚的,有利的是,第二控制点704的索引是偶数值(4),以指定该区段是无理二次贝塞尔区段而不是有理二次贝塞尔区段。

如图7所示,通过为经索引的链接720的索引2指定空索引,经索引的链接720被识别为需要三个(而不是四个)控制点的二次贝塞尔区段。图8示出了锥形(有理二次贝塞尔)区段800的示例,在这种情况下为椭圆弧,其由经索引的链接820的索引2的空索引和索引1的奇数顶点索引(5)编码,指示锥形区段的外推控制点应该是(x,y,w)位置,而不是简单的(x,y)并适当地获取和转换。这样,索引2的奇数索引(控制点数组810的索引5)与索引1的空索引的组合指示由经索引的链接820编码的区段不仅是常规(无理)二次贝塞尔区段,而且是锥形区段(其是有理二次贝塞尔区段)。除了锥形区段800和经索引的链接820之外,图8还包括控制点坐标数组810。

锥形区段800包括三个控制点,分别表示为第一控制点802、第二控制点804和第三控制点806,每个都具有存储在控制点坐标数组810中的坐标值。本领域技术人员将认识到编码有理二次贝塞尔区段的值,因为这种有理区段可以准确地表示包括圆弧、椭圆弧和双曲线的锥形,与限制为表示抛物线区段的无理二次贝塞尔区段相反。由于可以对编码锥形的任何有理二次贝塞尔曲线进行归一化,使得仅第二控制点是有理的,因此有理二次贝塞尔区段的编码需要支持三分量(x,y,w)的第二控制点。控制点坐标数组810具有十个索引,包括在索引2至3中的第一控制点802的坐标值,在索引5至9中的第二和第三控制点804和806的坐标值以及在索引0至1中的空值。控制点坐标数组810没有为索引4提供特定的值,因为跳过了偶数索引值4而改用索引5(奇数),以便将该区段指定为有理二次贝塞尔区段,并编码第二控制点804的三分量齐次坐标。熟练的从业人员将认识到此编码如何有效地区分无理(偶数索引)和有理(奇数索引)二次贝塞尔区段,并允许三分量(x,y,w)的第二控制点804。经索引的链接820的位置控制点索引0到3引用控制点坐标数组810的索引2、5、0(空)和8。经索引的链接820的梯度控制点索引4到5引用控制点坐标数组810的索引5,它们是锥形区段800的单个梯度控制点的坐标值。

图9示出线段900、对应的控制点坐标数组910和经索引的链接920。(无理)二次贝塞尔区段900包括三个控制点,分别表示为第一控制点902和第二控制点904,每个都具有存储在控制点坐标数组910中的坐标值。控制点坐标数组910具有六个索引,其中包括第一控制点902和第二控制点904的坐标值以及索引0到1中的空值。经索引的链接920的位置控制点索引0至3引用控制点坐标数组910的索引2和4。经索引的链接920的梯度控制点索引4至5引用控制点坐标数组910的索引4和2。熟练的从业人员将认识到经索引的链接索引值1和2中的索引2和4的坐标值的任何编码也会产生线段。

虽然图6至图9示出了路径段以及各个路径段中的每个路径段的控制点坐标数组和经索引的链接的示例。图10-图14示出了路径100、路径100的各个链接,用于路径100的控制点坐标数组1010的示例,以及用于路径100的特定链接的经索引的链接的示例,该经索引的链接引用控制点坐标数组。控制点坐标数组1010包括十六个索引,其中,索引2至15包括路径100的控制点的控制点坐标值,以及索引0至1具有空值。图10至图14的经索引的链接包括六个索引,该六个索引引用控制点坐标数组1010的特定索引以编码路径100的特定链接。图10-图14显示了相同的数据结构用于编码路径100的所有链接,包括区段和接合点。

图10示出了用于编码路径100的起始顶端110的经索引的链接1020。经索引的链接1020的索引2引用控制点坐标数组1010的索引2,其包括路径100的第一控制点161的第一坐标。经索引的链接1020的剩余控制点索引1到3(和索引5)引用控制点坐标数组1010的索引0和空值。索引4引用控制点坐标数组1010的索引4和梯度控制点162的第一坐标值。

图11示出了用于编码路径100的区段120的经索引的链接1120。经索引的链接1120的索引0至3引用控制点坐标数组1010的索引2、4、6和8,其包括区段120的四个控制点161、162、163和164的第一坐标。索引4-5引用控制点坐标数组1010的索引4和6以及区段120的梯度控制点162和163的第一坐标值。

图12示出了用于编码路径100的连接130的经索引的链接1220。经索引的链接1220的索引0和2至3引用包括控制点164的第一坐标的控制点坐标数组1010的索引8。索引1引用控制点坐标数组1010的索引0和存储在其中的空值。索引4-5引用控制点坐标数组1010的索引6和10以及梯度控制点163和164的第一坐标值。

图13示出了用于对路径100的区段140进行编码的经索引的链接1320。经索引的链接1320的索引0至3引用包括区段140的四个控制点164、165、166和167的第一坐标的控制点坐标数组1010的索引8、10、12和14;索引4-5引用控制点坐标数组1010的索引10和12以及区段140的梯度控制点165和166的第一坐标值。

图14示出了用于编码路径100的末端顶端150的经索引的链接1420。经索引的链接1420的索引0和2引用控制点坐标数组1010的索引14,其包括最终控制点167的第一坐标。经索引的链接1420的其余的控制点索引1和3(和索引5)引用控制点坐标数组1010的索引0和空值。索引4引用控制点坐标数组1010的索引12和梯度控制点的第一坐标值166。

图15示出了基于如图10-图14所示的路径100的每个链接的各个经索引的链接的路径100的经索引的链接序列1520。经索引的链接序列1520表示路径100的五个链接的完整烘焙(baked)序列,其与控制点坐标数组1010一起可以存储在存储器中并进行处理以渲染描边路径。例如,图15的两个数组,控制点坐标数组1010和经索引的链接序列1520,可以被存储在GPU视频存储器中,被顺序地封装到单个缓冲器中,然后由极坐标描边着色器处理,例如以上关于图2至图4所讨论的,以渲染路径100的描边路径。

图16示出了根据本公开的原理执行的从经编码的经索引的链接确定链接类型的方法1600的示例的流程图。方法1600提供了分别解码用于图7和图8中的(无理)二次贝塞尔区段和锥形(有理二次贝塞尔)区段的经索引的链接的示例。方法1600还解码图10和图14中的起始和末端路径顶端经索引的链接,以及图12中的连接经索引的链接。根据本公开的原理,编码经索引的链接并因此解码经编码的经索引的链接的其他方法是可能的。方法1600中提到的所有索引都是经索引的链接,该经索引的链接索引控制点坐标数组的存储值。方法1600可以由诸如图2的路径处理器210之类的路径处理器执行。方法1600在步骤1601开始。

在步骤1605中,确定索引1是否为空。如果否,则方法1600继续到步骤1610,并且在步骤1610中确定索引2是否为空。如果否,则方法1600在步骤1615中确定该链接是三次路径段。如果在步骤1610中确定索引2为空,则方法1600继续到步骤1620,其中确定索引1是否为偶数。如果是,则方法1600在步骤1625中确定该链接是无理二次路径段。如果索引1不是偶数,则方法1600在步骤1630中确定该链接是有理二次(锥形)路径段。

返回到步骤1605,如果索引1为空,则方法1600继续至步骤1640,在此确定索引5是否为空。如果否,则方法1600在步骤1645中确定该链接是连接。如果索引5为空,则该方法继续到步骤1650,在步骤1650,确定索引3是否为空。如果是,则在步骤1655中确定索引2是否为空。如果是,则方法1600在步骤1660中确定该链接是初始路径顶端。如果否,则方法1600在步骤1670中确定该链接是末端路径顶端。

返回到步骤1650,如果索引3不为空,则方法1600在步骤1680中确定索引2是否为空。如果是,则方法1600在步骤1685中确定该链接是起始虚线顶端(dash cap)。如果否,则方法1600在步骤1670中确定该链接是末端虚线顶端。熟练的从业人员将认识到某些矢量图形标准(例如XML纸张规范(XPS))提供了与端点虚线顶端不同的虚线顶端,因此区分这两种类型的顶端是有利的。

图17示出了根据本公开原理的配置为显示路径的计算设备1700的示例的框图。路径100用作示例。计算设备1700可以是例如膝上型计算机,台式计算机,计算板,电视机(包括机顶盒)或智能电话。计算设备1700包括描边系统1710和屏幕1720。计算设备1700还可以包括通常包括在被配置为在其屏幕上显示图像的计算设备中的附加组件,例如帧缓冲器。描边系统1710可以被配置为作为描边系统200,渲染器300,渲染器400或根据本文公开的描边方法来操作。描边系统1710生成路径100的表示并将该表示提供给屏幕1720以显示路径100。这些表示可以是曲面细分的几何图元。屏幕1720可以是用于显示图像的计算设备的常规屏幕。

图18示出了根据本公开原理的被配置为利用描边打印路径的打印机1800的示例的框图。路径100用作示例路径。打印机1800包括描边系统1810、控制器1820和打印机构1830。打印机1800还可包括通常包括在被配置为打印图像的打印机中的附加组件。描边系统1810可以被配置为作为描边系统200,渲染器300,渲染器400或根据本文公开的极坐标描边方法来操作。描边系统1810生成路径100的描边表示,例如曲线细分的几何图元,并将描边表示提供给控制器1820。控制器1820采用描边表示来生成打印命令,以基于该描边表示指示打印机构1830打印路径100。打印机构1830可以是打印机的常规组件,例如用于打印图像的笔。在一张纸1840上示出了打印的路径100。

上述设备、系统或方法的一部分可以在各种数字数据处理器或计算机中体现或由其执行,其中,对计算机进行编程或存储一系列软件指令的可执行程序,以执行方法的一个或更多个步骤。此类程序的软件指令可以表示算法,并以机器可执行的形式编码在非暂时性数字数据存储介质上,例如磁盘或光盘,随机存取存储器(RAM),磁性硬盘,闪存和/或只读存储器(ROM),以使各种类型的数字数据处理器或计算机能够执行本文所述的一种或多种上述方法或功能、系统或设备中的一个、多个或全部步骤。数据存储介质可以是数字数据处理器或计算机的一部分或与之关联。

数字数据处理器或计算机可以包括一个或更多个GPU,一个或更多个CPU,一种或更多种其他处理器类型或其组合。数字数据处理器和计算机可以位于彼此相邻,位于用户附近,位于云环境,数据中心中或位于其组合中。例如,某些组件可以位于用户附近,而某些组件可以位于云环境或数据中心中。

GPU可以体现在单个半导体衬底上,该单个半导体衬底包括在具有一个或更多个其他设备(例如附加GPU,存储器和CPU)的系统中。GPU可以被包括在包括一个或更多个存储器设备并且被配置为与计算机的主板接口的图形卡上。GPU可以是与CPU共同位于单个芯片上的集成GPU(iGPU)。具有例如用于执行一个或更多个任务的必要逻辑和/或特征的配置的装置,例如被设计、构造或编程。

可以要求保护本公开的各个方面,包括发明内容中所指出的系统和方法。发明内容中提到的每个方面可以具有下面结合提出的从属权利要求的一个或更多个要素。

本申请涉及领域的技术人员将理解,可以对所描述的实施例进行其他和进一步的添加、删除、替换和修改。

相关技术
  • 对路径描边的补丁区段、顶端和连接统一编码
  • 塔区段、塔部段、塔、风能设备以及用于制造塔区段和用于连接塔区段的方法
技术分类

06120113006517