本文共 1068 字,大约阅读时间需要 3 分钟。
表面上的材质有可能会发生变化;也就是说,表面上不同的点可能会有不同的材质值。例如,一个轿车模型的车身、窗户、灯和轮胎反射和吸收光线的能力是不一样的,所以轿车表面的材质值也应该不一样。
(将轿车网格分为5个材质属性组)要模拟材质值的不同,一种方法是在顶点级别上定义材质值。这些材质值会在三角形表面进行线性插值,使三角形网格的每个表面点都拥有材质值。但是,从第6章中的“山峰与河谷演示程序”中可以看到,在顶点级别定义材质颜色模拟出的效果还是太粗糙。而且,顶点颜色还会在顶点结构中添加额外的数据,我们还需要给每个顶点上色的工具。更普遍的方法是使用纹理映射,将会在下一章中介绍。还有,在频繁调用绘制的过程中我们还要修改材质。因此,我们将材质值设置为常量缓冲的一个成员,除非在两次绘制之间改变了这个材质值,所有在设置之后绘制的几何体都会使用这个材质。下面的伪代码展示了如何绘制一辆轿车:
设置主要车灯材质到常量缓存绘制主要车灯几何体设置辅助车灯材质到常量缓存绘制辅助车灯几何体设置轮胎材质到常量缓存绘制轮胎几何体设置窗户材质到常量缓存绘制窗户几何体设置车身材质到常量缓存绘制车身几何体
我们的材质结构体定义如下,位于LightHelper.h中:
struct Material{ Material(){ ZeroMemory(this,sizeof(this));} XMFLOAT4 Ambient; XMFLOAT4 Diffuse ; XMFLOAT4 Specular; // w分量为高光强度 XMFLOAT4 Reflect;} ;
这里不讨论Reflect成员变量,这个变量会在以后模拟镜子时用到。我们在镜面高光指数p放置在材质高光颜色的第4个分量中。这是因为光照不需要alpha分量,所以空出的这个位置可以储存一些有用的东西。漫反射材质的alpha分量在后面的章节中可用于alpha混合。
最后,我们提醒读者,三角形网格表面上的每个点都需要法线向量,以使网格表面上的每个点都可以(根据兰伯特余弦定理)计算入射光的角度。为了在三角形网格表面上估算每个点的法线向量,我们在顶点级别上指定法线。在光栅化阶段中,这些法线会在三角形表面上进行线性插值。
到目前为止,我们已经讨论了光线的组成原理,但是还没有讨论特定的光源类型。在下面的三节中,我们将讲解平行光(parallel light )、点光(point light)和聚光灯(spotlight)的实现方法。