墨水几何结构和渲染管线
通常,引擎会区分光栅颗粒(称为Raster Ink)和矢量多边形渲染(称为Vector Ink),它们的主要区别如下表所列。 由 Ink Geometry Pipeline 计算得到的几何图元是包含控制点的路径,使用@@@插值生成 Catmull-Rom 样条. 除了控制点之外,笔划数学模型在第一段和最后一段(分别是笔划的起始点和结束点)中指定插值参数的值。 如果需要,所有路径都可通过可变宽度和不透明度创建。 光栅化技术(在Rasterizer模块中实现)是画出包含这些特征的笔划路径的技术。
Raster Ink | Vector Ink |
---|---|
固定分辨率 – 在像素水平上定义图形 | 可扩展性和便携性 – 适用于在不同设备上打印或显示 |
允许像光点一样进行像素水平的操控 | 对象模型 – 可通过不同集合操作操控 |
在表现性上具有更大的灵活性 | 渲染更加复杂,但表现性受限 |
Vector Ink (形状填充技术) 是一种用于光栅化可变宽度笔划的纯色技术。 这种方法在表现性上有所限制,但可以执行更加复杂的渲染技术。 它十分适合典型的可缩放矢量图形使用或手写应用。 它在表现性上比较简单,使用这种技术光栅化的笔划操控(拆分)、缩放、重绘等非常容易(参见图 1)。
图 1:矢量实例。
颗粒墨水使用重叠颗粒渲染笔划。 通过该技术,可控制渲染章节中所介绍的多种渲染参数,从而构建更具表现性的工具(例如,蜡笔、铅笔或水彩笔)。 它在半专业绘画应用中有着广泛应用,如“图 2”所示。
图 2:光栅实例。
管道
在计算机图形中,渲染管道是描述图形系统对渲染对象执行渲染所需执行步骤的概念模型。 对于 WILL 墨水渲染,该过程分为 geometry pipeline(在所有平台中均以相同方式实现)和渲染部分(使用平台特定图形框架)。
在应用中,geometry pipeline 在InkBuilder
中创建和配置。
在应用中,geometry pipeline 在InkBuilder
中创建和配置。
VectorInkBuilder
扩展了矢量刷的管道,而RasterInkBuilder
则专用于光栅(颗粒)刷。
WILL 3.0 使用 geometry pipeline,包括处理的链条块*(处理器、生产者等)。
管道的输入是指针数据(触摸、触控笔、鼠标或控制器)*,它会经历一系列的处理阶段。
每个阶段的输出又作为其后续阶段的输入。
管道的主要目标是创建数字墨水。
然而,由于其通用实现方式,使其具备更广泛的一系列功能。
图 3: WILL 3 的渲染管线
输入
最佳的输入提供者是笔,因其可提供最常用的传感器输入,是最自然的书写或素描设备。
图 4:数字墨水传感器通道概览。
有下列输入:
- Position - 由 x 和 y 坐标(输入点的位置)定义
- Phase - 输入的阶段*(开始、更新/移动、结束)*
- Timestamp - 输入的时间戳,用于计算速度
- Force - 可选 - (压力)压力 敏感触控笔/显示屏报告的压力值
- Radius - 可选 - 触控输入的大小
- Altitude Angle - 可选 - 输入设备与书写平面之间的仰角(OE)。测量单位为弧度 - 介于 0 和 π/2 之间
- Azimuth Angle - 可选 - 沿着书写平面到对象位置的角度距离
按照惯例,方位角(OA)沿着平面从顶部向底部(从北到南)测量 测量单位为弧度 - 介于 0 和 2π 之间(参见图 5)。
图 5:方位角图。
内部表示和模型
-
Pointer Data - (输入数据/触控数据) - 输入采用上文所述的格式
-
PathPoint - 点的内部表达
-
Path - PathPoints 的 Flat 集(参见图 6),每一个都通过计算器(既可以预定义,也可以从外部传入)计算得到:
图 6:路径点。
-
Layout - 每个路径点中项目的描述符
-
Spline - 向心力 Catmull–Rom 样条(参见图 7),由其控制点定义:
图 7:Catmull-Rom 样条.
- Point Set - 一组定义有特定形式的填充区域的点(不仅仅是一个点)。 该技术使用由其外壳(而不是点集)定义的简单刷子。
图 8:点集。
- *Polygon - 使用凸壳从点集创建多边形。
多边形是
Collection<DIPoint2>
:
图 9:多边形点。
数据类:
DIPoint2
- 包含 x 和 y 坐标的二维点DIPoint3
- 包含 x、y 和 z 坐标的三维点DIPoint4
- 包含 x、y、z 坐标和宽度的三维点DIPointList2D
-Collection<DIPoint2>
DIPolyline
-Collection<DIPoint2>
处理块
管道由一系列处理块组成(处理器、生产者等)。 下图展示了处理块,并提供了中间步骤的实例。 图 10:管道及其中间结果。
BaseDataProcessor
管道阶段的抽象基类DataProcessor
,根据单个输入项来处理数据。
它定义了两种抽象方式:
add(phase: Phase, addition: Input, prediction: Input): Pair<Output, Output>
- 在管道阶段输入笔划,然后处理reset()
- 将处理器重置回初始状态
PathProducer
根据提供的布局将输入转换为内部路径表达。
构造器参数(包括在 Config 类中):
- Layout
- Calculator - 将输入转换成路径点的功能
添加参数:
- Addition - InputData - 想要处理的输入
- Prediction - InputData - 未来输入的预测
输出:
- Addition -
作为集合的路径<Float>
- Prediction -
作为集合的路径<Float>
Smoother
通过双重指数平滑.将路径变得更平滑 平滑会造成某个点滞后的负面结果。
构造器参数:
- 布局的尺寸(用作输入处理的步幅)
添加参数:
- Addition -
集合<Float>
- 由TouchToPathProducer
生成的路径 - Prediction -
集合<Float>
- 由TouchToPathProducer
生成的预测路径
输出:
- Addition -
作为集合的路径<Float>
- Prediction -
作为集合的路径<Float>
SplineProducer
在路径开始和结束位置添加两个控制点,以便生成Catmull-Rom 样条.
构造器参数:
- 布局的尺寸(用作输入处理的步幅)
添加参数:
- Addition -
Collection<Float>
- 路径 - Prediction -
Collection<Float>
- 预测路径
输出:
- Addition -
样条作为“集合<Float>
- Prediction -
样条作为“集合<Float>
SplineInterpolator
根据间隔参数,沿着轨迹添加点,将样条离散化。
构造器参数:
- Layout
- Spacing - 两个相邻点之间的间隔是尺寸的乘数(小于 1 则为分数)
- Split Count - 拆分的数量
添加参数:
- Addition -
集合<Float>
- 样条 - Prediction -
集合<Float>
- 预测样条
输出:
- Addition -
样条作为“集合<Float>
- Prediction -
样条作为“集合<Float>
BrushApplier
将点替换为刷子多边形,将样条转换为点集的集合。
构造器参数:
- Layout
- Brush Polygon - 定义刷子的多边形
添加参数:
- Addition -
Collection<Float>
- 样条 - Prediction -
Collection<Float>
- 预测样条
输出:
- Addition -
Collection<DIPointList2D>
- Prediction -
Collection<DIPointList2D>
ConvexHullChainProducer
添加参数:
- Addition -
Collection<DIPointList2D>
- 点集的集合 - Prediction -
Collection<DIPointList2D>
- 点集的预测集合
输出:
- Addition -
Collection<DIPolygon>
- Prediction -
Collection<DIPolygon>
PolygonMerger
使用并集合并多边形。 在不同平台上使用限幅器库及其相应的点。
添加参数:
- Addition -
Collection<DIPolygon>
- 由 ConvexHullChainProducer 生成的多边形集合 - Prediction -
Collection<DIPolygon>
- 由 ConvexHullChainProducer 生成的预测多边形集合
输出:
- Addition -
Collection<DIPolygon>
- Prediction -
Collection<DIPolygon>
PolygonSimplifier
取由线段组成的曲线(多边形),使用道格拉斯-普克算法.查找点更少的相似曲线
构造器参数:
- Epsilon- 确定简化水平的阈值。值越大则多边形的段越少。
添加参数:
- Addition -
Collection<DIPolygon>
- 集合简化的多边形 - Prediction -
Collection<DIPolygon>
- 预测集合简化的多边形
输出:
- Addition -
Collection<DIPolygon>
- Prediction -
Collection<DIPolygon>