光照
光照的组成
光源发出的的光由以下3个分量3种类型的光组成。
·环境光(Ambient Lingth)
光经其他表面反射到达物体表面 并照亮整个场景。如 物体的某些部分一定程度地照亮,但物体并没有处于光照的直接照射下,而是由于其他物体对光的反射。
·漫射光(Diffuse Lingth)
光沿着特定的方向传播,当它到达某一表面时, 将沿着各个方向均匀反射。无须考虑观察者的位置。
·镜面光(Speculat Light)
光没特定方向传播。 当光到达一个表面时, 将严格地沿着上别一个方向反射,从而形成只能在一定角度范围内才能观察到的高亮度照射。在镜面光照议程中要考虑光线的入股方向和图元的表面朝向和观察点位置
镜面光与其他类型的光相比计算旦要大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、Attenuation1、Attenuation2衰减变量定义了光强随距离衰减的方式 这些就是 仅用于点光源和聚光灯。
·Theta仅用于聚光灯。指定了内部锥形的圆锥角。单位为弧度。
·Phi 仅用于聚光灯。指定了外误了锥形的圆锥角。单位为弧度。
为一个场景添加光照的步骤如下:
1) 启用光照。
2) 为每个物体创建一种或多种光源,并在绘制相应物体前应用(设置)该材质。
3) 创建一种或多种光源, 设置并启用。
4) 启用所有其余的光照状态, 如镜面高光。
《DirectX 9.0 3D 游戏开发编程基础》笔记
FangSH