判断网站模板版本/郑州优化网站公司

引言: 我是一名泛开发者(Generalist developer ),大约在2年前开始着手研究3D和游戏开发相关的主题。我刚开始主要是专注于学习虚幻4和摄影测量(Photogrammetry)技术,现在在研究SD。同时,我也在研究角色和生物体的建模,对Hair & Fur生成也很感兴趣。
原文作者:Olivier Lau 开发者,TA
译者:如果大家在做毛发纹理生成工具设计,可以了解一下Olivier Lau的整体制作思路,挺有趣的。
了解头发生成
我看Johan Lithval的CGMA网络研讨会 <游戏中的头发生成>视频时,第一次了解了实时头发制作。视频中展示的品质和技术,让我感到惊叹。不过,我最后明白了各个部分是如何串联起来的。我不用Maya,所以得找其他方法来生成头发纹理。我试过很多其他的工具,但要想在合理的时间内轻松地生成毛发,并不顺利。
据我所知,通常游戏中的头发/毛发是用插片(Hair card)来做的,把发束(Hair clump)纹理映射在低模几何体上。然后会用特定的shader来实现深度、透明度、各向异性反射等多种效果。我们需要的纹理贴图的类型及Shader使用它们的方式,不一定适用所有的工作流程,这取决于Shader的运作和性能要求。我觉得,某些工作流要求一些特殊的贴图,而另外的工作流可能有时只是更改了贴图的命名而不是功能,这些会给美术师的理解造成混乱,起码刚开始我就中招了。 Hair & Fur 工具可提供10种不同贴图(含衍生的,不算上全部可能的生成方式),基本能解决大部分的需求。
与此同时,我也在研究Substance Designer,特别是我对它的编程功能很感兴趣。看Vincent Gault的 FX-Map introduction stream (法语)视频时受到启发,我才真正开始把SD和头发纹理制作结合起来。那时我明白了,大部分的SD节点都是基于一组简化的原子节点,而FX-Map实际扮演着一个高级的屏幕设备角色,通过各种选项将任意位置的图案显示到纹理中。大多数能被函数驱动。将之用于迭代上,能使FX-Map节点成为一个可自由编程的内含纹理的生成器。我开始尝试实现了一个Bézier曲线,随后发现它能被用来生成头发/毛发纹理。
在此,我想感谢Allegorithmic公司的Nicolas Wirrmann,他帮我了解了SD的编程特性、优化技巧,给了我很多建议。Hair/Fur工具的研究离不开他的支持。
Hair & Fur工具的特点




Hair & Fur工具允许用户去制作不同类型的头发和发型以用作插片,并生成PBR纹理贴图及其他头发shader所需的贴图。它还提供了tilling工具将发束合成较大的纹理,以减少渲染引擎的纹理处理量。这个工具也能用于2D创作(我们提供了样本)。Hair&Fur工具提供两种可供选择的上色模式。举个例子,深度贴图能在Hair & Fur工具外部上色,在SD或其他软件中上色。本文中,我提供了示例,模板(范本文件)和预设(基础设计),以便各位能快速做出各种发型。
虽然是在SD中运行,但因为大部分功能都内含于Substance工具中,所以你只需要你懂一点基础的Substance知识即可。Substance Academy上有一些不错的 SD的UI基础介绍 视频教程,Hair & Fur第一节教程视频中也包含了关于SD的UI介绍。
发束塑形(Hair Clump Shaping)
头发纹理生成的难点之一在于:发型(含颜色)种类非常多,但又只能在功能集和用户界面上暴露很少的参数。所以每当我希望给一个特定的发型做一些支持时,都需要把它从特定的发型中抽象成更通用的,能方便用于其他项目。
我的解决办法是,从一些角度观察并给每一层提供塑形的功能。头发最外层叫做父级,代表发束或部分发束。通过这种方法,最多可生成10股父级"发丝(Strand)",每股父级发丝(Parent Strands)通常代表该发束的最主要特征。它们和相关发丝(子级发丝和子细分发丝)都可被单独定位、旋转和显示/隐藏。子级发丝(Child Strands)由父级发丝生成,数量不限,用于“填充”与父级发丝相关的发束区域。然后是子细分发丝(Subdivision strands),由父级或子级发丝生成。子细分发丝提供厚度,因为发丝会拧成一团,如卷发般有相同的形状。最后,相关的发丝(Related strand)共享一个组织关系,用于制作辫子或者绳索。

