本文将学习如何使用RealityKit材质来改变您的3D对象的外观,以及Reality Composer Pro如何帮助您实现这一目标。
材料是什么
材料是定义3D场景中对象外观的因素。材料可以很简单,只是单一颜色,或者它们可以使用图像。您可以将木纹理应用于椅子的模型,或者将砖块的图像映射到墙上。材料也可以非常复杂。它们可能使用动画效果,看起来像涟漪的水,或者根据观看角度改变外观。材料甚至可以修改应用到的对象的几何形状。visionOS中的材料使用基于物理的渲染(PBR)技术。这意味着可以使用与现实世界物体相似的物理属性来设计对象的外观,例如物体的金属感或粗糙程度。
材料由一个或多个着色器组成。这些着色器是执行计算其材料外观的实际工作的程序。在iOS和iPadOS的RealityKit中,引入了CustomMaterial。CustomMaterial中的着色器是使用Metal手工编写的。在visisonOS中,引入了一种称为ShaderGraphMaterial的新类型材料。这是为visionOS创建自定义材料的唯一方式。ShaderGraphMaterial使用功能块的网络或图形,因此得名。
ShaderGraphMaterial基于名为MaterialX的开放标准,并且是一种设计师友好的定义材料的方式。MaterialX最初由工业光魔(Industrial Light & Magic)于2012年创建。ShaderGraphMaterial支持两种主要类型的着色器,称之为基于物理的(Physically Based)和自定义(Custom)。基于物理的是一种基本的PBR着色器。对于较简单的情况,选择这个可以通过为每个属性提供常量、不变的值,如颜色或图像,来配置此着色器。另一方面,自定义着色器可以精确和自定义地控制3D对象的外观。自定义着色器可以包含动画,调整对象的几何形状,并在对象表面创建特殊效果,如闪亮的油漆外观。
我们可以使用Reality Composer Pro内置的Shader Graph编辑器来构建ShaderGraphMaterial。在visionOS中,材料可以使用Reality Composer Pro创建,这是一种新的专业开发工具,可以组合、编辑和预览3D内容。
构建一些自定义材料
使用Reality Composer Pro创建材料,这是一款新的专业开发工具,允许您构建、编辑和预览3D内容。我们从上文基础上开始操作。
首先使用"Deactivate"命令隐藏了我们不需要的所有对象。这让我们留下了中间的基座和顶部的景观。
接着添加一个材质,显示模型的地形,通过显示沿着地形的坡度的等高线来实现。要实现等高线地图,就要地形上的所有高度相同的区域之间绘制线条。就像下图所示,蓝线显示地形上1000米高度的所有点。于是可以通过一组函数来构建一个材料,这些函数将在我们的模型上绘制类似于这些线条的线条。
首先,在项目的Hierarchy面板底部的加号按钮下,我们选择"Materials"下的Custom。这将显示我们的编辑器的着色器图。新的自定义着色器始终包含两个节点,紫色的Surface节点和蓝色的Outputs节点。Outputs节点里Custom Surface的输入是连接到材料的active的Surface节点。Surface节点的输入是您设置着色器的基于物理(PBR)参数的方式,例如基础颜色。
将新材料取个描述性的名称:TopographyMaterial。将新材料分配给我们的Yosemite模型。在项目层次结构中选择它。在检查器中,在Material Bindings下,从Binding菜单中选择TopographyMaterial。请注意,模型从颜色变为简单的灰色,表示材料有效,如下图所示。
制作等高线材料
回到选择项目层次结构中的TopographyMaterial的Shader Graph编辑器。为了在正确的位置绘制我们模型上的条纹,需要连接一些节点到Surface输入。为了实现材料根据其在模型上的位置在哪里绘制等高线,需要在材料中添加一个位置节点。这个节点返回在3D空间中呈现材料的位置。这个位置只有高度有影响,所以需要添加一个名为Separate的节点,以提取位置的Y坐标。Separate返回Y坐标位置,该坐标随着地形高度而增加。
在编辑器的背景中双击以添加节点。这将弹出新节点选择器,包括所有可用节点的列表,可按名称或关键字搜索节点。
创建Position节点
输入"position"并从列表中选择Position节点,将其插入到着色器中。Position输出材料在3D空间中的位置。
创建Separate 3节点
材料随着高度变化,因此添加一个名为Separate 3的节点来提取位置的Y分量。再次双击背景以显示新节点选择器,然后添加Separate 3节点。
要在编辑器中进行连接,只需从节点输出拖动到节点输入。这两个节点合并在一起给了地形的高度。
创建Modulo节点
接下来,将取出Separate节点的输出并传递给模数节点。模数节点给出两个值相除的余数。使用模数来将高度除以所需的等高线间距。结果如下所示。可以看到高度已被分成带。每个范围内的高度值从0开始,增加到该范围的高度。
添加模数节点,与其双击添加节点然后连接它,不如一步将新的连接拖到空白处以创建已连接的节点。拖动Separate 3节点的y到空白处,输入"modulo"并单击以插入Modulo节点。这样就实现一步创建和连接了。
模数有两个输入。第一个是被除数,第二个是除数。可以方便地在检查器中设置输入的常量值,而不是连接节点。在检查器中,将第二个参数更改为0.1。这是除数,设置了高度范围的宽度。
创建ifgreater节点
最后就是使用一个ifgreater节点来确定重复值在地形的狭窄高度带上的位置。
ifgreater节点将根据比较的结果返回表示屏幕上看到的两种带颜色之一的值。当高度大于着色器等高线宽度时,选择背景颜色。当高度在所需线宽内时,选择等高线颜色。
ifgreater比较其两个输入,并在其第一个输入大于第二个输入时返回一个值,在第一个输入小于第二个输入时返回另一个值。
这个ifgreater节点被设置为输出浮点值,但想要在两种颜色之间进行选择,一种是地形颜色,一种是等高线颜色。在检查器中,在Type下,将此节点更改为输出color3f。
接下来,选择我们的两种颜色。在检查器中,点击True Result旁边的颜色选择器,并设置地形颜色为白色。将False Result,也就是等高线颜色,设置为黑色。与白色地形产生很强烈的对比。因为0.002是不错的线款长度,所以将比较直Value2设置成0.002。
然后将ifgreater节点的输出,连接到Surface的Diffuse Color的输入。
经过上面步骤,使得材料在地形的每一点上都设置了颜色,便成功制作了等高线材料。
如何使用节点图功能
节点图可以帮助简化复杂的材料,并允许创建自己的节点以重用图的部分。可以使用节点图来使材料看起来像真正的等地形地图外观。
目前的材料样子如下图所示:
在Reality Composer Pro中添加一个材料的第二组线条。
拖动选择计算线的颜色和绘制位置的这四个节点(Position节点、Separate 3节点、Modulo节点和ifgreater节点)。在选择它们之后,右键单击并选择"Compose Node Graph"。现在,这些节点显示为一个单一的节点,可以在其他图形中使用。给新节点分配一个描述性名称"Lines"。
创建此节点图的副本以绘制我们的第二组线
点击层次结构中的Lines,右键点击选择"Create Instance"。创建一个"SecondaryLines"的新实例。实例是活动副本,它们采用对原始节点图所做的任何更改。
为了实现节点图及其实例绘制具有不同间距和颜色的线条,于是在原始节点图中添加两个输入,分别称为Spacing和Color,以控制这些属性。通过双击它来编辑原始节点图。可以在检查器中向节点图添加输入和输出。
首先,添加一个名为Spacing的输入,并将其类型设置为Float。再添加一个名为Color的输入,以控制等高线颜色。将输入的类型设置为Color3。
将它们连接到下图中的正确位置。于是节点图现在具有创建的两个输入,而实例继承了这两个新的输入。
为实例节点图选择一个较小的间距和一个较浅的颜色。
最后一步是合并原始和实例节点图的输出,使用乘法节点来合并它们的颜色。
通过上面操作,完成了一个令人信服的等高线材料,包含两组线条。
几何修改器
几何修改器是自定义材料的一个功能,可以使用它来实时修改模型。下面要做的是替换静态地形模型,并使用几何修改器和高度数据重新创建它。然后,扩展几何修改器,以在两个不同的地形之间动态切换:加利福尼亚州的优胜美地和Yosemite。完成后,我们将拥有一个动态地形材料,可以在两个不同的位置之间进行动画切换。
目前所看到的着色器都是表面着色器,这些着色器在渲染时为模型的每个像素设置基于物理或PBR的属性。几何修改器与表面着色器类似,但是对对象的几何形状进行操作。
构建几个修改器
首先使用Deactivate命令隐藏预建的Yosemite模型。然后导入FlatTerrain.usdz,拖动到项目层次结构中的Root实体中。
点击"Materials"下的Custom,创建一个名为DynamicTerrainMaterial的新材料,并将其分配给了FlatTerrain。
拖动Outputs节点的"Custom Geometry Modifier"到空白UI处,创建GeometryModifier节点。
拖动Surface节点的Diffuse Color到空白UI处,创建Image节点。进入Image节点的选择器,Inputs > Filename > choose,选择DioramaYosemite_bc.png。
会发现场景中,出现了变化,已经成功将该地图应用到了表面上。
由于地形是平坦的,所以看起来有点奇怪。于是需要获取山谷的高度数据。它位于一个图像文件中,其中包含高度值而不是颜色数据。由于这些数据在图像中,所以我们将通过添加另一个图像节点来读取它。
双击Shader Graph空白处,创建一个Image节点。将包含高度数据的DioramaYosemite_refit_h.exr图像分配给这个新图像Image-1节点的"Filename"输入。
几何修改器可以将模型的顶点沿任何方向移动,但因为只需要垂直移动,因此插入一个Combine 3节点,以创建一个仅设置Y分量的3D矢量。连接Image-1节点的OutOut到Combine 3节点。连接Combine 3节点到Geometry Modifier表面的Model Position Offset输入,完成后,平坦模型已经变成了Yosemite。
创建另一个图像节点来读取法线
当移动顶点时,需要将模型的表面法线向量设置为匹配新地形形状。下面使用包含此几何图形的法线的图像来计算这些法线。
首先创建另一个Image节点来读取法线。如下图的Image_2。
接着给Image_2设置Filename,选择DioramaYosemite_n.png。
由于这些法线是预先计算的,所以将它们直接连接到表面着色器的法线输入以获得更好的精度。于是创建一个remap节点来重新映射Image_2的值,即连接Remp到Image_2的输出。然后设置Remap的Type,并将表面期望法线的值设置在-1和1之间。
最后将Remap连接到Surface的Normal。完成了使用高度数据从平坦的几何图形创建了地形的流程。
让场景具有动态性,且有从一个地形切换到另一个地形的能力
首先将节点进行重新命名,Image>YosemiteColors、Image_1>YosemiteHeights、Image_2>YosemiteNormals。分别复制这三个节点,命名成:CatalinaColors、CatalinaNormals和CatalinaHeights。并分别替换Filename,如下图。
接下来创建三个Mix节点,分别连接Colors、Normals和Heights,以混合控制Catalina和Yosemite这两组数据。
最后创建一个Constant节点,连接到三个Mix节点。于是便完成了通过控制Constant的value值0~1,就控制了Catalina和Yosemite这两组数据。当value=1时,显示Catalina地形,当value=0时,场景显示Yosemite地形。点击Constant,使用Promote命令将进度值转换为材料的输入。这样就可以通过修改DynamicTerrainMaterial的Constant值控制地形了。
总结
本文简要介绍了visionOS中的材料是什么,学习了如何使用节点图来组织图并创建自己的可重用节点,使用Reality Composer Pro的Shader Graph编辑器设计了一个动态材料。最后,添加几何修改器来动态地重新塑造对象。