光照(light)

来源:互联网 发布:金融软件供应商 编辑:程序博客网 时间:2024/05/18 02:57

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

如:



一、认识光照:

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

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

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

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

Tip:

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

在Direct3D中,每种类型的光都可以用D3DCOLORVALUED3DXCOLOR来表示。

这两个的结构基本一致:

//D3DXCOLOR Structuretypedef 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中支持的光源也和现实生活中的类似:
1、点光源(Point lights):在一个固定的位置,并向所有方向发射光线。
2、方向光(Directional lights):沿着某条特定的路径发射光线。
3、聚光灯(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、Attenuation1、Attenuation2:定义了光强随距离衰减的方式。
Theta:仅用于聚光灯,表示内部锥形的圆锥角。
Phi:和Theta一样,不过用于表示外部锥形的圆锥角。

最后成果截图:


点击打开链接
原创粉丝点击