发丝的形状和设计,可用十多个控制点来调节。它们的位置可通过各种参数,或直接在SD的2D视图中移动位置来调整。


子级发丝可被整簇梳开或只是一部分被梳理。

图案管理(Pattern Management)
发丝由图案(位图或由SD生成的程序纹理)组成。默认有四种图案可供选择,用户也可用自己的图案,颜色或灰度图都行。图案的大小和分辨率可自选,图案能设置为跟随发束的形状变化或者不跟随,而且能动态调整尺寸,以减少计数生成连续的线条。动态尺寸也能用于制作绒毛效果,甚至可以设置一个极端值做成吸管。

发丝的厚度,渐变和长度(Strand Thickness, Fading, and Length)
可随意调控发丝(发根到发丝)的厚度。这个功能很适合做厚厚的头发,能做风格化的头发。

发根至发尾的渐变效果可应用于多张贴图中的发丝中,效果取决于用户,可以设置为均匀的渐变,或随机不均匀的渐变。

通过邻近因子(proximity factor),调整发丝的长度和对发根分组。

子细分发丝(Subdivision Stands)
子细分发丝由父级或子级发丝生成,一般非常靠近它们的子级发丝,能增强厚度感。用户通过定义子细分发丝的“扩散范围(spreading space)”以控制子细分发丝的分散程度,深度多少都会受它们的子级发丝影响。子级发丝的深度能在“扩散范围”的侧面(侧面深度)处衰减,辫子利用此功能可实现圆滑的效果。一些细分发丝可能是杂碎的,飘散在“扩散范围”之外,能实现头发的飘逸感。子细分发丝可随机分布于其子级发丝间,可实现更丰富的表现。

调制(Modulation)
当和相关的发丝(Related Strands)关联时,调制能用于生成波浪/卷发和辫子/绳子。有两个调制函数可供使用,正弦(有变形)和三角形,后者可用于非发型设计。用户可定义波的频率/幅度。通过使用频率调制,幅度可随频率随机变化。这些设置能增强真实感,每个卷的形状也不完全相同。
调制也能影响深度,从而实现3D效果,其位置是可调控的,且能与实际的发丝深度结合。调制幅度能从发根到发尖减弱。比如,可让发根的波浪度小于发尖。调制跟随发丝的走向,所以能用于设计任意方向的发丝,如圆形(卷发或丸子头)。

生成头发贴图(Texture Map Generation)
Hair & Fur工具能生成多种贴图,能用于shader或2D创作。

- 遮罩:二进制mask。把发丝从背景中分离出来。
- Alpha(不透明):维持图案的不透明度,并支持发根到发尾的渐变效果。
- ID (灰度/颜色):每股发丝代表在一定调控范围内的随机灰度或颜色。Shaders可用ID来区分不同的发丝,并将其应用于不同的效果。
- 深度(高度):深度/高度图包含被深度配置文件(depth profiles)驱动的高度信息,可自动生成或者用户自己提供。深度贴图可被当成Shader的像素深度偏移来使用,实现头发的厚度感。也可用作其他目的,如镜面反射遮罩或强度。
- 渐变梯度(Root map):类似于遮罩贴图,但用于控制发根处的渐变。能在发根使用可配置的渐变。Shader通过它来改变发根的颜色(如变暗)。
- 颜色(漫反射/Albedo):Shader不一定总需要有颜色贴图。因为我们能从其他贴图或用户的参数中实时生成颜色贴图。但是,它对2D作品或需要此类输入的shader很有用。Hair & Fur工具提供了多种头发上色的方法,如可沿着发丝的长度(按长度着色),头发组(按组着色),深度驱动和多种模式组合进行上色。后文会详细说明。
- Flow贴图 (方向):这是一张包含沿发束流动的发丝方向的矢量贴图。Shader可用这张贴图来驱动头发上的各向异性反射,使其跟随头发流动。Flow信息可基于每股发丝生成,也可以基于多股发丝全面生成(或两者中任选一种)。它还能生成一张定向的背景图(实心或使用扩张)。

- 法线贴图:法线贴图是用SD节点从深度贴图中衍生得到的。并非所有shader都需要法线贴图。
- 环境光遮蔽(Ambient Occlusion):也是从深度贴图中衍生得到的,不是所有shader都需要这张贴图。
- 功能性(Utility)贴图:这张贴图通常不会被导出,但是会被用在头发的设计上。它的功能是,显示带有可选控制点覆盖的所有贴图,及Flow贴图,以便用户验证流动效果是否符合预期。
深度管理(Depth Management)
我们通过一个独立的深度配置文件(depth profile)来管理头发的深度。生成一张纹理,其中每列代表一个可以与发丝关联的不同深度信息。
深度配置文件是由如深度变化的频率/振幅等通用参数自动生成的。前10列深度配置文件纹理保留给父级发丝。可以常规/特定生成参数,或者使用用户提供的外部深度配置文件(用SD节点或其他软件生成)。

上色(Colorization)
在Hair&Fur工具中,有两种上色模式:按长度或按分组。可二选一,也可组合使用。两种模式都用用户提供的颜色源纹理进行操作。按长度上色是指沿着头发的长度对发丝进行着色,而按组上色则是指把颜色分组至颜色源,并将它们适用于发丝组。两种模式能用多种混合模式进行组合,如“乘法,柔光,叠加”等等。


按分组和按长度上色都能应用于头发组中:“父级”,“子级”或“相关发丝”(辫子)。按分组上色的话,每个父级和相关发丝(子级,细分)或每个子级和相关发丝(细分)都能使用不同的颜色组。对于辫子,每个辫子组件可用不同的颜色组。

颜色源纹理可有多种不同的组织形态,下面是一些示例和效果。
按长度上色通常是按行来组织颜色源,因为每一列代表发丝沿其长度的潜在颜色变化。颜色在横向不必是完全均匀分布,下图是通过调整亮度或沿着纹理宽度颜色实现的示例。

而按组上色,下图展示了如何利用颜色源形态来制作颜色组。在没有指定颜色组织的情况下,一个组由圆来定义,该圆的中心是随机选取的,半径可调节。对于水平或垂直向的颜色源,使用随机中心颜色和颜色变化方向上的范围来进行分组。一旦在颜色源中定义了一个组,便可在其中选择随机颜色并将其分配给“父级”,“子级”或“相关发丝”的发束。


我们也可以不使用上色功能进行着色。以下是用一个SD节点对深度贴图进行上色的示例。

发型(Hairstyles)

Hair & Fur工具能生成多种发型:直发,波浪,烫发,大卷,辫子(绳索)以及丸子头。但需注意,目前它仅能生成纹理,所以一般在发片上使用如辫子或大卷发的设计来实现小的特点。对于较大的网格,我们要3D定位映射(如对编织物进行隔行扫描)以获得更真实的效果。所以头发纹理不必弄成辫子形状,直发就行,因为3D模型可以处理辫子设计。
辫子能从不同的角度决定调制的频度和幅度、组件之间的空隙、整体形状,以及当被其他组件压下后辫子被压扁的程度,增加头发的飘逸感等等。


我们可以通过多种方式来调整大卷发的厚度、深度及形状设计。

Tiling
关于头发插片,在游戏中,为了减少引擎的纹理数量,开发者通常会把几种发丝组合成一张较大的纹理。为此,我们会提供tilling工具:
- Tiler(灰度和彩色):平铺(tile)一种纹理,灰度或颜色,如生成一张tiled深度贴图或tiled Flow贴图。
- Global Tiler:一次性平铺几种类型的纹理。即,一次性平铺好头发生成器实例的所有类型的发丝。还可以为tiled Flow贴图生成定向背景。
- AutoCrop:从一个视角比率裁减发束纹理的功能。
这些Tiling工具不仅可以处理头发纹理,还能用于组织图集(Atlases)。

Tiling工具允许用户设置输入(将发束纹理tile,通常为正方形)和输出的长宽比(此处为矩形2:1纹理)。我们能同时操作所有发束的间距/大小/偏移,以此来快速得到一个平铺好的纹理。然后,我们可单独定位/旋转/调整发束的大小,需要进一步调整。请注意,在此处理过程中,输入的发束永远不会被放大,各种大小调节都会被组合,然后在原发束上只展示缩小的结果,以此来保证纹理的品质不受损失。

程序化生成纹理的优势(Benefits of Procedural Texturing )
程序化生成头发纹理的优势:
- 程序化生成允许用户独立处理影响头发某些方面的设置,同时将它们与其他头发属性的设置无损地组合在一起。我们可用特殊的方式对发束进行造型,并检查将它们变成卷发,小波浪或直发时的样子,而无需调整其他发束的设置。

