光照
为了增强所绘场景的真实感,我们可为场景增加光照lighting
光照也有助于描述实体开关和立体感.使用光照时,我们无需自行指定顶点的颜色;Direct3D会将顶点送入光照引擎,依据光源类型,材质以及物体表面相对于光源的朝向,计算出每个顶点的颜色值
一.光照的组成
1.环境光ambient light:这种类型的光经其他表面反射到达物体表面,并照亮整个场景.
2.漫射光diffuse light:这种类型的光沿着特定方向传播,当它到达某一表面时,将沿着各个方向均匀反射.
3.镜面光Specular light:这种类型的光沿特定方向传播,当此类光到达一个表面时,将严格地沿着另一个方向反射,从而形成只能在一定角度范围内才能观察到的高亮度照射.
打开镜面光SetRenderState(D3DRS_SPECULARENABLE, true);
每个颜色可以通过:D3DCOLORVALUE或D3DXCOLOR来表示
二.材质
材质允许我们定义物体表面对各种颜色光的反射比例
typedef struct D3DMATERIAL9 {
D3DCOLORVALUE Diffuse; //指定材质对漫射光的反射率
D3DCOLORVALUE Ambient; //指定材质对环境光的反射率
D3DCOLORVALUE Specular; //指定材质对镜面光的反射率
D3DCOLORVALUE Emissive; //增强物体的亮度,
float Power; //指定镜面光点的锐度,该值越大,高光点的锐度越大
} D3DMATERIAL9, *LPD3DMATERIAL9;
使用前先ZeroMemory(&d3dmaterial, sizeof(d3dmaterial));
顶点结构中不含有材质属性,但我们必须对当前材质进行设定,下面这个函数可以用来对当前材质进行设定:
HRESULT IDirect3DDevice9::SetMaterial(
CONST D3DMATERIAL9 * pMaterial
);
三.顶点法线
顶点法线描述的是构成多边形的各个顶点的法线.
由于光照计算是对每个顶点进行的,所以Direct3D需要知道表面在每个顶点处的局部朝向,顶点法线和表面法线不一定相同
struct Vertex
{
float x,y,z;
float _nx, _ny, _nz;
static const DWORD FVF;
};
const DWORD Vertex::FVF = D3DFVF_XYZ|D3DFVF_NORMAL;
一种最好的求取顶点法向量的方法是计算法向量均值
通过使能D3DRX_NORMALIZENORMALS绘制状态使所有的法向量重新规范化
SetRenderState(D3DRS_NORMALIZENORMALS, true);
四.光源
1.点光源:point
在世界坐标系中有固定的位置,并向所有的方向发射光线
2.方向光源 directional
没有位置信息,所发身的光线相互平行地没某一特定方向传播.
3.聚光灯:spot
于手电筒类似,有位置信息,其发射的光线呈锥形沿着特定方向传播.
typedef struct D3DLIGHT9 {
D3DLIGHTTYPE Type; //光源的类型D3DLIGHT_POINT,D3DLIGHT_SPOT,D3DLIGHT_DIRECTIONAL
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;
方向光:只要定义direction, color=(diffuse, specular, ambient)
点光源:position color
聚光灯:position direction color
设置完光源我们要进行光源注册:
设置光源
HRESULT SetLight(
DWORD Index, //光源标识
CONST D3DLight9* pLight //光源结构
);
使用哪个光源
HRESULT LightEnable(
DWORD LightIndex, //光源标识
BOOL bEnable //是否使用
);
代码
:http://download.csdn.net/source/1866450