光照(light)

光照(light)是为了加强游戏场景的真实感而存在,也有助于描述实体形状和立体感,算是3D游戏中渲染的基础了。spa

如:.net

 

1、认识光照:

在Direct3D的光照模型中,光源发出的光由如下三种类型组成(和现实生活中的相似)。3d

一、环境光(Ambient light):这种光经其余表面反射到达物体表面,并照亮整个场景。如现实生活中的树叶同样,只被环境光必定程度的照亮,而不是直接照射,之因此呈现      出绿色,那是由于它对绿色光产生了反射。code

二、漫射光(Diffuse Light):这种光沿着特定的方向传播。当它到达某一个表面时,将沿着各个方向均匀反射,即不管从什么角度看,该表面的亮度均相同。blog

三、镜面光(Specular Light):这种光和上面的漫射光(Diffuse Light)相似,都是沿着特定的方向传播,不过镜面光(Specular Light)到达物体的表面时,只沿着另一个方         向反射,从而造成只能在必定范围内才能观测到的高亮度照射。游戏

Tip:ip

镜面光和另外两种光比较起来,计算量要大得多,因此选择时应该权衡下。get

在Direct3D中,每种类型的光均可以用D3DCOLORVALUED3DXCOLOR来表示。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值,透明值。

 

2、认识材质:

       材质就是这个物体看起来是什么质地的。包含物体表面的色彩、纹理、光滑度、透明度、反射率、折射率、发光度等等。

              在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;

 

 

 

3、认识法线:

 

 

面法线:

 

顶点法线:

 

法线的做用主要是将入射光进行反射,在Direct3D中只需知道顶点的发线位置,就能够肯定光线到达表面时的入射角。

注意:顶点法线有时候不必定和面法线相同。

 

 

4、光源

在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同样,不过用于表示外部锥形的圆锥角。

 

最后成果截图:

 

点击打开连接