- Hair & Fur 参数控制固定和基于随机的设置。后者生成随机值,和用户可调控的随机种子相关。这意味着当随机种子变化时,随机值也会被修改。如此一来,通过简单地调节滑块,便可根据已有的设计创建出数千种变体,查看并选择我们喜欢的变体。此外,重置给定的随机种子值,也总能得到重置的完全相同的设计,可将其保存为“预设”,再重新打开。
- 我们可以创建一个包含不同设计的预设库,做为创新的基础。
- 不受分辨率的限制。我们可做一张8K的头发纹理,表现出更多的细节。如果将其他纹理tile到一个普通的纹理贴图中,则可以使用1K或更小的相同设计。
- 3D可视化预览效果,有利于深度校准。
- 无需烘焙,所见即所得。
- 通过结合Hair & Fur与Substance Designer的功能,可提高对可能性的处理。在SD中,能用多种方式对纹理进行预处理或后处理。
- 如果由于某种原因导致无法使用单个头发生成器实例进行特殊设计,则可用专门的SD混合节点组合多个实例输出。

在SD中集成(Integration into Substance Designer)
Substance Designer是一个程序化纹理生成器,很适合生成Hair & Fur。其优势在于模块化,无损工作流及与毛发生成器结合使用的其他功能,给我们的创造带来了更多可能。以下是与SD交互的功能实现列表(非详尽)。
- 用户可用自己的图案来绘制发丝,图案可由SD节点或外部应用程序生成。
- SD节点可生成颜色渐变来为上色功能提供颜色源。在传递到头发生成器之前,通过任意SD节点对这些颜色源进行调整,以调节亮度/对比度/饱和度/颜色变化/变形等等。
- 在传递到Hair&Fur之前,可使用任意的SD节点处理深度配置文件,通过这种方式可创建出许多效果,而头发生成器本身无法进行深度文件配置。
- 由于SD具有的程序化生成属性,在导入Hair & Fur工具前,可调整节点并可视化查看实时效果。所以,我们能在2D或3D视图中直接查看头发结果,并同时更改SD节点上的颜色或深度信息。
- 输出贴图在做好后,还能进一步处理和做混合。如,使用“乘法”操作混合“深度”和“颜色”贴图,通常在2D设计中能得到比较好的效果。
- 2D美术师可用Blend节点将头发覆盖在角色图像上,实时修改发型设计,同时观察它在角色上的效果。
- 使用SD属性及节点提供的所有选项(法线贴图算法选择,OpenGL或DirectX格式,各种AO属性等)来生成衍生贴图,例如法线贴图和AO贴图。
- 在使用适当的SD节点导出之前,可将贴图转换并打包到纹理通道中。
- 使用OpenGL或iRay渲染器对头发纹理进行可视化和3D渲染(使用置换)。这有助于可视化并可修复深度效果,因为在2D视图中可能看得不那么明显。(如用于裁剪)。

在应用中使用头发纹理(Hair Textures Usage in Applications )
生成的纹理可用于3D应用程序中,有时也可用在2D中混合合适的贴图。请注意,样本展示了为2D制作的各种范例。
输出纹理通常能直接在3D应用程序(例如游戏引擎)中使用,无需进一步调整。如有需要,可在SD内部进一步处理输出或在外部应用程序中进行修改。该软件包提供一个Toolbag 模板和Unreal Engine 4 头发Shader和Toolbag的使用说明。


最后,为了更便于用户使用,我会提供详尽的使用指南,其中涵盖了所有参数,各种概念以及制作特殊发型的技巧,这是一个免费的试用版应用程序。包含时长4小时(分为5节)的视频教程:
- Part 1:Substance Designer简介,基本的Hair&Fur概念和输出贴图
- Part 2:头发和毛皮参数
- Part 3:上色
- Part 4:在Toolbag和UE4中处理tilling和使用贴图
- Part 5:7个头发设计范例
我迫不及待想知道美术师们是如何使用这些工具的!期待大家的反馈(如使用 Polycount thread), 我们会基于当前正在规划的功能,一起来增强和创建其他功能。相关进一步的更新,请关注我的 Twitter and Artstation 。Enjoy!
本文仅限于学习参考交流,请勿做商业用途和随意转载。
原文链接:
Hair & Fur: Procedural Hair Texture Generation Tool80.lv
译 Qinfei
2019/11/27