アルファテスト

TAKAO2005-07-08

これも、別に今日やったことではありませんが、ネタが尽きるまでこんなような更新を続けていこうかと思います。

さて、現在進行中のプロジェクトの中で、マップを3Dで描画して、キャラクタをビルボード表示しようと思っているのですが、その際にちょっとした問題が起きてしまいます。それが上の画像ですね。

3Dエンジンでは、物体の前後関係を特に考えずに、手前の物体を描いたあとに奥の物体を描いても手前の物体に被らないように描画してくれます。これは、いわゆるZバッファというものにその物体の奥行きが記録されていて、それを元に描画すべきかを判断しているのためなのですが…

普通の物体(画像中のポリゴンで作られたイルカみたいに)を描画する分にはまったく問題ないのですが、テクスチャーで透明色を指定してしまった場合に少々問題が…(上の画像)Zバッファには基本的にポリゴンの情報が記録されているため、手前にある物体のポリゴンの部分には奥の物体を描画してくれないのです。ビルボードならZ値でソートしてしまえばいいのですが、木やらの自然物を描画しようと思うとポリゴン同士が交差してしまってうまくいきません。そこで、透明な部分はZバッファに書き込まないようにするアルファテストという作業を行うようにしました。MSDNあたりを適当に探していたら発見。早速実装!

Direct3DDev.RenderState.ReferenceAlpha= 1;
Direct3DDev.RenderState.AlphaTestEnable= true;
Direct3DDev.RenderState.AlphaFunction= Compare.GreaterEqual;

レンダーステイトを3ついじったら出来ました。世の中便利になったものです。多分、1番上のプロパティがアルファ値をどこまで切り捨てるかで、2番目がアルファテストを行うかどうかのプロパティで、最後のが切り捨ての挙動のような気がします。ってか、MSDNにはそんなようなことが書いてありました。

ってわけで、完全に透明⇔完全に不透明の切り分けは出来ましたが、半透明の場合や加算合成の場合なんかでは使えそうにありません。ネット上をぐるぐる回ってみても、どうやらZソートを行うしかないようですね。トランスフォーム後のZ値でソートすればいいとか。ああ、面倒。半透明も考え物ですね。

とりあえず、この機能をフルに使えるように木のモデリングでもやってみます。楽しそうですね。

そのうちこんな様なことをまとめてC#でゲームプログラム講座で公開しようかと思います。まぁ、その前に説明しなきゃいけないことが山のようにあるのですが。

正真正銘、今日やったことです。

今、CLKsでは僕Enuが個人的に開発を進めているLoFともう一つ、メンバー全員で開発を進めている段ジョン自動生成型アクションゲームがあります。LoFは学校の授業の一環として製作を進める予定なので、夏休み中はボチボチ開発を進めるとして、有り余る時間の大半をこちらに注ごうかと思います。まぁ、気まぐれなのでどうなるかはわかりませんが。

ってことで、僕はそのプロジェクトのグラフィック&総合プログラム担当なのです。勝手に決めたのですが。本日はマップ画面とチップの配置もろもろをやりました。プログラム自体はあまりいじっていませんが、ゲーム中のマップは3Dで表示する予定ですので、マップチップを作るには今までやったことのなかった3Dのモデリングをやらなくてはなりません。

3Dモデリングソフトで、手ごろな値段で手に入り、なおかつXファイルを吐き出せるツールを探したところ、フリーのメタセコイアが一番ということに落ち着きました。とりあえず、一番無難な森のダンジョンを作ってみようということで、CG系の本を片手に、初めて使うメタセコイアを適当にいじって草のモデルを生成。早く試したかったので、早速プログラムに適応してみたのが上の画像ですね。キャラクターはLoFのウィング君を使っていますが、実際には別のキャラクターになる予定です。これも描かなきゃ。

画面の感じはまぁまぁですね。多少、巨大植物に囲まれてしまっている感はありますが、プログラム自体は問題ないでしょう。後はちゃんとモデリングできるようになればいいのですが。練習ですね。

ちなみに、こんなに入り組んだテクスチャーをちゃんと表示してますね。これがやりたかったので、下のアルファテストを実装したかったわけです。うん。素晴らしい。明日は木でもモデリングするか。何が難しいって、多分テクスチャーが難しいかな?