之前的笔记有记录到如何计算漫反射光照,产生的结果就是通常物体在受到光照的作用后体现出来的三大面五大调。这里记录的渐变效果主要是用一张渐变纹理来影响物体的漫反射光照,从而根据渐变纹理的不同使物体看起来有不同的渐变效果。
打开Unity程序,新建一个Sphere, 一个Standard Surface Shader, 一个材质,将新建的Shader赋给材质,材质赋给小球,双击Shader清空里面的代码写上ShaderLab标准结构,如下图: 之后填写Properties代码块,如下图: 接下来填写SubShader代码块,在CG语言中重新申明属性,定义顶点函数片元函数,输入输出结构体。如下图: 写出顶点函数和片元函数,如下图: 完整的代码如下: 编辑完代码后可以在Inspecator 面板上看到相应的属性: 在导入渐变纹理的时候要在纹理面板上勾选Clamp ,因为计算浮点精度的关系,当我们使用fixed2(halfLambert,halfLambert)对渐变纹理进行采样时,虽然理论上halfLambert的值在[0,1]之间,但可能会有1.00001这样的值出现,如果选择的是Repeat模式,此时会舍弃整数部分保留小数得到0.00001,渐变纹理从左至右是0-1,刚好对应最左边的值,因此就会出现高光区域反而会有黑点的情况。因此需要把渐变纹理的Wrap Mode设为Clamp模式就可以解决这种问题。
在Shader的代码中物体纹理的uv都使用了halfLambert,相当于我们用halfLambert来构建了一个纹理坐标,渐变纹理虽然也有对应的uv,但因为一般渐变纹理是朝向一个方向渐变的,u方向值不同,v方向值相同,因此可以看成是一个一维纹理,之后用半兰伯特构建的纹理坐标对渐变纹理进行采样,最后和材质颜色相乘,就得到了最终渐变的漫反射颜色。 下面是不同渐变纹理对应的不同效果:
遮罩效果,不只是用来遮挡某些区域,类似于PS中的图层蒙版,有时候也用来混合多张纹理。这里主要实践一下用遮罩纹理控制物体表面的光照,通俗的讲,一般情况下光照射到物体上会有一片白色高光的区域,这时如果使用遮罩纹理则能更加细致的控制物体表面的光照效果,使得在高光或者光亮部分有些地方亮,有些地方不亮,而不都是一片白。 打开Unity程序,新建一个Sphere, 一个Standard Surface Shader, 一个材质,将新建的Shader赋给材质,材质赋给小球,双击Shader清空里面的代码写上ShaderLab标准结构,如下图: 之后填写Properties代码块,如下图: 接下来填写SubShader代码块,在CG语言中重新申明属性,定义顶点函数片元函数,输入输出结构体。在这里我们为主纹理_MainTex、法线纹理_BumpMap、遮罩纹理_SpecularMask定义了它们共同使用的纹理属性变量_MainTex_ST,这说明在材质面板中修改主纹理的平铺系数(Tiling )和偏移系数(Offset)会同时影响3个纹理的采样。使用这种方式可以让我们节省需要存储的纹理坐标数目,如果我们为每个纹理都使用一个单独的属性变量TextureName_ST, 那随着纹理的增加,会占满顶点着色器使用的插值寄存器。大多数时候我们不需要对纹理进行平铺和位移操作,或者很多纹理可以使用同一种平铺和位移操作,此时我们就可以对这些纹理使用同一个变换后的纹理坐标进行采样。如下图: 写出顶点函数和片元函数,如下图: 完整的代码如下: 属性面板如下: 对比效果如下: