在Cycles中如何基于坡度和海拔设计山体材质

如果你曾经使用过一些地表制作工具,例如 Terragen,那你一定会记得其中有一些功能和参数,专门用于计算雪地厚度、贫瘠石头和草坪的数量。雪在一定温度之下会逐渐堆砌成为拥有一定厚度的地表效果,同时随着海拔的降低,雪地效果会以非阶梯的方式消失。同样的,草地也是这样,不过只会出现在一定低海拔的温暖地区。

那么如何在 Blender 中制作这样的效果呢,本文将做一个简单的技术分享。

你可以尝试使用 ANT Landscape 插件来制作山体效果,不过这里我先提供一个基础的源文件供参考,帮你省掉这一步。

让斜坡自己选择材质

我们从最基础的开始,只使用几个结点,首先选择地表模型,然后为其新建一个材质,命名为 Terrain 。然后添加一个默认的 Diffuse BSDF 材质,接着单击 Shift + D 复制一个出来,修改一下它的颜色,稍微深一点例如深蓝色。再单击 Shift + A 添加一个 Mix 混合结点,将两者连起来,并输出至一个材质结点 Surface 接口。

我们现在要做的是,让系统可以根据地表的形状来分配两种色彩的混合比,为了得到模型的地表数据,我们单击 Shift + A 新建一个输入结点,类型为 Geometry 。接着我们观察一下模型,其实从数学上来理解,每一个面的法线 n^ 都可以表示为一条垂直于当前面的箭头,如图1所示,所以我们需要考虑的坡度问题,就可以等价于根据法线和地面 z^ 的角度差,如图2所示。

图 1:法线方向

那么根据简单的数学原理,我们可以得到

n^⋅z^=cosθ

其中 θ 就是我们需要的角度值,反解回来就是

θ=arccos(n^⋅z^)

所以,我们需要添加一个转换结点,新建添加一个 Vector 结点,将默认值从 Add 修改 Dot Product,接着我们需要输入法线值 n^。将网格的 True Normal 参数联接至 Vector 的输入,我们稍后再来解释 Normal 和 True Normal 的区别。接着在 Vector 的输入端,点击下拉菜单然后输入(0,0,1),这也就是法线单元向量的固定参数值。接着添加一个 Converter 中的 Math 结点,将选项修改为 Arccosine,将 Dot Product 的输出联接至此结点的 Value 输入。

图2:网格矢量和地面的夹角角度

这样我们就能解算出角度 θ 的值,那么接下来就需要以此角度为控制参数,来让系统自动调整材质的选择。首先添加一个 Math 结点,然后修改参数为 Greater Than,将 Arccosine 的输出连接至此结点的第一个 Value 接口,然后将其输出连接至 Mix 混合结点的 Fac 输入接口。那么接下来需要为这个角度设置一个选择阀值,我们添加另外一个 Multiply 叠加结点,将其输出值连接至 Greater Than 结点的第二个 Value 上,然后在第二个参数处输入 pi/180,将值转换为角度。那么此时第一个参数就是由我们来定义临界结点的角度值了,输入一个45测试一下,然后修改视图为 Rendered 查看实时效果,可以得到如图3所示的山脉效果了,所有法线角度与地面角度超过45度的部分都会显示为蓝色,低于此度数的表面显示为白色。

在Cycles中如何基于坡度和海拔设计山体材质

图3:完整的结点图

图4:测试渲染效果

现在我们实现了材质的分配,接下来要做的就是讲雪和山脉的材质分别添加进去,让山脉看上去更像是一座雪山。删除两个 Diffuse BSDF 结点,然后从组菜单中添加一个雪的材质,复制一个并修改为石头的材质,然后分别连接至混合结点的输入端。接下来添加一个 Texture Coordinate 结点,并将其 Generated 输出连接至石头结点的 Vector 输入接口。

现在山体看上去也许还不怎么像一座山,而且看上去很扁平,这是因为我们没有添加任何法线计算,所以表面会看上去十分光滑。石头的材质提供了一个法线的输出,但是如果你直接将其连接到材质的 Displacement 上的话(你其实可以试一试!),整个山体都会受到影响,包括雪地的那一部分。所以我们还是需要借助 Greater Than 结点的计算结果,来控制法线的影响部分,图5即为最终的完整结点图,而图6就是测试的渲染结果。

那么这里如果你选择的是 Normal,结果可能就会不一样了,因为 Normal 包含了法线和平滑两种计算,在这里我们需要更精确地计算法线,就一定得选择 True Normal,否则就会形成一个怪圈逻辑:True Normal 用于决定法线,但是法线又包含在 True Normal 的计算之内。我不清楚 Blender 是如何考虑这两者的使用区别,但是我能知道的是,选错了不会死机或崩溃,只是效果会稍微差一点而已。

在Cycles中如何基于坡度和海拔设计山体材质

图5:加入材质的结点图

图6:渲染后的雪山效果

平滑雪山的边界线

