一.程序化噪波
柏林噪波是一种能生成很好的随机图案的算法,它是一个无限的、不重复的图案,可以采用这种基础图案并以多种方式对其进行修改,
将它缩放并进行多次组合,就可以创建一个分形图案。这些组合的缩放等级称为一个Octave
这是产生柏林噪波基础图案的核心公式(优化版本)
当这段代码被编译时,会产生下面的消耗,并且这只是核心图案,你通常把这个东西循环三到四次 甚至多达八次,所以你可以使用多达488个指令和64个纹理采样,所以这是非常耗能的
有一个解决办法是在3D空间中渲染一系列的噪波切片,并创建一个体积纹理,这将61个指令和8个纹理采样分解为1个纹理采样
这种技术耗能很低,但也有一些缺点,我们必须让它在三个维度都进行平铺,所以它也不再是一个无限不重复的图案了
在虚幻引擎的噪波节点里面附带有函数“快速渐变-3D纹理,选择这个就是在采样柏林噪波体积纹理
这个节点需要绝对世界位置作为 生成噪波的种子,图案非常小可以乘上一个小数值放大图案
接着我们设置Function为3D纹理,它们在3D空间中对噪波切片进行采样,并将这些切片组合成一个体积纹理,并不是做大量的计算,下面的等级越大,就越消耗性能,默认六级,所以它仍然在做6个纹理采样和96个指令,每个等级1个纹理采样和16个指令,然后还可以设置最小和最大的输出值
function的Voronoi(沃罗诺伊)创造了这种类似细胞的结构,某些情况很有用
程序化噪波可以是体积的(或者说可以是三维的),当球体在场景中移动时,它就是在噪波的体积当中移动,因此噪波是存在于世界空间中的,当我的模型表面与它相交时,在世界空间中特定位置的噪波图案是什么样子的,就会跟着应用到模型的表面上,所以移动模型时就得到了不同的图案
二.覆雪树干着色器
我们的目标是创造一个白雪皑皑的森林,如果你想让森林中的每一棵树都不一样,需要单独打开每棵树并设置独特的纹理,这显然不太现实,但是程序化噪波可以为每一棵树生成不同的外观。
首先将绝对世界位置连接噪波节点,图案并没有发生变化,因为这是默认使用的内容,所以要乘上一个值得到合适的大小。然后将噪声的level设置为3,并且不需要湍流,并且设置乘3D纹理,然后限制到0-1之间,用power提高对比度。
然后就可以根据噪波纹理进行插值,设置一个雪的颜色,比白色深一点,因为PBR的颜色值不会一直上升到白色,然后在这再加一点淡淡的蓝色,这只是因为雪会反射天空
然后修改一下世界位置的缩放和树皮的平铺
但是我想确保树干的底部总是有雪,我可以乘以世界空间位置的Z分量,如果我想让融化的雪在树干的某一面出现,我可以用雪的蒙版乘以法线的Y分量。
如果放置一棵树在场景中,雪的位置就会根据世界位置改变,所以每一棵树都会有不同的雪的图案。
三.岩层着色器
需要用这个纹理来模拟岩层。
我想让这些岩石在任意方向旋转的同时,仍然能投射出地质岩层并且保持它的一致性。所以我需要使用绝对世界坐标来采样纹理。
接下来加入噪波,将噪波乘上一个常量以后与z值相加。现在就好像不同岩层的岩石互相混合了
但我认为混合的比例仍然是不合适的,还要修改一下噪波的大小,所以将绝对世界位置乘上一个常量以后连接到噪波
ok,现在可以把这个纹理与采样的岩石纹理进行混合,无论怎么旋转,都会有一种统一感。并且可以无限叠加创造不同的岩石资产