direct9.0光照

光照

 


为了增强所绘场景的真实感,我们可为场景增加光照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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值