雪地和岩石之间的界限现在看上去很清晰,过渡十分生硬,这是因为 Greater Than 参数只会输出两个值,0(有雪)和1(没雪)。那么最简单的方式是使用 ColorRamp 结点,来将两者从垂直的过渡变得缓慢一些。但是 Color Ramp 的设置稍微复杂了点,我希望得到一种可以快速反复使用的结点组,利用一些数学结点来提供参数控制,并利用其它结点的输出作为变量来协助控制效果。

在Cycles中如何基于坡度和海拔设计山体材质

图7:使用 Color Ramp 的结点设计

我们需要一种平滑的过渡方式,在底部和顶部的过渡位置可以渐变更缓慢一些,所以我设计了这样一个函数

f(x)=11+es(m−x)

将函数绘制出来就是图8的效果,那么接下来就需要将其转换为 Blender 中的公式计算。首先我们添加一个 Subtract 结点来计算括号内的部分(思路按照我们做标准数学计算顺序进行一样),然后添加一个 Multiply 结点实现乘法,接着添加一个 Power 结点来实现 e 的赋值,最后再添加一个 Add 结点 和 Divide 结点完成剩下的计算,结点如图9所示。

在Cycles中如何基于坡度和海拔设计山体材质

图8:数学逻辑设计

在Cycles中如何基于坡度和海拔设计山体材质

图9:结点设计

现在选择全部的结点,然后单击 Ctrl + G 做群组,组结点会自动将其中的 X 和 S 作为基础输入显示在组结点的左侧,类似的,输出结点也会显示在组结点的右侧,你可以单击并为这些接口命名或赋默认值,也可以设置最小值和最大值。我倾向为所有的变量,例如 X 赋予值为0(保留最值的默认设置),对于常量例如 M 则命名为 Midpoint 中间值,这里设置为0.5,最小值设为0,最大值设为1,。对于一些缩放属性的常量,一般设置为50,最小值为1,最大值为100。输出值命名为 Y ,其他可以不用管了。结点图最后应该如图9所示,单击 Shift + Tab 退出组管理,然后选中它并在右侧属性中对整个组做重命名为 Logistic Function。

在其他 Blender 工程中,我们可以使用 File 菜单下的 Link 或 Append 选项来导入这些组,现在我们需要用其替代掉 Greater Than 结点,其中 Arccosine 的输出应该连接至 X 输入,Multiply 的输出应该连接至 Midpoint 接口,输出的 Y 接口连接至 Greater Than 、 Mix 混合结点和 Multiply 结点的输入端,这样处理之后,雪地和岩石之间的过渡就不会那么明显了。

利用海拔作为参数

接下来我们需要限制雪地仅出现在一定海拔以上,原理类似,我们需要使用到 Geometry 结点的 Position 参数,找到用于判断海拔的 Z 参数提取方法即可。首先新建一个 Dot Product 结点,将网格结点的 ThePosition 输出接入至其输入端,然后创建一个 Logistic 组结点,将 Dot Product 的 Value 输出连接至其 X 的输入,将其输出连接至 Mix 结点。现在,我们会发现得到的效果是相反的,只有底部的山体材质显示为雪地,那么我们需要做一次数值翻转,插入一个 Subtract 数学结点,将第1个数值设置为1,然后分别将其输出连接至 Mix 混合结点和 Multiply 用于表面置换效果。

顶部的山体现在就被雪完全覆盖了,不过我们还是希望可以将两种效果做一次结合,如果我们用1来表示雪地,0来表示岩石地表,那么这种结合其实就是简单的数值叠加。删除掉刚才添加的 Subtract 结点,然后添加一个新的用于翻转之前 Logistic 结点的输出,使用一个新的 Multiply 结点和混合两种材质,添加一个 Subtract 结点来翻转输出,最后添加一个 Mix 结点来提供置换效果,结点图应该如图10所示。

在Cycles中如何基于坡度和海拔设计山体材质

图10:完成的结点图

再做点优化

这个时候我们观察雪地效果会发现,雪的尺寸稍微偏大,这样在比例上就会显得不是很真实,这当然是和我们的网格面数量有关,不过我们可以通过一些取巧的办法,来增加雪地的真实感。图11就是一个经过调整的结点图,其中红色部分是新加的。这里添加了一个 Noise Texture 噪音贴图结点来模拟山体上的小比例外形,因为它仅提供一个0和1的输出,所以我们需要增加它的数值范围,因此添加了一个 Subtract 为0.5的结点将范围调整为-0.5到0.5,然后再添加一个 Multiply 为2.5的结点扩大数值范围,并将此增益结点连接至之前的结点图上,图12就是最终的渲染效果。

在Cycles中如何基于坡度和海拔设计山体材质

图11:额外的增益结点用于调整雪地的比例

当然我们得承认这个效果并不是特别真实,但是我希望这里可以分享得是使用结点上的一些思路,如何借助一些数学上的原理来设计结点图,所以有时能回忆一下数学还是很有必要的,希望本文有所帮助。 :)

图12:最终效果图

原文地址