照明、フォグ、その他

物体毎に照明を変えたい場合

キャラクターを扱うゲームの場合、背景のテレインや建物等と、人物類などの間で陰付けの強さを変えたい等のニーズが多い。
その他にも、炎やビームなどの表現においては影や陰を付けないようにすべきである
単に、特定の物体に陰付けしたくないのであれば、下記のようにする。

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段階の処理が必要。

  1. シーン全体にフォグ設定をする。
    下記は、距離70からフォグが開始されて、距離100で最大値になる設定。フォグの色は(200,200,200)
    pIrrDevice->getVideoDriver()->setFog( irr::video::SColor(255,200,200,200),
      video::EFT_FOG_LINEAR, 70, 100);
  2. フォグをかけたいSceneNodeを作成した後に、EMF_FOG_ENABLEフラグを立てる。
    node->setMaterialFlag(irr::video::EMF_FOG_ENABLE, true);

加算半透明(EMT_TRANSPARENT_ADD_COLOR)の物体にはフォグはかからない。カメラからの距離に応じてsetVisibleで不可視化するなどの対策が必要。
アルファ半透明(EMT_TRANSPARENT_ALPHA_CHANNEL)であればフォグは有効。


Copyright by MUTATE Systems 2018
管理者宛メール