模拟游戏引擎中的灯光实现

游戏中的光的种类有三种:
环境光,平行光,点源光
灯光种类的实现使用了枚举表示,灯光定义的结构体把所有的灯光属性都集合在一起,根据不同的灯光属性,填充不同的参数.
结构体表示如下:
struct ELight    
	{
		EInt id;  //灯光的ID,全局唯一
		EBool lightOn;  //设置灯光开  默认开启

		LIGHT_TYPE lightType;  //灯光的类型

		EFloat power;  //灯光强度 默认1.0f
		EFloat shadowFactor;  //灯光背面强度 默认0.05f

		EColor ambient;  //灯光的环境色    默认(255,255,255)
		EColor diffuse;  //灯光漫反射颜色  默认(255,255,255)

		EColor specular;  //灯光高光颜色
		
		EVector4D position;  //灯光世界坐标位置 默认(0,0,0)
		EVector4D direction; //灯光朝向  默认(0,0,1)

		EVector4D transPosition;  //灯光摄像机坐标系位置
		EVector4D transDirection;  //摄像机坐标系光源朝向

		EFloat kc, kl, kq;  //衰减因子
		
		EFloat spot_inner;  //聚灯光内锥角   默认(45.0f)
		EFloat spot_outer;  //内聚灯光外锥角  默认(60.0f)
		EFloat pf;  //聚灯光指数因子
		
		ELight(EInt lightId, LIGHT_TYPE type);  //构造函数
	};

游戏中的灯光很多,为统一管理,可以使用vector
可以通过灯光ID获取不同的灯光
灯光的创建函数如下:
EInt CreateLight(LIGHT_TYPE lightType) {
		if (GLights == NULL)
			GLights = new std::vector<ELight *>;   //如果列表无初始化 则初始化一个列表

		if ((EInt)GLights->size() > MAX_LIGHTS)    //如果达到上限 则无法继续添加灯光
			return -1;

		EInt id = (EInt)GLights->size();
		GLights->push_back(new ELight(id, lightType));  //插入一个vector

		return id;
	}

根据列表获取一个灯光:
如果灯光列表不存在,或是列表已满,则无法获取灯光
灯光ID不在范围内也要排除
//获得一个灯光
	ELight* GetLight(EInt id) {
		if (GLights == NULL || (EInt)GLights->size() > MAX_LIGHTS || id < 0 || id >(EInt)GLights->size() - 1)
			return NULL;
		return GLights->at(id);
	}

删除所有灯光:
通过vector的迭代器遍历所有灯光并删除
//删除所有灯光
	void DestoryAllLight() {
		for(LightItr itr = GLights->begin(); itr != GLights->end(); ++itr)
			SafeDelete((*itr));
		
		GLights->clear();
		SafeDelete(GLights);
	}













评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值