最近,出现了许多有关2D渲染的奇妙研究。 Peter Kobalicek和Fabian Aizerman正在研究
Blend2D :这是市场上最快,最准确的CPU光栅化器之一,它具有创新的JIT技术。 Mozilla的Patz Walton
在Pathfinder中研究的不是一种方法,而是
三种不同的方法 ,最终在Pathfinder v3中得以研究。 Raf Levien使用
加纳(Ghana)与同事就矢量纹理(2014)发表的
科学文章中描述的技术建立了
计算管道 。 距离场似乎标志着距离的发展:
Adam Simmons和
Sarah Frisken在这里独立工作。
有人可能会问:为什么2D周围会有这么多的噪点? 它不会比3D难得多,对吧? 3D是一个完全不同的维度! 在这里,我们可以通过准确的照明在鼻子上进行实时光线追踪,您不能掌握纯色的普通2D图形吗?
对于那些不太了解现代GPU细节的人来说,这真的非常令人惊讶! 但是2D图形有很多独特的局限性,使其变得极为困难。 另外,它不适合并行化。 让我们沿着带我们来到这里的历史小径散步。
PostScript起飞
一开始有个绘图员。 第一个能够与计算机交互的图形设备称为“
绘图仪 ”(绘图仪):一个或多个可以在纸张周围移动的笔。 一切都
根据下笔命令工作,然后绘图头以独特的方式(可能沿着曲线)移动,并接收到上笔命令 。 某些早期绘图仪的制造商HP在主机上使用了称为AGL的BASIC变体,然后以另一种语言(例如
HP-GL)发送绘图仪命令。 从
Tektronix 4010开始,在1970年代,图形终端变得更便宜,更受欢迎。 他使用CRT显示图像,但不要上当:这不是像素显示。 泰克来自模拟示波器行业,这些机器通过
控制沿特定路径的电子束来工作。 因此,Tektronix 4010没有像素输出。 取而代之的是,您以
简单的图形模式向他发送了命令,该命令可以绘制线条,但是同样以“羽化”,“羽化”模式发送命令。
与许多其他领域一样,一切都改变了Xerox PARC的发明。 研究人员开始开发一种新型的打印机,在计算上比绘图仪更具表现力。 这台新打印机使用类似于Forth的小型堆叠式图灵完整编程语言工作,被称为...
Interpress ! 显然,施乐公司找不到适合他的应用程序,于是发明人离开了公司,成立了一家名为Adobe的小型创业公司。 他们将Interpress随身携带,并且在对其进行了纠正和改进后,它变得面目全非,因此他们给它起了另一个名字:PostScript。 除了出色的,图灵完整的堆栈语言外,原始《
PostScript语言参考》的第四章还介绍了映像模型,该映像模型与现代编程接口几乎完全相同。 手册中的示例4.1包含示例代码,这些代码几乎可以逐行转换为HTML5 <canvas>。
/box { function box() { newpath ctx.beginPath(); 0 0 moveto ctx.moveTo(0, 0); 0 1 lineto ctx.lineTo(0, 1); 1 1 lineto ctx.lineTo(1, 1); 1 0 lineto ctx.lineTo(1, 0); closepath ctx.closePath(); } def } gsave ctx.save(); 72 72 scale ctx.scale(72, 72); box fill box(); ctx.fill(); 2 2 translate ctx.translate(2, 2); box fill box(); ctx.fill(); grestore ctx.restore();
这不是巧合。
苹果公司的史蒂夫·乔布斯在访问PARC期间会见了Interpress工程师。 乔布斯认为印刷业务将有利可图,并在诞生之初就试图收购Adobe。 但是Adobe提出了反要约,并最终向苹果出售了一份为期5年的PostScript许可。 乔布斯计划的第三大支柱是资助一家小型初创公司Aldus,后者开发了用于创建PostScript文档的WYSIWYG应用程序。 它被称为PageMaker。 1985年初,Apple推出了第一台兼容PostScript的打印机Apple LaserWriter。 Macintosh,PageMaker和LaserWriter的结合立即使印刷业发生了翻天覆地的变化,新的热门“桌面出版”巩固了PostScript在历史上的地位。 惠普的主要竞争对手最终还为其竞争对手的LaserJet打印机系列购买了PostScript许可证。 在消费者的压力下,这种情况发生在1991年。
PostScript逐渐从打印机控制语言转变为文件格式。 精明的程序员了解了如何将PostScript命令发送到打印机,并开始通过在其文档中添加图表,图形和绘图来使用PostScript显示图形来手动创建PostScript文档。 打印机外部需要图形! Adobe注意到了这一点,并迅速发布了
Encapsulated PostScript格式,该格式只包含一些特殊格式的PostScript注释,其中包含有关图像大小和对打印机命令的使用(例如“页面馈送”)的限制的元数据。 1985年同一年,Adobe开始开发Illustrator,该应用程序使艺术家可以在方便的UI中以封装的PostScript格式进行工作。 然后,可以将这些文件传输到创建了...的PostScript文档以发送到PostScript打印机的文字处理器中。 整个世界都转向了PostScript,Adobe变得更加幸福。 当Microsoft使用Windows 1.0并希望为开发人员创建自己的图形API时,主要目标是使其与现有打印机兼容,从而使发送到打印机的图形像在屏幕上一样容易。 该API最终以
GDI的形式发布,
GDI是1990年代Windows迅速流行的过程中每位工程师使用的核心组件。 几代Windows程序员已经开始在不知不觉中使用PostScript图像模型识别2D矢量图形,并以这种实际状态对其进行保护。
PostScript的唯一主要问题是其巡视完整性:查看文档的第86页意味着首先运行1-85页的脚本。 而且它可能很慢。 Adobe从用户那里发现了这种抱怨,并决定创建一种没有这种限制的新文档格式;它被称为“便携式文档格式”,或者简称为“ PDF”。 不再使用编程语言,但是图形技术保持不变。 引用
PDF规范的第2.1章“图像模型” :
PDF基于其描述复杂图形和版式外观的能力。 通过使用Adobe图像模型可以实现此功能,Adobe图像模型是PostScript页面描述语言中使用的与设备无关的高级表示。
当W3C联盟考虑在Internet上使用2D图形标记语言的申请人时,Adobe为基于
XML的
PGML (基于PostScript图形模型)辩护:
PGML必须包含PDF / PostScript图像模型,以确保可扩展的2D图形同时满足一般用户和图形专业人员的需求。
微软的竞争性
VML格式基于GDI,我们知道它基于PostScript。 两个相互竞争的提议,基本上仍然是PostScript,合并在一起,以使W3C采用了我们今天熟知和喜爱的“可缩放矢量图形”(SVG)标准。
即使他老了,也不要假装带给这个世界的PostScript创新不只是技术奇迹。 Apple的LaserWriter PostScript打印机的功能是控制它的Macintosh的两倍,仅用于解释PostScript和将矢量路径光栅化到纸上的点。 这似乎有些过分,但是如果您已经购买了带有
激光的时尚打印机,那么对于昂贵的处理器就不会感到惊讶。 PostScript的第一个化身发明了一个相当复杂的可视化模型,具有我们今天理所当然的所有功能。 最强大,最强大的功能是什么? 字型 那时,用尺子和量角器手工绘制字体,并浇铸在胶片上进行
光化学印刷 。 1977年,唐纳德·纳努特(Donald Knut)向世界展示了他的
METAFONT系统的功能,他随TeX文本编辑器介绍了该系统,但它没有扎根。 它要求用户使用笔刷和曲线对字体进行数学描述。 大多数字体开发人员都不希望学习此内容。 小尺寸的怪异弯头变成一团糟:当时的打印机没有足够的分辨率,因此字母变得模糊并相互融合。 PostScript提出了一种新的解决方案:一种将轮廓“链接”到打印机使用的较粗网格的算法。 这称为网格拟合。 为了防止几何图形过多变形,他们允许字体设置“提示”,以提示几何图形中最重要的部分以及应保留的部分。
Adobe的原始商业模式是将该字体技术出售给打印机开发人员,并向发行商出售带有附加提示的特殊重新创建的字体,因此Adobe仍在出售其
Timess和
Futura版本。 顺便说一下,这是有可能的,因为字体,或更正式地讲,是“耳机”,是
美国版权法明确排除的
五种事物之一,因为字体最初被指定为“太简单或太实用而不能成为创造性的作品”。 而是在屏幕上复制字体的
数字程序受版权保护。 为了使人们无法复制Adobe字体并添加自己的
字体 ,
Type 1字体格式最初由Adobe拥有,并包含“字体加密”的代码。 只有Adobe的PostScript可以解释Type 1字体,并且只有它们实现了专有的提示技术,可以提供小尺寸的清晰度。
顺便说一下,网格拟合变得如此流行,以至于当微软和苹果厌倦了支付Adobe许可费时,他们发明了另一种替代
TrueType字体
格式的方法 。 TrueType无需指定声明性的“提示”,而是为字体作者提供了
完整的图灵-完整堆栈语言,从而使作者可以控制网格拟合的所有方面(避免使用Adobe的声明性提示专利)。 多年来,Adobe Type 1和TrueType之间发生了战争,字体开发人员陷入了中间,为用户提供了两种格式。 最后,业界已经达成妥协:
OpenType 。 但是,他们没有现实地确定获胜者,而是只是将两种规格转换为一种文件格式。 Adobe现在不是从销售Type 1字体而是从Photoshop和Illustrator赚钱,因此它删除了加密部分,改进了格式,并引入了
CFF / Type 2字体,这些字体都作为
cff表包含在OpenType
中 。 另一方面,TrueType作为
glyf和其他表插入。 尽管有点难看,但OpenType似乎为用户做了工作,使他们挨饿了:只需要所有软件都支持两种字体,因为OpenType要求您同时支持两种字体。
当然,我们不得不问:如果不是PostScript,那么它的位置是什么? 其他选项值得考虑。 前面提到的METAFONT并未使用严格定义的轮廓路径(填充路径)。 取而代之的是,克努特以典型的方式在他的文章
“数学印刷术
”中提出了一种印刷术的数学概念,这是“最令人愉快的”。 您指定几个点,某些算法会通过它们找到正确的“最令人愉快”的曲线。 您可以将这些轮廓叠加在一起:将其中一个轮廓定义为“羽毛”,然后通过其他线条“拖动羽毛”。 内心的计算机科学家Knut甚至介绍了递归。 他的学生约翰·霍比(John Hobby)开发并实现了算法,用于
计算“最令人愉悦的曲线” ,
覆盖嵌套路径 并对其进行 栅格化 。 有关METAFONT,曲线和总体印刷历史的更多信息,我
强烈推荐《
字体和编码 》一书以及
John Hobby的文章 。
幸运的是,人们对2D图形研究重新产生了兴趣,这意味着Knut和Hobby样条线并未被完全遗忘。 尽管它们绝对笨拙且非常规,但它们最近才进入了
Apple iWork Suite ,并且是那里的默认样条线类型。
脱去三角形
在不深入探讨数学丛林的情况下,我们将其称为Bezier曲线和Hobby样条
曲线隐式曲线 ,因为它们被表示为生成曲线的数学函数。 它们在任何分辨率下均表现出色,这非常适合为缩放而设计的2D图像。
2D图形支持这些隐式曲线周围的动量,在对字形建模时,这几乎是必需的。 实时计算这些路径的硬件和软件价格昂贵,但是矢量图形的印刷业推动了巨大的发展,并且大多数现有工业设备的价格已经比带有高级处理器的激光打印机昂贵得多。
但是,3D图形走的是完全不同的路线。 从一开始,几乎是通用的方法是使用多边形(polygons),这些多边形通常是
手动标记并
手动输入计算机的 。 但是,这种方法不是通用的。 隐式曲线的3D等效项是由基本几何图元(例如球体,圆柱体和立方体)组成的
隐式曲面 。 具有无限分辨率的理想球体可以用一个简单的方程式表示,因此
在3D几何学发展的曙光中,显然比多边形更可取 。 设计带有隐式曲面图形的少数公司之一是
MAGI 。 结合对程序纹理的巧妙艺术运用,他们赢得了1982年Tron电影的迪士尼轻型自行车设计合同。 不幸的是,这种方法很快消失了。 由于CPU的加速以及对“移除隐藏表面”之类的问题的研究,您可以在场景中显示的三角形数量迅速增长,并且对于复杂的形状,艺术家更容易考虑可以单击和拖动的多边形和顶点,而不是思考使用立方体和圆柱体的组合。
这并不意味着在建模
过程中未使用隐式曲面。 诸如
Catmell-Clark算法之类的技术在80年代初就成为了公认的行业标准,使艺术家能够创造出光滑,有机的简单几何形状。 尽管直到2000年代初,才将Catell-Clark算法定义为可以使用公式计算的“隐式表面”。 然后,它被视为迭代算法:一种将多边形划分为更多多边形的方法。
三角形入侵了世界,随后是创建3D内容的工具。 视频游戏和电影中的特殊效果的新开发人员和设计师仅接受过使用多边形网格物体(例如Maya,3DS Max和Softimage)建模程序的培训。 80年代后期,当“ 3D图形加速器”(GPU)出现时,它们是专门为加速现有内容(三角形)而开发的。 尽管早期的GPU项目(例如
NVIDIA NV1)对曲线的硬件支持有限,但它存在故障,并很快从产品线中删除。
这种文化主要延伸到我们今天所看到的。 主流的PostScript 2D图像模型始于可以“实时”显示曲线的产品。 同时,3D行业忽略了难以使用的曲线,而是依靠独立的解决方案将曲线预转换为三角形。
返回隐式曲面
但是,为什么可以在80年代在打印机上实时计算隐式2D曲线,而在2000年代初期,相同的隐式3D曲线仍然非常容易出错? 好吧,Catell-Clark算法比Bezier曲线复杂得多。 3D中的Bezier曲线称为B样条曲线,可以很好地计算,但是存在一个缺点,即它们限制了网格的连接方式。 像Catmell-Clark和NURBS之类的曲面允许任意连接的网格扩展美工的能力,但是这可能导致多项式超过第四级,这
通常是没有解析解的 。 相反,您可以根据多边形的分离获得近似值,就像Pixar的
OpenSubdiv一样 。 如果有人找到可以找到Catmell根源的分析解决方案(例如Clark或NURBS),则Autodesk会付给他很多钱。 与它们相比,三角形似乎要好得多:只需
在一个平面上计算
三个线性方程式 ,您就会得到一个简单的答案。
...但是,如果我们不需要确切的解决方案怎么办? 这正是图形设计师
IñigoQuilles在隐式曲面上进行研究时
提出的问题。 解决办法? 有符号距离字段(SDF) 他们没有给出与曲面相交的确切点,而是说您离曲面有多远。 类似于解析计算的积分和欧拉积分之间的差,如果您到最近的物体有一个距离,则可以在场景中“行进”,在任何给定点询问您有多远,然后传递该距离。 这样的表面通过诸如Shadertoy之类的犯罪现场和社区为该行业注入了全新的生命。 旧的MAGI建模技术的破解为我们带来了令人难以置信的发现,例如Killes的
Surfer Boy ,它以无限的精度作为隐式表面进行计算。 您无需寻找Surfer Boy的代数根,您只需感觉场景如何。
当然,问题在于
只有像Killes这样
的天才才能创造一个Surfer Boy。 尚无用于SDF几何的工具,所有代码都是手动编写的。 但是,鉴于隐含曲面的激动人心的复兴以及曲线的自然形状,现在对该技术引起了很多兴趣。 PS4上的MediaMolecule
Dreams是一个基于隐式表面组合的内容创建套件。 在此
过程中,大多数传统图形都被销毁并重新创建 。 这是一种很有前途的方法,工具直观且有趣。
Oculus Medium和
unbound.io也对此问题进行了很好的研究。 对于3D图形和下一代工具的未来,这绝对是一个有前途的看法。
但是其中一些方法比您想象的更不适合2D。 通常,在一般的3D游戏场景中,先进的材料和纹理,但几何计算很少,许多
可疑产品的评论家和
销售商立即指出。 这意味着我们不需要进行平滑处理,因为轮廓并不那么重要。 诸如4x MSAA之类的方法可能适用于许多游戏,但适用于具有纯色的小字体,而不是
16个固定的样本位置,而是为每个像素计算
曲线下的确切面积 ,从而为您提供所需的分辨率。
在3D游戏中旋转屏幕会产生类似于to音
抑制的效果,因为大脑会重新配置为新外观。 在许多游戏中,这有助于隐藏后处理效果中的伪像,例如
临时平滑 ,Dreams和unbound.io严重依赖它们来获得良好的场景性能。 相反,在典型的2D场景中,我们没有这种奢侈的视角,因此尝试使用它会使字形和形状与这些伪像完全融合在一起并发抖。 2D看起来不同,期望更高。 在缩放,平移和滚动时,稳定性很重要。
这些效果无法在GPU上实现,但是它们显示出与“ 3D”内容的根本偏离,具有不同的优先级。 最终,渲染2D图形非常复杂,因为它涉及形状-确切的字母和符号,而不是主要是实体的材质和照明。 作为发展的结果,图形加速器决定不计算隐式实时几何图形(例如曲线),而是专注于这些曲线内部发生的一切。 也许,如果PostScript没有获胜,我们将拥有一个没有Bezier曲线的2D图像模型,这是实时性的主要要求。 , , 3D-, GPU . , .