路径格式规范
本页介绍“路径”格式,并提供使用“路径”工具中包含的函数处理该格式数据的指导。
格式规范
让*uv\_pos*成为“顶部”部分的像素的2D地址(如$pos)。
本文档其余部分:
- top[uv_pos].XYZW将引用顶部像素中存储的4个浮点。
top[uv_pos] == sample_color(paths, uv_pos) - bottom[uv_pos].XYZW将引用存储在底部匹配像素中的4个浮点。
bottom[uv_pos] == sample_color(paths, uv_pos + Float2(0, 0.5))
top[uv_pos]和bottom[uv_pos]共同构成文档的语义单元U[uv_pos],由8个浮点组成。
文档标题
每个“路径”文档都以一个文档页眉开头。 它是第一个语义单位U[(0,0)]:
本文档中定义的最后一个顶点的地址。 这有助于附加新数据。
因此,它实际上可以是比最后一个顶点的地址大(按扫描线顺序)的任何地址。 它必须位于]0, 1[×]0,.5[范围内
ZW
未使用,应为Float2(0, 1)
路径标题
文档标头后面紧跟number-of-paths = top[(0,0)].X path-headers(按语义单位排列)。
E.g. 如果文档中有3条路径,则它们将存储在U[(0,1)*pixel_size]、U[(0,2)*pixel_size]和U[(0,3)*pixel_size] (pixel_size = top[(0,0)].YZ)中。
如果路径多于像素的一行可以包含的路径,则其余路径标题将按扫描行顺序写入下一行。
允许具有null路径标头(top[...].XYZW = Float4(0,0,0,0));此类路径仍然可以作为一个空路径。
将在地址path\_addr处定义第N个路径的路径标头定义为:
此路径中的顶点数。 必须位于[0, 16777216]范围内。
如果闭合路径的开始和结束顶点位于同一位置,则它们仍然计为2个顶点。
但具有0顶点的路径仍然是有效的。
年
Is_closed标志:如果路径闭合(如圆形),则为1;否则为0(如直线)。
Z
路径索引 N. 必须完全匹配path_addr(请参见下面的注释)。
宽
标头标志: 1/16 = 0.0625。
起始(或第一个)顶点地址。
ZW
结束(或最后一个)顶点的地址。
Utils/pixel\_index\_to\_position从N计算path\_addr: path\_addr = pixel\_index\_to\_position(N+1)顶点信息
可以在图像标题(文档或路径标题)后的任意位置找到顶点。 顶点可以是各种“类型”(“开始”、“中间”或“结束”),并且它们使用2个地址指针(“链接”)显式链接在一起。
开始和 结束 顶点在这方面是特殊的:为了允许表示闭合路径或链接在一起的任意路径网络,实际使用链接之一来形成表示相同顶点的其他所有开始或结束顶点的循环向前链接列表。 这种相互匹配的顶点称为“兄弟姐妹”。 [插图受到欢迎]
形式上,地址*vert\_addr*的每个顶点的定义如下:
顶点位置。 坐标可以是任何不是NaN或±inf的浮点值。 在这个层次没有拼贴的概念(它可以通过每个过滤器的实现来处理,也可以不处理),所以路径应该是在欧几里德平面上定义的。
Z
顶点路径索引。 一个顶点只能属于一个Path。 (如前所述,“开始”和“结束”顶点可以具有同级节点。) 路径索引可用于检索路径标题(请参阅上面的“部分路径标题”),因此请确保使其保持同步。
宽
顶点类型。 它在值的符号与其绝对值之间拆分:
在符号部分中,值为0表示实际上此处没有顶点(所有其他元件也都应为0)。 负值表示将顶点标记为“边角”;正值表示顶点“平滑”。 角点与平滑顶点是一个纯粹的隔离属性,对于其余路径编码没有影响或意义。
在绝对值部分,对像素的类型(开始、中间或结束)和另一个标志(trivial_link)进行编码:
-
0.125:结束顶点(形状的最后一个顶点;始终是非普通链接,请参阅下文)
-
0.25:起始顶点(形状的第一个顶点;始终是非平庸链接,请参阅下文)
-
0.5:带有非平凡链接的中间顶点
-
1:带有简单链接的中间顶点
“普通链接”是指上一个和下一个顶点(在当前路径的顶点列表中)分别存储在左侧(vert_addr-(0,pixel_size))和右侧(vert_addr+(0,pixel_size))的像素中,而“非普通链接”意味着其中至少一个顶点存储在其他位置。
无论链接是“平凡的”,其可信值都存储在底部:
XY
此路径的上一个顶点的地址。 对于起始顶点,将指向下一个同级顶点。
如果 |top[vert_addr].W| = 1,然后bottom[vert_addr].XY = vert_addr - (0,pixel_size)
ZW
此路径的下一个顶点的地址。 对于“结束”顶点,将指向下一个同级顶点。
如果 |top[vert_addr].W| = 1,然后bottom[vert_addr].ZW = vert_addr + (0,pixel_size)
读取和写入路径信息
如果您想创建自己的路径处理节点,您有多种工具。
路径顶点处理器和路径顶点处理器简单节点提供了基础知识,它们基本上可以用与像素处理器相同的方法。
如果您需要超出“路径顶点处理器”节点所能提供的功能(更多输入纹理,或者更多先前或下一个顶点),则复制此图形的实现可能是一个很好的起点(假设您将 Get(“%perVertex”) 节点替换为自定义处理)。
但是,如果您想做一些比应用每个顶点功能更陌生的事,这里提供了您可以使用的工具的详细说明。 这些通常是可以在与其他Paths助手(paths_tools.sbs)相同的包中找到的小节点函数。 (这些函数未公开 库 和 节点菜单 中。)
“读取”函数
在Read文件夹下,您可以找到以下几项有助于收集有关路径的信息:
有些可以提供有关给定像素的信息。 它们都将*top*部分中的取样Float4值作为输入。 如果你看看它们的实现,它们非常简单。 他们的目的是传达更多意义,而不仅仅是原子节点:
is\_header的路径*,并且current\_pixel\_is\_document\_header返回了false。is\_vertex)。is\_vertex)。is\_vertex)。is\_start\_vertex || is\_mid\_vertex的短手。 对于基于Fx-Map的处理(最多处理一次每个段)更有用。is\_vertex:如果答案为true,则表明你确实处于顶点中)。 请注意,官方节点尚不支持此标志。如果是顶点,则指示是否可以无需对底部进行采样即可轻松推导上一个顶点和下一个的位置。 (注意:非顶点将始终返回false。)
您可能不想直接使用此项,而是使用sample\_next\*或sample\_prev\*函数之一,由它们为您处理。
在给定顶部采样值*sampled*及其位置*sampled\_position*的情况下,返回下一个(分别为上一个)顶点顶部采样值,并将Float2变量*next\_sampled\_pos*设置为此邻居的位置(即<returned value> = SampleColor(next_sampled_pos, image0))。 *input0PixSize*必须等于路径的像素大小(top[(0,0)].YZ)。
如果当前像素(*sampled*)是 开始 顶点,sample_prev将返回此顶点的下一个同级对象;同样,如果它是 结束 顶点,sample_next将返回此顶点的下一个同级对象(即,可能不是您想要的内容)。 请参阅下面的*sample\_next\_advanced*和*sample\_prev\_advanced*来解决此问题。
请注意,为简单起见,路径信息假定存储在input0!中 此外,与函数的doc状态不同,您不需要预声明*next\_sampled\_pos*。 *[out]next\_sampled\_pos*是一个虚拟参数,用于提醒您存在第二个“返回值”。
您可以检查第3个Iterate节点的迭代参数中的*paths\_trace* Fx-Map以说明如何使用它。
“写入”函数
在Write文件夹下,您会发现一些小型助手,它们生成准备由Fx-Map写入的Float4。
实际上,Fx-Map在绘制之前会将RGB与Alpha相乘,因此会取消预乘实际值以对其进行补偿。 如果您想在像素处理器中使用这些函数,我们建议您自己再次应用预乘,或者编写自定义版本(更优化您的用例且更易于使用)。document<>header生成文档标题的顶部,声明您提供的路径数。document<>last<>顶点<>spec生成顶点页眉的*bottom*部分,指定文档的最后一个地址(请参见A.1.)。path<>header根据路径*nbVertices*中的顶点数、*isClosed*标志和*pathIndex*生成路径标头的顶部。start<>顶点、mid<>顶点、end<>顶点构建顶点的顶部,并相应地设置位置、类型和其他选项。大约 mid_path 和 hasTrivialLinks 顶点:理想情况下,您应设置适当的值,但如果由于任何原因您最终无法判断链接是否微不足道,则可放心将其设置为false(这将降低所生成路径的处理速度)。没有用于顶点头或路径的底部生成器:两者都编码到顶部的两个链接,因此该函数本质上将是来自两个Float2的矢量浮点数4构造函数。 如果使用Fx-Map进行写操作,请不要忘记将XYZ除以W (W是地址的Y,它不应为Null)。您将在托管路径多边形节点的paths_polygon.sbs 包中找到相关示例,说明如何使用这些函数。### 处理路径的方法您可能会使用像素处理器或Fx-Map来实现您的自定义处理,每种方法都有其强度和弱点:FX-Map当执行需要全局顶点(或多条路径)或累积路径(例如,在抽取或曲面细分后重新打包路径)的全局知识的高层次操作时,基于Fx-Map的解决方案通常更可取。 这种方法也是最简单的方法,因此,如果您是第一次进行自定义处理,您可能需要使用Fx-Map,尽管它 可能 会比较慢。您需要先熟悉Fx-Map。 如果不是,请查看特定文档。我们建议您查看 路径_trace.sbs 中的预览路径和 路径_多边形.sbs 中的路径多边形的实现,以了解如何使用Fx-Map(分别)读写路径。像素处理器如果您只需要“本地”信息,像素处理器解决方案将适合。 这里我们指的是“局部”不是空间上的(元素之间的距离),而是拓扑上的(链接在一起的顶点)。 这就是实现顶点处理器的方式。 对于此类操作,像素处理器通常比Fx-Map快,因为每个像素的功能都是并行计算的,而访问的数据量有限。 但实现工作可能更为重要,因为您只能修改当前像素。我们不会透露详细信息,因为根据您的具体用例,我们将透露很多信息,但第一件事是检查您的位置:您是位于顶部($pos.y < 0.5)还是底部($pos.y > 0.5)? 我们建议记住,在专用变量(例如*isTop*)中,创建*vert.addr* Float2时,顶部的值为*$pos*,底部为$pos - (0,0.5)。vert.addr处是什么? 对其取样并检查是否存在任何内容(W != 0),如果存在,则确切地检查是否存在任何内容。 标题(W = 0.0625) (用*Read/is\_header*检查)或顶点(用Read/is\_vertex检查)? 如果是页眉,那么它是文档页眉还是路径页眉? (可使用*Read/current\_pixel\_is\_document\_header*检查这一点。) 使用一个或多个帮助函数来匹配您感兴趣的内容。