光照(Light)

光照对于烘托一个游戏的气氛非常重要,Cocos2d-x 目前支持四种光照技术。使用不同的光照技术,可以获得不同的光照效果。

环境光

环境光 AmbientLight 对场景中的所有内容均匀的应用光照,模拟正常办公环境中的光照可以使用这种方式。

代码:

  1. auto light = AmbientLight::create (Color3B::RED);
  2. addChild(light);

效果:

光照(Light)  - 图1

定向光

定向光 DirectionLight 是来自特定方向的平行光。因为所有的光线都是平行的,对于场景中的每个物体光的方向都保持一致,所以物体和光源的位置保持怎样的关系都无所谓。定向光的一个很好例子是太阳光。

代码:

  1. auto light = DirectionLight::create(Vec3(-1.0f, -1.0f, 0.0f), Color3B::RED);
  2. addChild(light);

效果:

光照(Light)  - 图2

点光源

点光源 PointLight 从一个点向整个空间所有方向照射,注意,距离点光源越近,受到的光照越强,越远,受到的光照越弱。点光源的一个很好例子是灯泡。

代码:

  1. auto light = PointLight::create(Vec3(0.0f, 0.0f, 0.0f), Color3B::RED, 10000.0f);
  2. addChild(light);

效果:

光照(Light)  - 图3

聚光

聚光 SpotLight 是一种位于环境中某点的光源,只是它不是向所有方向照射,而是只朝某个方向照射。结果是只有一个聚光照射方向的确定半径内的物体才会被照亮,其他的都保持黑暗。聚光的一个很好的例子是手电筒的光。

代码:

  1. auto spotLight = SpotLight::create(Vec3(-1.0f, -1.0f, 0.0f), Vec3(0.0f, 0.0f, 0.0f),
  2. Color3B::RED, 0.0, 0.5, 10000.0f) ;
  3. addChild(spotLight);

效果:

光照(Light)  - 图4

光照屏蔽

如果场景中被设置了多个光照,但是你希望某一节点对象仅被其中一个光照影响,而不是被多个光照影响,那可以使用 setLightFlag(LightFlag) 函数进行控制。要注意,多个光照效果也是通过一次渲染完成的。

由于移动平台的性能问题,不推荐使用多个光照,默认光照的最大值为一,如果要打开多个光源,则必须要在 info.plist 中定义以下配置:

  1. <key> cocos2d.x.3d.max_dir_light_in_shader </key>
  2. <integer> 1 </integer>
  3. <key> cocos2d.x.3d.max_point_light_in_shader </key>
  4. <integer> 1 </integer>
  5. <key> cocos2d.x.3d.max_spot_light_in_shader </key>
  6. <integer> 1 </integer>