前言:
一般来讲,光照的使用有助于增强场景的真实感,也有助于描述实体的形状和立体感。在Direct3D中,Direct3D会将顶点送入光照计算引擎,依据光源类型,材质,以及物体表面想对与光源的朝向,计算出每个顶点的颜色值。这样,我们就无需自行指定顶点的颜色值。
1.光照的组成:
光照分为三种:
1.环境光:这种类型的光经过其他表面反射到达物体的表面,并且照亮整个场景。
2.漫射光:这种类型光沿着特定的方向传播。当它到达某一表面的时候,将沿着各个方向均匀反射。
3.镜面光:这种类型的光沿着特定的方向传播。当此类的光到达一个表面时,将严格沿着另一个方向传播,从而形成只能在一定角度范围内才能观察到的高亮度照射。
光照的存储:
光照的存储可以使用D3DCOLOR和D3DCOLORVALUE结构来表示(但是一般都采用D3DCOLOR结构使用,而且,描述光照的颜色时,D3DXCOLOR结构中的Alpha值都会被忽略。)
如:红色:
D3DXCOLOR red(1.0f, 0.0f,0.0f,1.0f);
2.材质:
材质在光照中的用处:
我们所观察到的物体的颜色是由该物体所反射的光的颜色决定的,例如:
一个红色的球体反射了全部的红色入射光,并吸收了所有的非红色入射光,所以该物体呈现红色。
或者说:如果一个只能发出蓝色光的光源在照射一个红色物体时,则由于蓝色光被吸收,而反射的红色光为零,所以该物体无法被照亮。当一个物体吸收了所有的入射光时,那么久会呈现黑色,如果y一个物体能够完全的反射红色,蓝色,绿色光,那么久会呈现白色。
我们利用D3DMATERIAL9来存储材质数据:
typedef struct _D3DMATERIAL8 {
D3DCOLORVALUE Diffuse; //材质对漫射光的反射率
D3DCOLORVALUE Ambient;//材质对环境光的反射率
D3DCOLORVALUE Specular;//材质对镜面光的反射率
D3DCOLORVALUE Emissive;用于增强物体的亮度,使其看起来好像自发光
float Power;//指定镜面高光的锐度,越大则高光点的锐度越大
} D3DMATERIAL8;
如何使用呢?
如我们想让一个球体只反射红色光:
D3DMATERIAL9 red;
ZeroMemory(&red, sizeof(red));
red.Diffuse = D3DXCOLOR(1.0f, 0.0f, 0.0f, 1.0f);//红色
red.Ambient = D3DXCOLOR(1.0f, 0.0f, 0.0f, 1.0f);//红色
red.Specular = D3DXCOLOR(1.0f, 0.0f, 0.0f, 1.0f);//红色
red.Emissive = D3DXCOLOR(0.0f, 0.0f, 0.0f, 1.0f);//没有高亮
red.Power = 5.0f;
3.顶点法线:
在使用光照所绘制的3D场景中,计算物体顶点的颜色值除了需要光源和物体的材质信息外,还需要知道每个顶点的法向量,以便于根据光线的入射方向与法向量的夹角计算发射光线的最终颜色值。
在这里提出了顶点法线和面法线这两个概念,我们首先需要清楚的理解并区分这两个概念。
面法线很容易理解,即垂直于三角形面的一条法线。那顶点法线又从何而来呢,严格的从法线的定义上来说,其实顶点是不存在法线的,那为何又有顶点法线这个概念的呢?让顶点也拥有法线,是为了在光照计算时,能够知晓光线到达表面时的入射角,以在多面体的表面获得一种平滑的效果。
面法线: