![]() |
||||||||||||||||
![]() |
9/3 解説 新SXLib 随分前に作ってほったらかしにしていたといいますか、ちまちま使ってはいたものの、ろくに手を入れていないDG-Carad専用3Dツールキット、SXLibについて今回は取り上げてみようかと。 なんで突然そんなことをするかといいますと、自分自身作ったきり忘れてしまった、とか、内部構造を文書に書き出してみる事でまだまだ作り足したい部分が見えてくるかもしれない、とか、そういう気持ちがあるのです。 SXLibの構成まず、SXLibを構成するクラスについてざっと見てみましょう。SXLibを構成するクラスは、当たり前ですがそれぞれが3Dシーンの構築に重要なウェイトを占めています。
このうち、TSXFrameオブジェクトとTSXSceneオブジェクトの操作がSXLibの利用のうちほとんどを占めるのではないかと思います。 よく誤解されるのですが、SXLibは3Dに特化していて2Dにはあまり向かないという印象を抱かれているようですが、むしろSXLibは2D描画と3D描画の調和に特化した3Dエンジンという事が出来ますし、3D描画を一切行わずにPushSpriteメソッドだけ用いて2D描画だけ行わせるという事も充分可能です。 確かに、旧Primitivesのように2D描画だけに特化したエンジンにはパフォーマンスや学習しやすさの面で明らかに劣ると思うのですが、そうしたエンジンを利用すると、作ってるうちに3D描画も混ぜたくなっちゃったという時に困るのは明白です。 さて、大体どんなデータを用いて2D/3Dシーンを作っていくのかという事について押さえたところで、一体どうやってTSXSceneは描画を行うのか、その流れについて見て行きます。これを知ることで、SXLibが内部で何をやっているのかが随分ハッキリした物になると僕は思っています。 TSXScene.RenderメソッドTSXScene.Render(rootFrame : TSXFrame); というのが呼び出し形式になっていて、描画をする上での最上位のフレーム = ワールド座標系になるフレームが渡されますが、描画ルーチンそのものの説明に入る前に、レンダリングキューについて説明しておきます。レンダリングキュー(以下、単にキューと呼びます)とは、メッシュやビルボード、スプライトといった、とにかく「画面に描く必要のある何か」についての情報を格納しておくためのものです。 なぜキューイングをする必要があるかというと、半透明体を書く際のZソートのためです。TSXSceneでは半透明体のようにZソートの必要がある物体のためのキュー(Sortキュー)と、不透明体のようにZソートの必要の無い物体のためのキュー(普通のキュー)、そして、スコア表示やHUDなどの描画のために無条件で最前面に書かれるようなスプライト用のキュー(Topmostキュー)を用意しています。 まず、スプライトとビルボードに関しては、Scene.PushSprite、Scene.PushBillboardによってSceneオブジェクトに渡されるたびに、キューに放り込まれます。Sortキューに放り込むか普通のキューに放り込むかはそれぞれのメソッドのblendmode引数によって決定されます。 メッシュに関しては、メッシュの格納されたTSXFrameへの参照がキューに放り込まれる形になります。この理由は後で説明します。 ちなみに、半透明体のソートをするのは重くなるし、適当でいいや、という場合は半透明体同士のソートを行わないようにもできます。TSXscene.SortAlphaプロパティをFalseに設定すればOK。デフォルトではTrueに設定されています。 以上を踏まえて、レンダリング手順を見て行きましょう。
以上で、Renderメソッドの説明は終わりです。文章にしてみると案外あっさりでしょうか? SXLibが勝手に変更しやがるレンダリングステート等について最後に、SXLib側で勝手に操作してしまうレンダリングステートについて述べておきます。これを知っていれば、「あれ、自分のプログラムで設定した内容が反映されてない??」という事が少なくなるかと。 TSXScene.Renderメソッド内
TSXScene.SetProjection内
TSXScene.SetViewport内
TSXLight
以上ッふ〜っ。以上でSXLibの内部についての解説を終了します。 眺めていて思ったことといえば、やはりVS/PSを考慮していなかったり、DirectX9で復活したGetDCを活用していなかったりと、いささか時代遅れの実装になっていることでしょうか。VS/PSを自前のものに設定してしまうと、レンダリングステートのいくつかは完全に無視されますので、折角SXLibで色々とセットしたレンダリングステートは、単なるムダという事になってしまいます。 ともあれ、これからやらなきゃならないことはまだまだ、ですね〜。なにより作品作り、かな(^^;) |
|||||||||||||||
![]() |