キャラクターを扱うゲームの場合、背景のテレインや建物等と、人物類などの間で陰付けの強さを変えたい等のニーズが多い。
その他にも、炎やビームなどの表現においては影や陰を付けないようにすべきである
単に、特定の物体に陰付けしたくないのであれば、下記のようにする。
pNode->setMaterialFlag(video::EMF_LIGHTING, false);
EMF_LIGHTINGをfalseにすると、常に100%の光量となる。必要な陰や影は、予めテクスチャ内に書き込んでおくこと。
光の量や環境光を調整したいのであれば、調整用に別のLightSceneNodeを作り、特定の物体にのみ当たるように設定する。このようなことをしたい場合、LightManagerを作成する。
class MyLightManager : public irr::scene::ILightManager {
public:
MyLightManager(void);
virtual void OnPreRender(core::array<irr::scene::ISceneNode*> & lightList) {}
virtual void OnPostRender(void) {}
virtual void OnRenderPassPreRender(irr::scene::E_SCENE_NODE_RENDER_PASS renderPass) {}
virtual void OnRenderPassPostRender(irr::scene::E_SCENE_NODE_RENDER_PASS renderPass) {}
virtual void OnNodePreRender(irr::scene::ISceneNode* node);
virtual void OnNodePostRender(irr::scene::ISceneNode* node);
};
LightManagerは、下記のようにSceneManagerに登録する。
pLightManager = new MyLightManager();
pSceneManager->setLightManager(pLightManager);
specialLightをspecificNodeにだけ当たるようにしたいならば、下記のように実装する。
void MyLightManager::OnNodePreRender(irr::scene::ISceneNode* node) {
specialLight->setVisible(node == specificNode);
}
void MyLightManager::OnNodePostRender(irr::scene::ISceneNode* node) {
specialLight->setVisible(true);
}
OnNodePreRenderが呼ばれた時点で光源計算が進んでいるため、この時点でsetVisibleをfalse⇒trueに変更しても反映されない。上記のように、反映したくない光源についてのみ、setVisibleをfalseに変更する。 (2017/04/29訂正)
下記の2段階の処理が必要。
pIrrDevice->getVideoDriver()->setFog( irr::video::SColor(255,200,200,200),
video::EFT_FOG_LINEAR, 70, 100);
node->setMaterialFlag(irr::video::EMF_FOG_ENABLE, true);
加算半透明(EMT_TRANSPARENT_ADD_COLOR)の物体にはフォグはかからない。カメラからの距離に応じてsetVisibleで不可視化するなどの対策が必要。
アルファ半透明(EMT_TRANSPARENT_ALPHA_CHANNEL)であればフォグは有効。