DirectX903D 光照

光照html

光照的组成编程

 

光源发出的的光由如下3个份量3种类型的光组成。post

·环境光(Ambient Lingth)ui

   光经其余表面反射到达物体表面 并照亮整个场景。如 物体的某些部分必定程度地照亮,但物体并无处于光照的直接照射下,而是因为其余物体对光的反射。spa

·漫射光(Diffuse Lingth)orm

  光沿着特定的方向传播,当它到达某一表面时, 将沿着各个方向均匀反射。无须考虑观察者的位置。htm

·镜面光(Speculat Light)blog

  光没特定方向传播。 当光到达一个表面时, 将严格地沿着上别一个方向反射,从而造成只能在必定角度范围内才能观察到的高亮度照射。在镜面光照议程中要考虑光线的入股方向和图元的表面朝向和观察点位置游戏

镜面光与其余类型的光相比计算旦要大Direct3D不默认进行反射计算。必须将绘制状D3DRS_SPECULARENABLE设为true.游戏开发

 Device->SetRenderState (D3DRS_SPRCULPRNABLE, true);

材质

Direct3D经过物体的材质来模拟一种现象。即物体的是由该 物体所反射的光的决定的。(例如红色的物体只反射红色光。吸取了非红色光)。

材质用结构D3DMATBRIAL9

typedef struct D3DMATERIAL9{

     D3DCLOLRVALUE  Diffuse;

     D3DCLOLRVALUE  Ambient;

     D3DCLOLRVALUE  Specular;

     D3DCLOLRVALUE  Emissive;

} D3DMATERIAL9,*LPD3DmATERIAL9;

说明:

· Diffuse 指定材质对漫射光的反射率。

· Ambient 指定材质对环境光的反射率。

· Specular 指定材质对镜面光的反射率。

· Emissive 该份量用于加强物体的亮度, 使之看起来好像能够本身发光。

· Pover  指定镜面高光的锐度, 该值越大,高光点的锐度越大。

例如:反射红色光

D3DMATERIAL9  red;

::ZeroMemoty (&red, sizeof(red));

red.Diffuse =D3DXCOLOR (1.0f, 0.0f, 0.0f, 1.0f);  //red

red.Ambient =D3DXCOLOR (1.0f, 0.0f, 0.0f, 1.0f);  //red

red.Specular =D3DXCOLOR (1.0f, 0.0f, 0.0f, 1.0f);  //red

red.Emissive =D3DXCOLOR (0.0f, 0.0f, 0.0f, 1.0f);  //no emission

red.Power = 5.0f;

顶点法线

顶点法线(vertex normal) 描述的是构成多边形的各个顶点的法线。DirectX知道顶点的法线方向,以肯定光线到达表面时的入射角。

描述一个顶点的顶点法线 结构以下:

struct Vetex {

flaot x, y, z;

flaot _nx, _ny, _nx;

static const DWORD FVF;

}

光源

·点光源 (Point lights)光源在世界坐标中有固定的位置,并向全部的方向

光线

·方向光(Directional lights)该光源没有位置信息, 所发射的光线相互平等地沿某一特定方向传播。

·聚光灯(Spot lights)光源与手电筒相似, 该 光源有位置信息, 其发射的光线呈锥开沿着特定方向传播。

光源的结构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;

说明:

·Type 定义了咱们所要建立的光源类型。可取三种 D3DLIGHT_POINT D3DLIGHT_SPOT D3DLIGHT_DIRECTIONAL

·Diffuse 该光源所发出的漫射光的颜色。

·Specular该光源所发出的镜面光的颜色。

·Ambient该光源所发出的环境光的颜色。

·Position 用于描述光源的世界坐标中位置的向量。 对方向光 没意义。

·Direction 描述光在世界 坐标系中传播方向的向量 对

·Range 光线“消亡”前, 所能达到的最大光程。最大值为sqrt (FLT_MAX).方向光 无心义。

·Falloff 该值仅用于聚光灯。该参数定义了光强从内锥形形到外锥形的衰减

·Attenuation0、Attenuation一、Attenuation2衰减变量定义了光强随距离衰减的方式 这些就是 仅用于点光源和聚光灯。

·Theta仅用于聚光灯。指定了内部锥形的圆锥角。单位为弧度。

·Phi 仅用于聚光灯。指定了外误了锥形的圆锥角。单位为弧度。

为一个场景添加光照的步骤以下:

1)    启用光照。

2)    为每一个物体建立一种或多种光源,并在绘制相应物体前应用(设置)该材质。

3)    建立一种或多种光源, 设置并启用。

4)    启用全部其他的光照状态, 如镜面高光。

《DirectX 9.0 3D 游戏开发编程基础》笔记

                              FangSH 2010-4-10

转载于:https://www.cnblogs.com/fangshenghui/archive/2010/04/10/1708973.html