Ogre学习笔记(7):Lighting

       OGRE的灯光接口很简单,以Demo_Lighting工程为例:

1.       创建灯光:Light* SceneManager::createLight(const String& name)
此函数再调用“SceneManager::createMovableObject()”,创建一个Light的实例,然后加入到ObjectMap中(保存在SceneManager::mMovableObjectCollectionMap)。

2.       设置灯光属性:调用Light类的接口,设置灯光类型、颜色、衰减、位置、方向。

Light类从MoveableObject派生。目前Ogre支持点光源、方向光、聚光灯三种Light。灯光的其它属性都保存到这个类中。

 

灯光的渲染时处理在“SceneManager::renderSingleObject()”,参见“Ogre学习笔记(3):Mesh的渲染流程”第11步。这个函数的第一个参数“const Renderable* rend”是需要渲染的对象,Renderble的派生类主要有:NodeSceneNode的父类)、SubEntity。第二个参数“const Pass* pass”。在处理灯光的时候,根据Pass的设置(Pass:: getIteratePerLight),有可能对于Renderable中的每个灯光执行一次渲染,也可能一次渲染所有光照。对于programable passPass:: isProgrammable,调用“mAutoParamDataSource.setCurrentLightList()”设置light list,对于固定渲染管道则调用“RenderSystem:: _useLights()”来设置light list

可见Ogre的灯光处理是非常灵活的,支持per light-per pass,也支持fixed function pipeline灯光,还可以根据Pass支持的灯光的个数来“喂”给它正确的灯光参数。

 

下面看一下RenderableLightList是如何得到的?Renderable::getLights()函数被很多派生类重写,下面分析几个主要的。对于SubEntity,它找到自己属于那个SceneNode,然后调用SceneNode::findLights()==》SceneManager:: _populateLightList(),此函数遍历所有灯光,根据灯光属性,和传进来的位置、半径计算是否影响此物体,然后建立一个LightList,还进行了排序。对于Node类,它只是简单的返回一个空列表。

OGRE这部分处理的过于简单了,没有处理遮挡的问题。例如在屋子里的一个火把,它不应该照亮墙外的一个角色。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值