光照(light)是为了加强游戏场景的真实感而存在,也有助于描述实体形状和立体感,算是3D游戏中渲染的基础了。spa
如:.net
在Direct3D的光照模型中,光源发出的光由如下三种类型组成(和现实生活中的相似)。3d
一、环境光(Ambient light):这种光经其余表面反射到达物体表面,并照亮整个场景。如现实生活中的树叶同样,只被环境光必定程度的照亮,而不是直接照射,之因此呈现 出绿色,那是由于它对绿色光产生了反射。code
二、漫射光(Diffuse Light):这种光沿着特定的方向传播。当它到达某一个表面时,将沿着各个方向均匀反射,即不管从什么角度看,该表面的亮度均相同。blog
三、镜面光(Specular Light):这种光和上面的漫射光(Diffuse Light)相似,都是沿着特定的方向传播,不过镜面光(Specular Light)到达物体的表面时,只沿着另一个方 向反射,从而造成只能在必定范围内才能观测到的高亮度照射。游戏
Tip:ip
镜面光和另外两种光比较起来,计算量要大得多,因此选择时应该权衡下。get
在Direct3D中,每种类型的光均可以用D3DCOLORVALUE或D3DXCOLOR来表示。it
这两个的结构基本一致:io
//D3DXCOLOR Structure typedef struct D3DXCOLOR { FLOAT R; FLOAT G; FLOAT B; FLOAT A; }D3DXCOLOR,*LPD3DXCOLOR;
//D3DCOLORVALUE structure
typedef struct D3DCOLORVALUE { float r; float g; float b; float a; }D3DCOLORVALUE,*LPD3DCOLORVALUE;
结构体中的前三个R,G,B也就是常常谈论的RGB调色板,然后面的A | a表示的是Alpha值,透明值。
材质就是这个物体看起来是什么质地的。包含物体表面的色彩、纹理、光滑度、透明度、反射率、折射率、发光度等等。
在Direct3D中能够经过定义物体的材质(materials)来进行模拟现实生活中的一些材质反映的现象,如树叶是绿色,地板的光滑度等。该材质结构体能够经过定义物体表面 对各类颜色光的反射比例。
;//材质(materials)的结构体定义 typedef struct D3DMATERIAL9 { D3DCOLORVALUE Diffuse; //漫射光的反射率 D3DCOLORVALUE Ambient; //环境光的反射率 D3DCOLORVALUE Specular; //镜面光的反射率 D3DCOLORVALUE Emissive; //亮度值 float Power; //锐度 }D3DMATERIAL9,*LPD3DMATERIAL9;
Diffuse:指定材质对漫射光的反射率。
Ambient:指定材质对环境光的反射率。
Specular:指定材质对镜面光的反射率。
Emissive:用于加强物体的亮度值,使之看起来好像本身在发光同样。
Power:指定镜面高光点的锐度。
若有一个红色的球体,只反射红色光,而吸取其余的全部光,按如下定义:
// 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;
面法线:
顶点法线:
法线的做用主要是将入射光进行反射,在Direct3D中只需知道顶点的发线位置,就能够肯定光线到达表面时的入射角。
注意:顶点法线有时候不必定和面法线相同。
在Direct3D中支持的光源也和现实生活中的相似:
一、点光源(Point lights):在一个固定的位置,并向全部方向发射光线。
二、方向光(Directional lights):沿着某条特定的路径发射光线。
三、聚光灯(Spot lights):相似于现实生活中的手电筒发出的光,发射的光线呈锥形。
在Direct3D中,光源能够采用结构D3DLIGHT9来表示:
// typedef struct D3DLIGHT9 { D3DLIGHTTYPE Type; D3DCOLORVALUE Diffuse; D3DCOLORVALUE Specular; D3DCOLORVALUE Ambient; D3DVECTOR Position; D3DVECTOR Direction; float Range; float Falloff; float Attenuation0; float Attenuation1; float Attenuation2; float Theta; float Phi; }D3DLIGHT9,*LPD3DLIGHT;
Type:定义所要建立的光源类型。即点光源(Point Lights)、方向光(Directional Lights)、聚光灯(Spot Lights)。
Diffuse:所发出的漫射光的颜色。
Specular:所发出的镜面光的颜色。
Ambient:所发出的环境光的颜色。
Position:描述光源所在的地方。
Direction:描述光在坐标系中传播方向的向量。
Range:光程,光能射到多远。
Falloff:仅仅用于聚光灯。表示光强由内到外的衰减方式。
Attenuation0、Attenuation一、Attenuation2:定义了光强随距离衰减的方式。
Theta:仅用于聚光灯,表示内部锥形的圆锥角。
Phi:和Theta同样,不过用于表示外部锥形的圆锥角。
最后成果截图: