Nebula Device 2 の描画順序について

SceneNode内でソートしないようにするにはどうすれば良いのかと以前から気にしていたのですが、偶然見つけたのでメモ。

場所は nsceneserver_main.cc 内でした。

nSceneServer::RenderScene()
  nSceneServer::SortNodes()
    qsort(indexPtr, numIndices, sizeof(ushort), (int(__cdecl*)(const void*, const void*))CompareNodes);
      nSceneServer::CompareNodes(const ushort* i1, const ushort* i2)

Nebula Device 2 は、描画順序に以下の様なルールで処理されます。

描画は XML で定義された render path 順に処理される。

使用するシェーダーによっては、レンダリングされた結果を読み取りたい場合があったり、デバッグ用のメニュー表示を行うために、 render path の順番はとても重要です。

ひとつの path は、その中で定義されたシェーダー順で描画される。

アルファ値を使用した描画をZ値を参照しながら描画をするときに前後関係によってはおかしくなる時があります。ですので、ひとつの path に列挙された順に描画されます。

SceneNodeはプライオリティが高いものほど手前に描画される。

表現方法によっては、本来みえないはずのものが見えた方が望ましい場合があります。(例えば、壁の向こう側が透けて見えるとか)そういった本来の前後関係をどうしても無視したい場合は、プライオリティの値を大きくすることで一時的に手前にする事が出来ます。

同じプライオリティの場合はカメラからの距離に応じて描画順序が並び替えられる。

不透明な物の後ろに配置された物は見えなくなります。描画される空間がどんなに広くても、それをディスプレイ越しに見る限りは、結局は見えている物がすべてとなります。

そこで

  • 全く見えないのはそもそも描画しない。
  • 一部分しか見えない物は、見えている部分だけを描画する。

といった方法で、必要な物だけを描画します。

手前のものから描くことで、そこに隠れているもの自体を描画しないようにします。

説明が長くなってしまいましたが、こんな感じで便利な機能が内蔵されているのですが、 2D の描画を行う際にはこの処理が問題となります。

Nebula Device 2 では nRpPhase に None, FrontToBack, BackToFront というのが選べるのですが、一時的にソートしないようにするにはどこをいじれば良いのかわからなかったので…