Cocos 3D功能初探学习笔记(3)---光照

来源:互联网 发布:java中数组去重 编辑:程序博客网 时间:2024/05/16 15:45

个人原创,欢迎转载,转载请注明地址,专栏地址http://blog.csdn.net/bill_man

3D游戏中光照对于游戏效果占有举足轻重的作用,也是与2D游戏的重要区别。cocos引擎也提供了完善的光效效果支持。

光照就是光源照到物体上的效果,cocos引擎支持四种光源,继承自Node类,也就是说可以作为子节点防止到场景里,四种光源的基类是BaseLight,它是所有灯光的基类,cocos2d-x支持4种灯光,环境光、方向光、点光源和聚光灯。每个灯光都有一个灯光标记lightflag, 只有当物体的灯光掩码lightmask与(1<<lightFlag)做与运算不为0的时候这个物体才会被该灯光照亮。

环境光(AmbientLight)是不来自任何特定方向的光,在整个场景中经典光照模型把它当作一个常量,组成一个合适的第一近似值来缩放场景中的光照部分。计算这个光照并不涉及任何关于光源方向或者眼睛观察场景的方向,它也可以当成积累每个光源的基础贡献值或者当成预先计算的单一全局效果。

使用方法

    _ambientLight = AmbientLight::create(Color3B(200, 200, 200));

    _ambientLight->retain();

    _ambientLight->setEnabled(true);

     addChild(_ambientLight);

 _ambientLight->setCameraMask(2);

 参数就是光的颜色,作为子节点加入到场景中就可以了

方向光(DirectionLight)是一个无限远的光源,他可以与我们表面上所有的点近似有相同的方向。这样的假设简化了数学运算,因此方向光的实现代码很简单,比其他光源的运行速度更快,方向光的典型例子是太阳光。

使用方法

     _directionalLight = DirectionLight::create(Vec3(-1.0f, -1.0f, 0.0f), Color3B(200, 200, 200));

     _directionalLight->retain();

     _directionalLight->setEnabled(false);

     addChild(_directionalLight);

 _directionalLight->setCameraMask(2);

 第一个参数是方向,方向光的方向就是灯光的局部坐标系的-z方向,第二个参数是颜色。

点光源(PointLight)是模拟靠近场景或者在场景中的光源,就像电灯或者路灯。点光源和方向光有两个区别,一是点光源表面的光源方向都是不同的,二是表面接收的光源会随着离光源的距离越远而变少。

使用方法

     _pointLight = PointLight::create(Vec3(0.0f, 0.0f, 0.0f), Color3B(200, 200, 200), 10000.0f);

    _pointLight->retain();

    _pointLight->setEnabled(false);

    addChild(_pointLight);

    _pointLight->setCameraMask(2);

第一个参数是光源位置,第二个是颜色

聚光灯(SpotLight)是一个强大的光束来照亮一个明确的区域,照射区域可以进一步通过在光源的侧面使用挡板或者窗板的形状来设置。

使用方法

     _spotLight = SpotLight::create(Vec3(-1.0f, -1.0f, 0.0f), Vec3(0.0f, 0.0f, 0.0f), Color3B(200, 200, 200), 0.0, 0.5, 10000.0f);

    _spotLight->retain();

    _spotLight->setEnabled(false);

    addChild(_spotLight);

 _spotLight->setCameraMask(2);

参数分别是方向、位置、颜色、内径,外径和衰减范围

需要说明的是sprite3D有一个setLightMask方法,用于设置哪个光照对它起作用,-1是所有光照都对它起作用(默认值),剩下的值就可以根据光源设置的setLightFlag的值来选择特定的光源(LIGHT0-LIGHT15)

能力不足,水平有限,如有错误,欢迎指出。

3 0
原创粉丝点击