4-1 导入噪点图

  到目前为止,我们可以通过程序化生成一个正六边形有高低差的地图,并且在不同的高低差之间有更多的细节。但是现在的地图仍然是一个很规则精确的蜂窝状网格。在接下来的章节中,我们会使用一张噪点图,为现在的地图增加一些不规则感,让地图看起来更加自然。
  要添加一些不规则的感,就需要一些随机性,但又不是真正的全随机。所以我们需要的是在编辑地图时未选中的位置保持不变,不然每改动一点地图就全变了。所以需要是一种可重现的伪随机,即噪声。
  柏林噪声(Perlin noise)就是一个很好的选择,它在每个点的位置都可以重现。当多种不同频率的柏林噪声叠加时,能产生大范围来看变化很大,小范围内又接近一致的噪声纹理,生成相对平滑的形变,靠近的点更倾向于黏在一起而不是向相反的方向扭曲。

柏林噪声 wiki

柏林噪声 知乎相关文章

  柏林噪声可以程序化生成,也能使用一张预先生成的噪声纹理图。使用噪声纹理图的好处是它比直接计算多频率叠加的噪声更容易,也更快,缺点是纹理图需要占用内存并且噪声的区域大小相对有限。所以噪声纹理图需要平铺显示并且需要覆盖比较大的区域,使得产生的循环不那么频繁和紧密,从而产生伪随机和单调感。
  使用噪点图的原理其实与一张尺寸较小的纹理贴图,贴在一个尺寸较大的物体上一样,如果贴图是循环铺满整个物体表面,那么横向和纵向都会产生很多的重复,视觉效果就会打折扣,而且显得很单调。
  这里准备使用噪声纹理贴图,如下图:

  这张纹理图包含多重频率叠加的平铺柏林噪声,并且是一张灰度图,其平均值接近0.5,极限值是0和1。
  不过这不是我们最终要用的图,这张图的每个像素点上只有一个值,如果我们需要的是3D形变,我们至少得需要三个伪随机采样。所以除此之外还需要两张额外的不同噪声纹理图。
  我们可以就用三张不同的纹理图,或者也可以用RGB通道来存储这些值,我们可以在一张彩色纹理图上,使用RGBA通道来存储四种不同样式的噪声,如下图,要使用它的话,直接在图片上单机鼠标右键保存至本地,然后导入Unity3D即可。

  将这张彩色噪点图导入Unity3D工程中后,我们要对这张图进行一些设置,以便在之后的步骤中顺利使用它。以下是对这张彩色噪点图的设置项:

  1. 首先由于我们要用代码对彩色噪点图进行采样,所以它必须是可读写的。勾选Read/Write Enable。这样就能把纹理贴图的数据存储到内存中并用C#代码进行访问。
  2. 取消勾选sRGB(Color Texture)选项
  3. 图片格式设置成Automatic并且压缩方式设置成null,我们不想因为压缩纹理而破坏噪声图的样式。
  4. Generate Mip Maps也取消勾选,并不需要这个功能。
      设置完成后如下图所示:

如果勾选sRGB会有什么影响?
如果我们在着色器的某些地方使用噪声纹理图,它可能会有些不同。当使用线性渲染模式时,纹理采样数据会自动从伽马空间转换到线性空间。这会对噪声纹理的采样数据产生一个错误的结果,而这是需要避免的。(注:Unity的默认渲染模式是线性模式)

这篇教程所有的代码与设置,均使用Unity 2019.4.X版本,可能在之后的版本中,图中的设置选项位置有所不同。

Github代码