プロフィール

Na-7

Author:Na-7
SE(システムエンジニア)として約15年間システム系ソフト会社を勤めあげ、2008年3月退社。現在、ゲーム制作会社設立を目指して活動中。


アクセスカウンター


最新記事


最新コメント


最新トラックバック


月別アーカイブ


カテゴリ


DATE: CATEGORY:スポンサー広告
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
DATE: CATEGORY:三国志軍記開発
索敵範囲を描き分ける01
索敵範囲の描画テスト
ステンシルバッファを利用して索敵範囲を描き分けるテスト。重複領域の描画が1度で済むのでパフォーマンスが良い?



◎索敵範囲の描画

履歴画面について考えていたら、その前に重要な問題があることに気付きました。

中級ルールでは味方部隊から離れた敵部隊が見えず、上級ルールでは自部隊から離れた敵が見えないようにしたいのですが、これはつまり「索敵範囲内は部隊と地形を通常表示、索敵範囲外は地形のみ半透明表示」ということです。これはどのように実装すれば良いのでしょうか?

私が考えたのは以下の手順です。

1.ステンシルバッファを初期化する

2.全体地形を半透明で描画する

3.索敵範囲内のステンシルバッファをオンにする

4.ステンシルバッファを参照しながら
  全体地形を不透明で描画する

問題は3番です。できれば索敵範囲を円形領域にしたいのですが、可能でしょうか?



◎アルファとステンシル

ステンシルバッファの円形領域をオンにしたいので、透明度付きの円形テクスチャをステンシルバッファに描画しましょう。

まず、GIMPで透明度付きの画像を作成しようとしたのですが、描画色に透明度を設定する方法がわかりません。結局、「レイヤー>色を透明度に」で特定の色を透明度に置換しました。

circle
(↑透明度付きPNG画像)

テストプログラムを用意して試したのですが、

・アルファ機能の描画テスト
 →円形領域が表示される
 →成功

・ステンシル機能の描画テスト
 →三角領域が表示される
 →成功

・ステンシル描画時に上記画像を描画するテスト
 →四角領域(=テクスチャ領域全体)が表示される
 →失敗

レンダーステートをどのように変更しても円形になりません。もしかしたら、ステンシルバッファへの描き込みの際には、アルファブレンディング無効かも?

こちらのフローチャートを確認すると、アルファブレンドよりもステンシルテストの方が先でした。やはり、ステンシルバッファへの描き込みの際には、アルファブレンディングは無効ということですね。他の方法を探しましょう。



◎四角形で描き分け

しばらくネットで探ったり、ちょこちょこ試したりしましたが、いまいち良い方法が思い付きません。ポリゴンで円形を作れば可能でしょうが、ここで頂点数を増やして負荷を上げるのは効率が悪いと思います。

とりあえず四角形で作っておいて、良い方法が見付かったらステンシル処理を差し替えましょう。良い方法が見付からなかったら、そのまま四角形とするか、ポリゴンで八角形を作るか考えます。

索敵範囲を描き分ける01

サンプルプログラムの開発は成功ですね。

実はステンシルバッファを使わなくても見た目は一緒になります。しかし(画像の矢印のように)重複領域の描画が1回で済むので、パフォーマンスが良くなると考えています。

…実際には遅いかも(汗)



◎次回予告

サンプルができたので、次回はメインプログラムに実装します。パフォーマンス大丈夫でしょうか?(^^;

スポンサーサイト

テーマ : ゲーム製作 関連 - ジャンル : ゲーム

コメント

とりあえGIMPについて

GIMP2で透明度をコントロールするには直接アルファチャンネルを操作するのではなく、レイヤーマスクを作成した方が手っ取り早いです。この機能は「レイヤー」メニューに格納されています。

レイヤーマスクは、通常のアルファチャンネルの他にもう一つアルファチャンネルを作って、それをモノクロ画像として操作するイメージです。実際のアルファ値はアルファチャンネル×レイヤーマスクの値になります。

1・レイヤーマスク作成時、慣れないうちは基本的に「アルファチャンネルを移転」を選んでください。レイヤーマスクにアルファ値が移動し、アルファチャンネルは1になります。

2・レイヤーウィンドウで、当該レイヤーが左右2つに分かれます。右側がレイヤーマスクで、クリックすると“マスクに対して”描画するようになります。また「レイヤーマスクを表示」のON/OFFでマスクそのものを白黒画像として表示できます。

3・最後に「レイヤーマスクを適用」で、アルファチャンネルの値=現在のアルファチャンネルの値×レイヤーマスクの値になります。

ちなみにアルファチャンネルのないレイヤーにもレイヤーマスクを作れますので、アルファチャンネルなしでレイヤーマスクを「適用」しないまま作業を続ける手もあります。PNGをエクスポートするさい警告されますが、気にしなくて大丈夫です。

なるほど

GIMPではこのようにして透明度を扱うのですね。詳しく教えて頂きまして、どうもありがとうございました_O_

レイヤーマスクはまだ慣れてなくて、いろいろ試すと新たな疑問が出てきたりしますが、そのうち慣れると思います。

透明度は、GIMPの「色を透明度に」で変換するか、わざわざプログラムを作成して追加してました(爆)が、お陰様で今後はGIMPで手軽に編集できそうです^^

コメントの投稿


管理者にだけ表示を許可する

トラックバック


この記事にトラックバックする(FC2ブログユーザー)



copyright © ゲーム制作の舞台裏 all rights reserved.Powered by FC2ブログ
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。