3.2 创建反射材质
金属、车漆,以及光滑的塑料表面都是一些很常见的需要反射的材质的例子。幸运的是,Unity内置了反射着色器(reflective shader),配置好以后就可以帮我们实现想要的效果了。
3.2.1 准备工作
本节需要准备两个纹理贴图:Base Map(底图)和Reflection Cubemap(反射立方图)。底图得是一张RGBA的图片,alpha通道可以把反射级别指定成从完全不透明(黑色)到完全反射(白色)。反射立方体贴图可能是由六块纹理组成,或者像本节教程这样,只有一个单独的纹理。
为了让读者把精力放在本节的主题:创建一个反射材质,0423_03_01文件夹中准备了一个包,包括一个之前创建的场景,以及一个可以作为反射贴图的.jpg文件。
3.2.2 操作步骤
请按照下面的步骤创建反射材质:
1)把reflectiveMaterial包导入到Unity中。
2)打开reflectiveMaterialLevel 场景,播放时有一个3D物体(一个电池)绕着自己的中轴自转。我们也可以让摄像机绕着电池。
3)停止播放场景,在Hierarchy视图中选中电池,Inspector视图中会显示其材质,使用下拉菜单设置着色器:把值从Diffuse(漫反射)改成 Reflective | Specular(反射|镜面反射)。
5)在Project视图中选择reflectionMap资源,它已经从2D纹理变成了立方图(图标也变了)。
6)选择battery材质并把reflectionMap资源应用到Reflection Cubemap的选项中:
11)保存文件,让Unity重新加载此图片,反射效果在文字标签区域应该更加谨慎。
3.2.3 实现原理
基础纹理的alpha通道设置了反射度,本例中,材质的镜面反射的级别是根据每个像素的亮度而定的。意思是说alpha通道是白色的时候反射立方图(Reflection Cubemap)的可见度更高。
反射立方图(Reflection Cubemap)实际上是由6张不同的图片组成的,这些图片是通过在纹理导入器(Texture Importer)把Texture Type(纹理类型)设置成Reflection(反射)后,由原始的图片文件生成的。这6张图片被映射到立方体的6个面上。
3.2.4 更多内容
反射立方图(Reflection Cubemap)可以用很多种方式生成,并且有很多种不同的映射属性。
- 使用6个不同的纹理贴图
不用1张单独的纹理贴图。也可以在Project视图中创建一个空的反射立方图(Reflection Cubemap)并指定6张不同的图片文件绘制到6个表面上。 - 用Mapping(映射)和Shader(着色器)选项练习
对于电池模型,使用圆柱体映射是最好的选择。对于不同的形状可以试试其他选项。除了Base 贴图和 Reflection纹理贴图,还可以练习使用其他的Shader设置,比如Main Color、Specular Color、Reflection Color(可以用于给材质着色),以及Shininess(反光度,用于控制镜面发散)。 - 反射当前的场景图形
如果使用的是Unity专业版,可以从当前的场景图形中创建反射贴图。其实还可以实时反射场景或者把一个单独的帧烘焙成反射立方图(Reflection Cubemap)。Unity的文档中包含所有相关的介绍和脚本代码:http://unity3d.com/support/documentation/ScriptReference/Camera.RenderToCubemap.html。