------------------------西昌.何雨锋 灯光
灯光是一种常见的东西,但是不知道物体的纹理是否有灯光纹理这一说还是在纹理中就程序形成的。
最简单的灯光可以直接用灯光引擎建立出来。
****************
ITVLightEngine lighten1;
lighten1=CreateTVLightEngine();
lighten1->CreateQuickPointLight(三维点,色红,色黄,色蓝,灯光照亮范围,"灯光名称",镜面反射);
//如:lighten1->CreateQuickPointLight(&vecnow,0.9,0.9,0.9,300,"lighty",0.1);
//这样就可以建立出一个快速的点光源,颜色为(0.9,0.9,0.9),范围300,镜面反射不能设为0,否则就会完全不显示被照亮的区域。
//这种光源不会影响到任何的环境的照明,只对范围内的东西被照着部分加些强光。
****************
另一种快速灯光是桶光,可以这样建立:
lighten1->CreateQuickDirectionalLight(&(global1->Vector(800,800,800)),0.5,0.5,0.5,"lightz",0.5);
lighten1->SetLightRange(1,300);
lighten1->SetLightAttenuation(1,100,200,500);
****************
经常在很远的地方用来模仿太阳光。
这些建立快速灯光虽然可以用函数调节其各种参数,但是一个灯光引擎只能建立出一个来,不太安逸,
这时候可以用TV_LIGHT或::D3DLIGHT8这种已经定义好的结构来预先定好了灯光的各种参数,再用灯光引擎把它建立出来,
或者用灯光结构来获取已经建立好的灯光信息,再复制很多个灯光。
这两种结构实际上都是用dx的D3DLIGHT8来的,其结构为:
typedef struct _D3DLIGHT8 {
D3DLIGHTTYPE Type; // 灯光类型 D3DLIGHT_POINT,D3DLIGHT_DIRECTIONAL
D3DCOLORVALUE Diffuse; // 光的漫反射颜色
D3DCOLORVALUE Specular; // 镜面反射颜色
D3DCOLORVALUE Ambient; // 总体颜色(相当于环境光)
D3DVECTOR Position; // 光源在空间中的位置(方向光不需要设置)
D3DVECTOR Direction; // 光照的方向(只对方向光和聚光灯有效)
float Range; // 光照的的最大距离,在这个距离以外将不起作用
float Falloff; // 聚光灯内圈到外圈的衰减值,一般为1.0
float Attenuation0; // 距离衰减系数,通常为0.0
float Attenuation1; // 距离衰减系数,通常为一个常数1.0
float Attenuation2; // 距离衰减系数,通常为0.0
float Theta; // 聚光灯的内圈大小(单位:弧度)
float Phi; // 聚光灯的外圈大小(单位:弧度)
} D3DLIGHT8;
这样就完全可以用一个灯光结构赋值来得到了灯光,再用灯光引擎CreateLight()将其建立出来了,但是要注意大小写,还有这个结构在程序中是看不到的。
其他的函数还有:
lighten1->SetLightPosition(lightID,&D3DVECTOR);确定第ID个灯光的位置
lighten1->SetLightDirection(lightID,&D3DVECTOR);确定第ID个灯光的照向点
int kk=lighten1->GetCount(); 得到灯的总数量
bool kk=lighten1->GetEnableLight(lightID);得到第ID个灯是否在使用中
lighten1->EnableLight=tvtrue; 让灯光允许。
TV_LIGHT light1=lighten1->GetLightByIndex(ID);根据ID得到某个灯光的结构,也可以用byname
int lighten1->GetLightIndexByName("...");根据名称得到灯光的ID.
TV_LIGHT light1=lighten1->lightinfor;得到当前灯光的结构信息
str lighten1->lightname; 得到灯光的名称
lighten1->SetLightAttenuation(lightID,衰减1,衰减2,衰减3);设置灯光的衰减层次。(让光的边缘模糊化)
lighten1->SetLightColor(lightID,红,黄,蓝) 改变灯光颜色
lighten1->SetLightRange(lightId,float 有效距离)设置灯光能照多远。
还要注意的有:
scene1->SetSpecularLightning(tvtrue/tvfalse); 为是否允许灯光出现。
给一个灯光对象赋值可以使用下面的方法: