Ptex是一个另类的制作材质方式。它是一个每面材质映射系统(per-face texture mapping system),不需要展UV。Walt Disney Animation Studios在遇到一系列的难题之后决定开发Ptex,特别是性能方面的问题。“UV操作起来总是非常麻烦,它们是我们的制作流程的瓶颈。”Burley说道。
Ptex能够为制作人员管理更多的流程,同时为制作人员在UV制作过程中遇到的问题提供了解决方案。例如缝合线的问题,在Ptex高效地生成缝合线组基本不会有任何问题,这个程序是专门用于在UV空间中帮助制作人员更好地缝合和铺排材质。它不仅能够将区块缝合,还能移除缝合线产生的瑕疵。例如,在已缝合的区块进行位移和过滤,在进行此类操作时还可以保证有较高的性能,特别体现在内存负荷上。
Ptex能够为制作人员管理更多的流程,同时为制作人员在UV 制作过程中遇到的问题提供了解决方案。例如缝合线的问题,在Ptex高效地生成缝合线组基本不会有任何问题,这个程序是专门用于在UV空间中帮助制作人员更好地缝合和铺排材质。它不仅能够将区块的缝合,还能移除缝合线的产生的瑕疵。例如,在已缝合的区块进行位移和过滤,在进行此类操作时还可以保证有较高的性能,特别体现在内存负荷上。
“这里存在很多问题,但是压倒骆驼的最后一根稻草是IO读取。”Burley说道,“我们尝试排列模型并将多个UV区块放到每个表面上,这样做出来的文件数量会非常庞大。我们的材质文件数量会比表面数量多100倍以上,这个IO读取会严重拖慢服务器Render IO的速度。”这个问题非常严重,因此制作人员也开始转向使用程序性材质,而不是基于图像的材质。“我们需要处理大量的材质,”Burley补充道,“我们想要解决材质的问题,所以我们做出了Ptex,它能够解决性能的问题。”
Ptex的目的是让每个材质层(在表面上设置的每个完整材质)都拥有独立的分辨率控制,这就意味着每层材质都不需要保持一致的大小。也就是说“你的颜色贴图的分辨率可以跟置换贴图不一样,甚至在不同的表面之间可以有不同的比例。”Burley说道。大型的材质会从内部排列好,这样的话它们每个表面的材质都可以达到8K或16K以上。如果可以有任意数量的材质,比如说10,000或更多,它们的文件可能会达到几十GB,Disney发现Ptex在制作的时候可以有非常好的扩展性。
不过真正有趣的是,很多贴图都可以固定对象的某一部分或者将特定的点混合到角色身上。“我们对固定的表面做出了专门的优化,”Burley描述道,“它们会被储存到文件起始的一个特别区块中,其中包含一个固定材质中的所有表面。这对于内存和磁盘足迹来说都有切实的好处,甚至连过滤器都能理解这些足迹,从而做出高效的过滤。”
这样做的意义在于这个团队将95%的表面都看成是固定不变的。很多时候它们只是稀疏的遮罩,颜色是全白或全黑,然后只会在边缘这样的地方出现一些混合的细节。它们的储存和读取速度都很快。
Ptex从整体上优化了渲染,最大限度降低随机寻道(random seek)。例如MIP贴图是为了最优渲染读取而储存的。在制作过程当中,这些优化可以起到很大的作用。Disney Animation的团队在每个表面平均都有8个Ptex文件(颜色、反射、位移等),在主要素材的表面可能会有高达几十个文件,这样一个镜头就会有数百个或者数千个Ptex文件。由于Ptex文件的大小为几KB到几GB不等,所以它们加起来可能会比内存还大。“我们平均每个texel都会占用半个字节,由于有大量的遮罩材质,所以95%的表面都是固定不变的。”Burley说道。
性能
我们在UDIM的文章中提到Ptex没有得到广泛使用的其中一个重要原因是性能问题。下面是一些早期得出的数据,并非来自Disney团队(为了清晰起见,这里重新引用了第一篇文章的内容):
慢着……
上面的数据实际上是对可能发生的事情的警告,不过Burley指出这可能是微不足道的一个问题。虽然Ptex的性能可以达到这种程度,但这并不是Ptex的建议使用方式。为了解释这个问题,Burley研究了超过400,000个任务——全部都是来自电影《冰雪奇缘》完整一周的制作过程:
“我们的线程数量不是一定的,不过大部分的任务都是1、2、4或8线程的。总共有5.2%的时间是在Ptex中消耗的。Ptex在1/2/4/8线程中分别占用了3.7%、4.0%、6.3%、5.9%的时间。部分使用16线程的任务在Ptex中耗时1.7%。这些全部都是在PRMan中使用单个共享的Ptex缓存来处理表面材质。整体数据的表现都比较一致,65%的任务使用Ptex的时间会低于4%,90%的任务使用Ptex,只有低于1%的工作会使用Ptex超过30%的时间。”
Disney所有的统计数据都饱和I/O和过滤的时间。“我们在RenderMan使用Ptex存取材质从来没有遇到问题。”Burley说道。
那么为什么之前提到的3D材质化和UDIM UV贴图文章提到的数据和Disney Animation在实际制作的情况有这么大的差别呢?
根据Burley的说法,“PRMan在各个线程之间会使用找色网格,它们能够以最少的冲突连贯地存取材质,所以有一个共享的Ptex缓存就可以了。我们在《冰雪奇缘》中只用了一个共享缓存。不过使用了光线追踪的GI之后,材质存取可能就会变得不连贯,而且共享的缓存可能会出问题。在这种情况下,可以在每个线程使用一个单独的Ptex缓存。比如PRMan本来没有每个线程的独立缓存的,不过现在它终于改进了这项功能。当Ptex在每个线程都有单独的缓存时,”Burley解释道,“就不会出现有Ptex产生的多线程拖慢的现象,只是会增加内存的占用。”
这次研究还使用PRman 18.0测试了Ptex网站的茶壶例子(输出分辨率改为4096x4096——设备参数为16核,128 GM RAM,没有超线程,RHEL):
在这个案例中,在Ptex使用16线程时达到了6.7倍速,相比之下,我们之前的文章只测试出1.5倍速。这点完全改变了多线程的情况,即使在6.7倍速时它的缩放比例不是1:1。为了进一步研究这个问题,我们值得探讨一下当运行没有任何材质的测试时的线性程度……
使用Ptex在16线程(16核设备)进行测试的达到6.7x的倍速,而不带任何材质的测试的倍速为6.5x。这个场景跟原来渲染测试使用的并非完全一样(fxguide第一篇文章),而且这只是一个演示性的例子,不过它明确展示了Ptex在每个线程都配有独立缓存时不会出现问题。
Burley进一步补充说这不是RenderMan团队单独发现的技巧。他指出它在使用V-Ray时没有在每个线程使用独立的缓存。“Chaos Group的Vladimir Koylazov为Ptex做出了一个用于V-Ray的改进版本,它能够在多线程共享缓存时达到更大的规模。”Burley说道。Koylazov将这个优化的共享缓存发布到了GitHub上面,让其他人都可以使用它。这是Ptex的一个独立分支,目前应该只能用于V-Ray。
Burley进一步补充说这不是RenderMan团队单独发现的技巧。他指出他在使用V-Ray时没有在每个线程使用独立的缓存。“Chaos Group的Vladimir Koylazov为Ptex做出了一个用于V-Ray的改进版本,它能够在多线程共享缓存时达到更大的规模。”Burley说道。Koylazov将这个优化的共享缓存发布到了GitHub上面,让其他人都可以使用它。这是Ptex的一个独立分支,目前应该只能用于V-Ray。
注意:在上面的新测试中只使用了一台16线程的设备——没有测试32和64线程的设备。
灵活性
下一个重点是关于Ptex制作流程对于改动的灵活性。
“如果你的几何图形没有足够的细分,那么Ptex的分辨率也会不足……”
——这也是第一篇文章中提出的一个观点,但是在Disney Animation的情况来说,这种说法是明显不准确的。
Hoodie模型
“Ptex可以让我们在开始制作素材之前(也就是视觉发展)先绘出渲染模型。”Burley说道,“然后在素材进入视觉发展阶段时,我们很少会锁定这些素材,模型的变动是一个无法改变的事实。优秀的材质转换工具就不会在这方面产生问题。”
跟其他点不一样的是,这个点是以Disney Animation现有的一些独特的技术为核心。一般的用户都不会有Disney Animation的转换工具。
虽然Ptex的制作流程可能会产生一些难题,但是Disney Animation认为他们已经利用内部的编写工具解决了。具体来说就是自动调整大小(在物体空间中使用目标每单位texel为每面材质计算出最优的分辨率),在不同的模型之间转换(基于位置,texel到texel,或者面到面),复制粘贴/镜面和平面绘图。这些是传统的UV材质制作本身能够做到的事情。
制作人员都比较喜欢拥有制作平面绘图(flat painting)的能力,即使他们知道材质在重新制作非平面模型的表面时肯定会发生改变。制作人员可以使用交互的工具快速简便地选中一个三维表面的局部区域,并对其进行平面化,用于2D绘图,最大限度地减少扭曲变形。
平面绘图
这些编写工具似乎并非是Disney能够在Ptex制作流程中实现如此成功的效果的主要原因。
好消息是Disney Animation正在将一系列的转换工具制作成一个开源的工具,这个慷慨的举动可能会对其他工作室对Ptex产生颠覆性的看法改变。
为什么不继续使用UV?
对于Disney Animation的Brent Burley来说,UV至少有4个会导致技术总监或者制作人员放弃使用的问题(假设编写工具已经解决了大部分的其他问题):
制作人员都比较喜欢拥有制作平面绘图(flat painting)的能力,即使他们知道材质在重新制作非平面模型的表面时肯定会发生改变。制作人员可以使用交互的工具快速简便地选中一个三维表面的局部区域,并对其进行平面化,用于2D绘图,最大限度地减少扭曲变形。
●UV可以说是一种麻烦或者瓶颈,它们通常都需要专业的缝合解决方案
●UV在过滤缝合线,特别是带有位移的缝合线时会出现问题
●UV扭曲变形
●排列UV在IO方面的困难,每个区块都有独立的文件,相当于有100倍的材质数量
考虑到缝合线和UV区块的本质,Ptex可以提供一个强大得多的过滤环境。Ptex可以提供无缝的过滤,这点对材质制作人员能够起到很大的作用。Burley还指出Ptex无需安装时间和工作,所以也避免了UV浪费空间的问题(空白的材质区域),UV在每个文件的随意材质数量也算只是一个小问题了。Ptex在使用的时候能够更加高效地利用内存,这点可以体现在储存和读取两方面。
●稳定的表面优化(磁盘、内存、过滤器)
●对于像素的精细控制,可以区分每个材质层
●针对渲染优化的文件格式,减少文件数量和最小化寻道次数。例如,特定的mipmap等级中的所有材质都会储存在一起。
●没有自带的每表面分辨率限制,大型表面材质可以根据需要排列。
关于最后一点,Disney团队目前在他们的编写工具可以达到8kx8k的分辨率,而且正在测试16k。
Disney Animation最新的四部电影都完全采用了Ptex:《闪电狗》(2008)、《无敌破坏王》(2012)、《冰雪奇缘》(2013)和他们的下一部电影《超能陆战队》(会在今年推出)。这些电影的每个镜头都可以储存超过几百GB的材质数据。
右图展示了Disney Animation的编写工具如何轻易地进行重新定向。
●原始模型总共含有3064个四面体
●原始模型的拓扑结构,不含材质
●在添加一对突起圆环之后的新模型。表面/顶点的排列也受到了影响。
●由于模型的变动,所以以前的Ptex不能准确的映射。某些表面的材质是完全缺失的,其他表面也会有错误的图像数据。转换需要经过两个步骤,这是为了保持材质的质量。面到面的复制会保留原有的texel数据,没有经过重采样,所以能够保持完美的质量。
●许多表面都可以逐像素转换,这个过程非常快速,而且可以完美地保留材质质量。
●剩下的表面是使用基于3D位置的逐texel转换来完成的,新模型总共有3192个四面体。
封面图的材质并非来自Disney,而是来自D Sharon Pruitt。