向着色器添加纹理
向着色器添加纹理 通过纹理,可以很容易让着色器变得生动起来,获得非常真实的效果。为了更有效的使用纹理,我们需要了解一张2D图片是如何映射到3D模型中去的。 这个映射的过程称之为 纹理贴图texture mapping ,为了完成映射,我们在使用的模型和着色器上还有额外的工作。模型实际上是由很多的三角形拼接而成的;而三角形的每个顶点都保存有着色器可以访问的各种数据。 其中很重要的一个信息就是 UV信息 (UV data) 。 它包含两个坐标,U 和 V ,其取值范围是0到1。这两者表示2D图片的像素点坐标的 XY 位置信息,而这些信息将会映射到顶点中去。 UV数据只为顶点表示[意思可能也等价于:UV数据只存在顶点中]; 当三角内的点需要被纹理贴图时,GPU会插值最接近的UV值,从而从相应的纹理中找到正确的像素点。下面的图片展示了一张2D纹理贴图到3D模型中的三角形中的情况: UV数据保存在3D模型中并且需要3D模型工具去编辑它们。有些模型缺少UV组件,因而它们不支持纹理贴图。比如3D模型软件中的默认的那个兔子模型,就没有提供这么一个组件。 始前准备 学习这个知识点的时候,你需要一个有UV数据和纹理的3D模型。然后把它们都导入到Unity中。也可以直接拖拽到Unity编辑器中,会自动导入。因为标准着色器支持默认的纹理贴图。我们会用到这一点,而后会详细的介绍它是如何工作的。 操作步骤 用标准着色器给你的模型添加一张纹理异常的简单,按照下面步骤: 创建一个叫 TexturedShader 标准着色器。 创建一个名为 TexturedMaterial 的材质球。 通过拖拽的方式,把着色器赋值给材质,把着色器拖到材质上即可。 选择刚才的材质,然后拖拽模型对应的纹理到一个叫 Albedo(RGB) 的矩形区域中的空白部分。如果你正确的执行了上述步骤,你的材质 检查器面板(Inspector) 会如下图所示: 标准着色器知道如何通过UV信息把2D图像映射到3D模型中 原理介绍 当通过材质的检查器面板使用标准材质的时候,纹理贴图背后的处理过程对于开发者来说是透明的。如果我们想了解它是如何工作的,那我们需要更加详细的了解我们刚才创建的 TexturedShader 着色器。在着色器的 属性Properties 部分,我们可以看到 Albedo (RGB) 的纹理跟代码的关联如下代码所示: MainTex: _MainTex ("Albedo (RGB)", 2D) = "white" {} 在我们着色器代码中的 CGPROGRAM 代码块部分,纹理被定义为 sampler2D 类型,这是一种标准的2D纹理类型: ...