法线贴图

思考并回答以下问题:

  • 法线贴图是干嘛用的?怎么使用的?
  • 如何使用代码动态更换贴图?使用哪个组件?如何使用?

法线贴图(Normal mapping)在三维计算机图形学中,是凹凸贴图(Bump mapping)技术的一种应用,有时也称为“Dot3(仿立体)凹凸纹理贴图”。与纹理贴图通常是在现有的模型法线上添加扰动不同,法线贴图要完全更新法线。

与凹凸贴图类似的是,法线贴图也是用来在不增加多边形的情况下于浓淡效果中添加细节。但是凹凸贴图通常根据一个单独的灰度图像通道进行计算,而法线贴图的数据源图像通常是从更加细致版本的物体(精模)得到的多通道图像,即红、绿、蓝通道都是被作为一个单独的数据通道对待。

在Unity中使用法线贴图

法线贴图的使用在如今的游戏开发中越来越频繁,这种又能节省资源又能得到良好的视觉效果的方法得到了越来越多的认可,而Unity也对法线贴图做出了支持。

(1)使用到的模型和图片如下表所示。

资源名 用途
Dinosaur.fbx 恐龙模型
GRANDEB2.jpg 恐龙的法线贴图
GRABDECO.jpg 恐龙的漫反射贴图

(2)导入上述的资源后,开始搭建场景。新建一个场景,然后将Dinosaur.fbx拖到场景中,将其位置摆放到摄像机前方,在Game视口中就可以看到恐龙的模型。

(3)下面对导入的法线图片进行设置。在Project面板中选中GRANDEB2.jpg,在Inspector面板中将其Texture勾选为“Normal map”。下面的Bumpiness滑块控制凹凸的程度,可以根据需要进行设置,设置完毕后单击Apply按钮应用设置。

(4)接下来创建材质。在Project面板中单击鼠标右键选择“Create->Material”创建两个材质,分别命名为“DDiffuse”和“DNormal”。

(5)下面为其指定对应的着色器。 DDiffuse材质的着色器为“Legacy Shaders/Diffuse”,对应的贴图为“GRABDECO.jpg”,DNormal材质的着色器为“Legacy Shaders/Bumped Diffuse”,Base对应贴图“GRABDECO.jpg”,Normalmap对应贴图“GRANDEB2.jpg”。如下图所示。

(6)准备工作做好后,接下来进行脚本的开发。脚本的主要功能是生成两个单选按钮,然后根据用户的选择切换恐龙的材质,显示使用普通漫反射贴图的恐龙或者使用法线贴图的恐龙。

UseNormalMap.cs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
using UnityEngine;
using System.Collections;

public class UseNormalMap : MonoBehaviour
{
int selectindex = 1; // 选中按钮的索引
string[] selectstring = new string[]("法线", "默认" ); // 按钮显示的字样,
public Material normalmap; // 使用法线贴图的材质
public Material diffusemap; // 使用漫反射贴图的材质
publie GameObject model; // 恐龙游戏对象

void OnGUI()
{
int lastchange = selectindex; // 记录上次选择的结果,
selectindex = GUI.SelectionGrid(new Rect(Screen.width.1/ 2- Screen.width 1/6, 0, Screen.width*1/3, Screen.height*1/ 15), selectindex, selectstring, 2);// 创建单选按钮组

if (lastchange != selectindex)
{
//选择结果发生变化
if (selectindex = s)
{
ChangeMaterial (normalmap); // 调用方法使用法线材质
if (selectindex) // 玩家选择显示漫反射图
ChangeMaterial (diffusemap); // 调用方法使用漫反射材质
} // 玩家选择显示法线图
}
}

void ChangeMaterial(Material m) { // 切换模型的材质
model.GetComponent<MeshRenderer>().materials = new Material[2]{m, m};
}
}
  • 第1-8行为命名空间的引用以及变量的声明。在变量声明的地方需要声明一个int类型的数字以记录用户选择的单选按钮的索引,selecstring数组用于控制单选按钮上显示的字样,然后声明3个public的变量,分别是之前创建的两个材质以及恐龙游戏对象。

  • 第9-18行是对OnGUI方法的重写。首先记录下上次选择按钮的索引,然后绘制两个单选按钮,并记录下当前选中的按钮索引。若是和上次选择的索引不一样,就调用ChangeMateral方法按照用户的选择为模型赋上对应的材质。

  • 第19-21行是一个自定义方法,需要传入一个Material类型的参数代表需要切换的材质。首先获取模型的MeshRenderer组件,然后更换其materials参数的材质列表即可。

(7)至此,案例的开发结束。运行效果分别如下图所示。明显可以看出,法线贴图在模型精度很低的情况下依旧可以呈现出很多凹凸的细节,这在当前游戏的开发中非常重要,使用较少面数的低模配合法线图可以搭建出非常真实的场景。需要注意的是,由于法线图改变了顶点的法线,所以产生的凹凸感还可以响应光影效果。

0%