7.8 指定材质

我们如何指定材质的值?表面上的材质有可能会发生变化;也就是说,表面上不同的点可能会有不同的材质值(见图7.16)。例如,一个轿车模型的车身、窗户、灯和轮胎反射和吸收光线的能力是不一样的,所以轿车表面的材质值也应该不一样。

图7.16
图7.16 将轿车网格分为5个材质属性组。

要模拟材质值的不同,一种方法是在顶点级别上定义材质值。这些材质值会在三角形表面进行线性插值,使三角形网格的每个表面点都拥有材质值。但是,从第6章中的“山峰与河谷演示程序”中可以看到,在顶点级别定义材质颜色模拟出的效果还是太粗糙。而且,顶点颜色还会在顶点结构中添加额外的数据,我们还需要给每个顶点上色的工具。更普遍的方法是使用纹理映射,将会在下一章中介绍。还有,在频繁调用绘制的过程中我们还要修改材质。因此,我们将材质值设置为常量缓冲的一个成员,除非在两次绘制之间改变了这个材质值,所有在设置之后绘制的几何体都会使用这个材质。下面的伪代码展示了如何绘制一辆轿车:

Set Primary  Lights material to constant buffer
Draw Primary  Lights geometry
Set Secondary Lights material to constant buffer
Draw Secondary Lights geometry
Set Tire material to constant buffer
Draw Tire geometry
Set Window material to constant buffer
Draw Windows geometry
Set Car Body material to constant buffer
Draw car body geometry

我们的材质结构体定义如下,位于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)的实现方法。

文件下载(已下载 539 次)

发布时间:2014/8/6 14:26:35  阅读次数:3439

2006 - 2024,推荐分辨率1024*768以上,推荐浏览器Chrome、Edge等现代浏览器,截止2021年12月5日的访问次数:1872万9823 站长邮箱

沪ICP备18037240号-1

沪公网安备 31011002002865号