SubstanceDesigner制作泥土材质
SubstanceDesigner是一款功能强大的材质制作软件
界面,节点
GRAPH 工作区,也叫节点编辑器,graph容纳及操作节点的地方,EXPOLORER栏中每一项都可对应一个工作区
LIBRARY 库,是用来收集所有节点的地方,例如Generators/Noise中就包括了一些噪声节点,将其拖入GRAPH栏就能创建节点(这个过程被称为节点图形化InstancingNodeIntoGraph)
PROPERTIES 编辑节点的各种参数
3DVIEW 预览graph的最终3D效果,可以打开Scene更改graph的显示形式,平面、球体等,使用的网格是SubstanceDesigner内部的FBXmesh,可以通过软件包导入自己喜欢的mesh
2DVIEW 预览选中的节点的2D效果
此时,GRAPH表示的界面就是主graph或父级graph,内部的节点就是子集graph,它们是同一种东西。
值得注意的是,节点也是图像本身,右键节点,点击OpenReference(打开源文件),可以查看这个节点的内部结构:
将节点引入,其实是将图形实例化。这意味着可以在SubstanceDesigner中创造和编辑任何图形,如noise,filter,utilties
节点的保存形式为*.sbs 是SubstanceDesigner的保存方式。
在GRAPH中按下空格,可以打开一个节点列表,里面包含了各种atomic节点(原始节点)/operational节点(运行节点),例如混合(blend),模糊(blur),调色(huSaturation),色阶(level),字体(text),转换(transformation)等节点。这一类节点是SubstanceDesigner的内核,经过优化,可以经常使用,也可以在Graph栏上边找到。
这一类节点不是图形,它们是辅助图形的一类效果。
材质的工作流程
大体上的流程:
1,描述材质的形状,得到height(高低差)数据
2,从得到的height数据,制作出各种贴图,如法线贴图(normal),环境光遮蔽ao贴图(ambient occlusion),粗糙度贴图(roughness)
3,融入反照率贴图(albedo)和色彩(color),并将所有贴图混合到单一材质节点中
4,将材质进行混合,创造更复杂的材质
5,将材质的最终贴图输出
从灰度开始
灰度贴图从视觉上描述了一个材质的高低,并且由于灰度只有从全黑到全白一条颜色线,在观察与编辑时不会受到其他颜色的干扰。方便我们制作Height数据图谱。在建立灰度形状图案时,会使用到建模雕刻的方式:创建大体结构->细分网格->添加细节->继续细分… 从简单形状入手到更小更繁琐的细节。
创建SubstancePackage
UI的左上角File/NewSubstance
直接创建空节点,SizeMode和Format都为RelativeToParent(继承自父级),这个选项可以让节点通过父级传来的设置自动继承。
在EXPLORER界面中可以看到创建的*.sbs文件,类似于Ps的psd文件,内部有很多堆叠的图层,sbs文件是由很多节点拼接在一起组成的。一个SubstancePackage中也可以包含多个graph。
3D视图的调整
3DVIEW用于预览graph的最终3D效果。
可以打开Scene更改graph的显示形式,平面、球体等,使用的网格是SubstanceDesigner内部的FBXmesh,可以通过软件包导入自己喜欢的mesh
可以打开Materials/材质名称/Definitions,修改材质使用的Shader,在渲染一般PBR材质时默认使用physically_metallic_roughness
它的两个模式:Tesselation(曲面细分)和ParallaxOcclusion(视差映射),选择Tesselation
Lights用来调整环境光照,暂时不使用。
Camera用来调整摄像机参数,可以使用快捷键来简易完成Camera的移动操作
Enviroment可以调整3D视图所在的穹顶/天空盒,打开并点击Edit,PROPERTIES界面可以调整Enviroment的各种参数。
默认Enviroment:
LIBRARY中也默认附带了很多Enviroment天空盒,在LIBRARY的3DView中,可以找到各种Enviroment,将它拖入3DVIEW中就能使用了
第一个节点
规范的创建一个材质,首先要得到材质的HeightMap(高低差贴图),从建立一个BaseMaterial节点开始。
在GRAPH中按下空格,搜索base可以找到BaseMaterial
左上角的两个badge分别代表此节点的PROPERTIES信息和2DVIEW信息。另外它还包含了多个output。
这个节点代表了一个完整的材质。
双击任意一个output,可以观察这个output输出的图形的2DVIEW。
如果观感上output太多,可以打开顶部栏的LinkCreationMode,选择CompactMode(紧凑模式),切换的快捷键为键盘上的123三个键
PROPERTIES:
BaseProperties(基本参数) Attributes(属性) InstanceProperties(实例参数) InputValues(输入值)
重点是InstanceProperties,这里可以控制材质的各种参数和预设。
将MaterialPreset改为Dielectric(非电介质),也就是非金属,我们将要制作一个泥土的材质。另外,MaterialPreset里还支持各种常用金属的预设。
BaseColor中可以设置此材质的基底颜色,可以使用sRGB和HSV两个模式。
Roughness(粗糙度设置)中,将RoughnessValue设置很高,模拟泥土。
可以将材质右键按住拖给3DVIEW以便在3DVIEW中使用Shader观察材质效果。如果成功,材质左上角会多出3DVIEW的budge。另外,不是所有的节点都可以拖给3DVIEW,必须是完整材质才行。
低粗糙度情况下有了反射效果:
创建大结构
为了创造泥土的Height贴图,首先需要一张噪声贴图来给出地表凹凸的大结构,在LIBRARY中寻找一张合适的Noise贴图(必须有scale):
将它的Scale缩小,看起来模糊,就是一个很好的大结构。
另外,材质会自动四面连续(tiling),在2DVIEW中按下空格可以观察到:
红色方块内代表一个连续单元。
每个在GRAPH中的节点都是GRAPH的子集,每个节点下方都包含两个数据:分辨率和颜色模式。
L16代表Luminance(亮度)+颜色空间位深度16位,代表这个灰度节点是在16位上运行的。
由于它是一个灰度节点,所以它的Output是灰色的,如果Output输出的是一个RGB图形,它就是黄色的。
BaseParaments的设定:
OutputSize代表这个图形输出时的分辨率,是继承父级的分辨率乘以一个比例,父级自然是graph。可以设置这个值是RelativeToParent(继承自父级)还是Absolute(绝对值)。另外,在GRAPH中也可以找到设置整个graph的parentSize的地方。
将height图形传给BaseMaterial:
打开BaseMaterial的InstanceParameters,找到User-DefinedMaps,它的内部包含了很多可以从其他节点接入的接口,将Height改为true。
连接两节点,就能完成Height的传输。
如果需要在3DVIEW中可视化这个height,还需要给BaseMaterial传递一个NormalMap(法线贴图),在GRAPH中新建一个法线节点:
在它的SpecificParameters中可以调整法线贴图的强度,也可以直接点击并输入超过滑块上限的值
在BaseMaterial/InstanceParameters/User-DefinedMaps中打开Normal,将法线贴图传入即可。
可以看到3DVIEW在法线贴图的影响下有了凹凸感。
然后打开3DVIEW/Materials/Shader名称/Edit的设定,将Height的Scale调大。
3DVIEW的视图在Height*Scale的影响下发生了凹凸。这里使用的3DVIEW的Scene模式为Plane(hi-res)
上述步骤下,噪声给的法线贴图和Height被BaseMaterial接收,这两个数据经过Shader的处理,表达在了3DVIEW中。
另外,我们可以给BaeMaterial加入AmbientOcclusion(环境光遮蔽HBAO)来强化体积感:
同样创建AmbientOcclusion节点,它需要一个Height数据,就将噪声图形传给它,打开BaseMaterial/InstanceParameter/User-DefinedMaps下的AmbientOcclusion,将输出的环境光遮蔽信息传进去即可。
如果遇到节点不能连接的情况,可能是因为LinkCreationMode没有改为Standard形式,紧凑模式下有些接口无法工作。
细化Height
拉近距离,可以发现现在的贴图还是很粗糙的,为此我们需要给大结构添加一些细节:
点击顶部栏的Frame可以给大结构添加一个框架,方便区分。拖动框架可以直接拖动框架内的所有节点。
将两个新的噪声加入Shape中,新建Blend节点,用来混合两个图形。
黄色代表传入RGB图形,灰色代表传入灰度图形,上黄下灰代表都可以,中间有圆点代表主要参数(必须有值),而且主要参数决定了这个节点的分辨率和颜色深度
入口从上到下分别是:前景,背景,透明度。
这里使用Cloud2作为前景(用于淡化背景的效果),Cloud3作为背景(有较好的粗糙纹理)
Blend的SpecificParamenters可以用于调整两图形的混合方式,Opacity不要设置太高太低,不然混合效果不好。
不同的BlendingMode代表不同的混合方式,可以将两图叠加、相减、相乘、覆盖等等,根据实际情况而定。
然后将blend输出的图形与大结构混合得到细化后的结构:
Blur节点:可以改变传来的图形的模糊度,这里使用Dirt3节点作为噪声(明暗有序,适合做凸起效果)
Levels节点:改变传来的图形的色阶(告诉图形该显示什么,不该显示什么)
为泥土加入更多细节:
散布结构ShapeSplatter
可以通过节点来实现泥土中一些细小物件的制作,并将它们散布到泥土中。
要制作一些细小的散布结构,需要用到Shape(形状)节点,这个节点可以创建一些规则形状。然后使用噪声图形将这些规则形状变得不规则
Shape节点的InstanceParamenters中可以调整的参数:
Tiling:一行/一列有多少个物件
Pattern:物件的形状
Scanle:每个物件的缩放大小
Size:不同轴向的缩放大小
Angle:旋转角度
创建一些土块(贴图表格):
然后需要使用Wrap(扭曲)节点将这些土块形状变得随机:
Wrap节点需要两个输出,上边是要扭曲的图形,下边是GradientInput(坡度输入),添加GradientInput的意思是需要根据一个噪声来模拟坡度用于扭曲图形。
使用一个有点模糊的噪声图形:
Wrap节点的InstanceParamenters的唯一参数就是Intensity,可以调整扭曲的强度。
通过观察,土块结构太散了,因以还需要调整图形的色阶(Levels),保证这些土块不会太大或太小:
到此为止已经有了土块的样貌,但是还是太过平滑了,需要添加一些额外的面,使用SlopeBlurGrayscale(坡度模糊灰度图形),另外一个SlopeBlur是给RGB图形使用的,原理类似于在建模中切割/拉高一些地方,让本来平滑的面更尖锐。
SlopeBlurGrayscale有两个Input,分别是需要处理的灰度图形和坡度来源;坡度来源需要一个噪声图形来规定,将之前使用的噪声图形引入也行。
参数:
Samples:取样点,这个值越大,坡度过渡越平滑,但性能开销更大
Intensity:模糊强度
Mode:处理方式,Blur:默认 Min:只变暗 Max:只变亮
使用CropGrayscale将得到的土块取样,用于添加到泥土中:
点击Area可以控制这个Crop取样整张图像的哪一部分(哪颗土块)
将可以使用的土块选出,加入ShapeSplatter节点,可以将选出的土块散布。
ShapeSplattern节点:
需要一个背景作为基底,然后加入各种Pattern,构成散布效果。另外其他的输入可以给定一些噪声图形来干涉InstanceParamenters里的参数
InstanceParamenters参数:
Pattern:散布结构的参数
Height:背景高度数据对散步结构的影响
Masking:遮罩,控制散布结构的随机显示
随意调整内部参数,制作出泥土+散布结构的图形:
复用节点制作小型散布结构
使用之前已经用过的节点,拼接成为一个新的ShapeSplatter:
使用之前的Wrap输出的图形,和使用过的Cloud2噪声图形,SlopeBlurGrayscale输出一个细节更多的散布结构:
将它作为新的ShapeSplatter,添加Crop,作为Pattern输出:
添加一些鹅卵石:
使用之前Wrap出来的图形,经过不同的色阶处理,可以得到鹅卵石的效果:
使用SubGraph制作树枝
树枝是个比较复杂的物体,新建一个SubGraph单独制作:
新建Shape节点,使用Capsule形状并使用色阶做出树枝的形状:
然后使用Shape新建一个Capsule形状节点,使用Transformation2D移动图形的位置和旋转角度,将做好的图形与树枝形状一起进行DirectionalWrap,这个节点可以根据输入的IntensityInput改变物体的形状。中间可以添加一个Blur节点让树枝形状变得平滑
添加一个Perlin噪声节点,与树枝图形再次进行DirectionalWrap,略微扭曲
复用Perlin噪声,使用SlopeBlurGrayscale给树枝添加少量分叉,SlopeBlurGrayscale可以让图形的白色部分向噪声图形的黑色部分扩张,要选择Max模式才能扩张白色部分。然后使用色阶减小图像模糊:
到此为止,树枝的形状就完成了,接下来需要处理树枝的纹理
首先需要降低边缘高度:
使用这样的管线可以简单降低图形边缘亮度:使用Blur模糊图形,然后将被模糊图形与原图相混合,使用Multiply混合模式。
为树枝添加简单纹理:
使用GrungeMap002纹理模仿树木纹理,接入Transformation2D节点旋转90度并混合,做出横竖相间的纹理样式
将纹理拓印到树枝上:
需要先使用Wrap节点将噪声纹理对树枝进行针对性扭曲,让该纹理完全符合树枝形状,然后将扭曲后的纹理与树枝混合。这是经典的为图形加纹理的操作,BlendingMode为Multiply。使用Wrap以原图为GradientInput(坡度输入)修改纹理图形后与原图一起混合:
除了纹理,还可以添加一些斑点:
与添加纹理类似,先选取需要的噪声图形,可以添加Transformation2D来改变噪声图形的各种属性,可以选择是否使用Wrap,否则可以直接进行Blend。
最后连接一个Output节点用于输出树枝的信息,IntegrationAttributes/Usage可以调整要输出的数据种类,Identifier和Lable可以调整这个Output接口要显示的信息。
SubGraph参数外部可控
当我们选中一个参数并点击右上角的曲线按钮时:
可以处理这个数据的表达形式,默认是Edit(可编辑状态) Expose(变成根级变量) EmptyFunction(挂载函数) ConstantValue(变为常量) ResetToDefaultValue(返回默认值)
点击Expose,命名好后此参数就变成根级变量了,此时我们双击GRAPH空白处观察根级节点,InputParameters中就多出一个变量了,使用这个功能可以为上级节点提供可控性。
它的参数:
Identifier:参数的名称
Type:数据结构 Editor:数据输入方式(滑块/角度/颜色),不同数据结构有不同的输入方式
Description:此参数的描述
Label:外界可以看到的此参数的名字
Group:分组,填入字符串,使用Group分组后的参数可以使用同一个下拉栏设定,分组规划控件:
Default:此参数的默认值
Min/Max:最大值/最小值
点击右上角的眼睛图案可以预览外界看到的此参数的样貌。
另外Ctrl+F可以搜索节点中的参数,并会突出显示找到有名为scale的参数的节点。
如果节点过多,可以选择详细命名法。
将树枝散布到泥土
将树枝的SubGraph拖到主Graph下就可以像一般节点一样使用了,还可以调整参数。
因为有一个Height的Output所以会有一个Height的接口。将它散布到泥土上:
粗糙度贴图Roughness
粗糙度可以表达材质的表面对光线折射的强度,也是一张灰度贴图,越白越粗糙,而原Height贴图不是很清晰,我们使用导出的AmbicentOccasion贴图:
不符合要求,我们希望泥土中凸起的部分粗糙度低一些(如石子),凹下的部分粗糙度高一些,所以需要使用Invert(转置)节点,它可以将贴图的亮暗颠倒:
还需要调整图形的色阶,拉高整体的亮度。还可以混合一个噪声节点,让粗糙度贴图也具有纹理。
可以明显观察到3DVIEW中材质有光泽了。增加一个HistogramRange节点,使用Position来宏观控制Roughness贴图的亮度,将它提拔为根级参数。
给泥土添加基底颜色
使用GradientMap节点可以将灰度图形转换成RGB图形,并且可以按照灰度,选取不同的颜色作为替代,在GradientMap节点的GradientEditor中可以设置颜色取样,使用PickGradient可以直接从图片上选取色块。
为了构造颜色基底的纹理,可以使用法线贴图平滑后的图形,使用CurvatureSmooth(曲率平滑)节点,这个节点可以描绘法线贴图的细节,输出灰度贴图。
将法线贴图曲率平滑后的图形与Height混合,得到基础的颜色基底,然后添加一些噪声细节,如果图形黑色与白色区分过于明显,可以使用HighpassGrayscale节点,这个节点可以保留图形的中间色,提亮暗部,降低亮部,降低图形的对比度。最后使用GradientMap得到颜色图形,为BaseMaterial加入BaseColor入口并拖入:
此时如果将基础颜色与法线贴图曲率平滑后的图形(需要GradientMap节点变成RGB图形)相混合,能得到具备更多细节的颜色:
另外,如果材质需要进行物理渲染(PBR),可以将基础色接入LIBRARY/MaterialFilters/PBRUtilties中的PBRBasecolorMetalicValidate节点,这个节点可以显示图形的哪些部分的色域太高以至于不能使用PBR,全绿的话就是可以渲染。
为石子上色
对于散布结构,ShapeSplatterBlendColor可以精确的为每一个Splatter上色,ShapeSplatter节点的剩下两个Data输出就可以用来给ShapeSplatterBlendColor。
观察ShapeSplatterBlendColor的参数,它可以输入多个颜色,着色同一类pattern,它也可以随机化pattern的颜色,我们可以使用噪点+GradientMap制作颜色并拖入:
给大石子也加入颜色:
加入一些树枝的细节并上色
回到树枝的渲染节点,为树枝添加更多纹理:
使用NonUniformBlurGrayscale可以进行不规则模糊化,然后贴入新的使用DirectionalWrap扭曲过的纹理:
上色:类似于石子,但是对于不同形状的树枝要有指定的GradientMap,另外,每个树枝上的斑点也要使用Level色阶节点来进行区分着色。
大小树枝合并着色然后输出:
压缩颜色深度
颜色深度用于表示颜色的丰富程度,越丰富的颜色,就需要越高的颜色深度,8位,16位,32位,一般的游戏引擎都支持16位深度的颜色。
BaseMaterial现在的位深度为C32F,即RGB32位float型。明显过大,计算时会有较大的性能开销。
每个节点都可以设置输出格式,在BaseParamenters中的OutputFormat,可以将这个值改为RelativeToInput、RelativeToParent、Absolute。
RelativeToInput:与主要参数相一致;
RelativeToParent:与主Graph相一致;
Absolute:绝对值
压缩颜色深度的目的是减小运算量,放任一个高位深度的图形参加多次运算会显著降低性能。最好的压缩颜色深度方式就是找到发生颜色深度上升的哪个节点,并手动降级,然后在这个节点下注释RemokeTo**(位深度)
另外,BaseMaterials里有一个Height取值范围,它会影响材质最终Output出来的Height的范围,如不必要就将它调整为1。
材质分层
当我们需要通过混合多个材质来创造新的材质时,需要用到材质分层,原理是在底层材质的基础上混合新的材质(上层材质被称为遮罩Mask),并将两者平衡从而得到新的材质,使用MaterialblendColor节点可以做到。
使用建好的BaseMaterial与LIBRARY中的一个dirt遮罩相混合,位置是LIBRARY/MeshAdaptive/MaskGenerators,这个文件中包含了很多预设的遮罩。
MaterialblendColor的参数:
Channels用来控制底层材质传来的各种信息,下边的选项可以控制相对应的贴图。
Channels:
Diffuse:漫反射贴图 Specular:镜面反射贴图 Emissive:发光贴图 Glossiness:光泽贴图 这些参数泥土贴图都不需要,所以取消勾选
将BaseMaterial传入:
Dirt遮罩的设置:
要想创建Dirt遮罩,需要两个贴图,一个是AmbicentOccasion环境光遮罩贴图,一个是Curvature法线转换曲率贴图,可以用法线贴图曲率转换CurvatureSmooth得到:
将Dirt接入MaterialColorBlend的Mask接口,完成遮罩,随意调节两材质混合的方式和参数,达到效果为止。
输出节点,导出贴图
要想将材质使用到引擎中,需要导出材质的每个贴图,然后到引擎当中整合,右键最终输出的材质文件/Create…/OutputNodes,选择No,可以将该节点所有输出数据做成Output节点输出。
然后点击GRAPH顶部栏的Tools/ExportOutputs就可以输出为贴图了。
勾选AutomaticExportWhenUpdatesChange可以在每次节点数据更新后更新所输出的贴图。
导入Unity中:
可以选择导出sbsar文件,这个格式的文件可以被Substance的其他软件导入,也可以导入拥有Substance插件的游戏引擎中,在游戏引擎中可以调整SubstanceDesigner中根级节点的参数,达成材质的可控性。
|