4-2 纹理采样
在上一章中,我们导入了一张RGB噪点图,并完成了噪点图的相关导入设置,在本章中,我们将创建一些基础的方法,来获取噪点图的实例。
首先我们要在HexMetrics.cs
中添加一个静态方法,用来读取彩色噪点图中的各类信息,并进行相关操作。因为创建的方法是静态方法,所以其引用的噪点图变量也必须是静态的。这样,我们就可以在程序的任意位置调用这个方法了。
1 | public static class HexMetrics |
由于HexMetrics.cs
并未继承MonoBehaviour,所以它不是一个组件,其中的变量也不能在Inspector面板中显示。我们也不能像普通变量那样,直接使用拖拽实例放入变量在Inspector面板的位置上进行赋初始值。那我们就简单地把HexGrid当一个中转,因为HexGrid是第一个运行的,所以在它的Awake方法开始的位置传递值就行了。代码如下:
1 | public class HexGrid : MonoBehaviour |
在Play模式下,如果我们想要引用另一个彩色噪点图,那么在Awake
的赋值语句就不起作用了。要解决这个问题还需要在OnEnable
方法中重新赋值彩色噪点图的实例。
1 | public class HexGrid : MonoBehaviour |
现在HexMetrics.cs
就能访问彩色纹理贴图了,我们添加一个方便的噪声采样方法,这个方法用来读取彩色噪点图,并返回一个包含四种噪声模式的4D向量。代码如下
1 | public static class HexMetrics |
接下来,我们完成来SampleNoise
方法。通过双线性过滤的方式对彩色纹理图进行采样得到样本数据,由于是使用世界坐标系下的X和Z轴坐标作为UV坐标,所以噪声源是3D的,这里我们忽略掉Y轴坐标。采样后我们得到一个可以转换成4D向量的颜色,这个转换是隐式的,这意味着我们可以直接返回颜色,而不用显式的转换成Vector4。代码如下:
1 | public static class HexMetrics |
至此。我们通过世界坐标内的一个点,就能获取到彩色噪点图中对应位置的RGBA值,这样我们就完成了采样的工作。在接下来的章节中,我们将利用采样得到的数据,对地图上的顶点进行偏移,也就是扰动。就会让地图产生更多的变化。
双线性过滤
Jasper Flick大神有专门介绍UV的教程:Rendering 2 Shader Fundamentals,里面详细介绍了UV坐标和纹理的相关知识。