プロフィール

Na-7

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


アクセスカウンター


最新記事


最新コメント


最新トラックバック


月別アーカイブ


カテゴリ


DATE: CATEGORY:スポンサー広告
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
DATE: CATEGORY:三国志軍記開発
地形モデル再作成11
開発中のメイン画面
地形モデルの頂点数を減らして描画速度を向上させた。
これでビューポートを分割しても大丈夫!?



◎前回のおさらい

前回はメタセコイアの機能を使用して頂点数を減らしました。

メタセコイアで頂点数を減らす01   メタセコイアで頂点数を減らす02

左図が元のモデル、右図が頂点数を減らしたモデルです。山がくっついて山脈になったり、テクスチャや高さ情報が滅茶苦茶になったりで、使い物になりません。

そこで、なるべく原形/テクスチャ/高さ情報を保持しつつ頂点数を減らす方法を検討します。



◎要件

まずは、目的を達成するための要件を整理しましょう。

・周囲8頂点が同一の高さの頂点を削除する
 →さらに減らしたい場合は、
  高度差が一定値以内の頂点を削除する
 →地形テクスチャの4隅の頂点は削除しない

・頂点の座標は変更しない
 (テクスチャ/高さ情報の整合性を保持するため)

上記要件を満たせば、目的を達成できるでしょう。また、頂点を沢山削除するために、下記を実施します。

・予めグレースケールマップ(高さ情報)を修正して
 平地を慣らしてから地形を生成する



◎手法検討

前述の要件を実現するための手法を検討します。

A案:メタセコイアで選択/削除/面生成する(手動)

B案:Softimageモデルに変換
   →Softimageで頂点削除スクリプトを作成実行
   →メタセコイアモデルに戻す

C案:XNAでグレースケールマップから
   (頂点を削除しつつ)地形モデルを生成する


A案は、条件に合致する頂点の選択がちょっと面倒です。荊州だけで7マップ、最終的には50以上のマップを手動でやるとかなり手間かも^^;

B案は、まずSoftimageのスクリプトを勉強する必要があります。また、データ変換ツール(メタセコイア→Softimageは入手済、逆方向は未入手)の座標精度が100%維持されるか一抹の不安があります。

C案は、頂点数を減らしてから地形モデルを生成するプログラムは複雑で大変そうです。


‘周囲8頂点が同一の高さの頂点を削除する’というロジックは単純なので、なるべく自動化したかったのですが、B案C案はそれなりに大変そうなので、今回はとりあえずA案でやりましょう。



◎グレースケールマップ修正

まずは、グレースケールマップを修正して平地を慣らします。山岳地帯はそのままです。

地形モデル再作成01

修正したグレースケールマップを元に、地形を再作成しました。



◎平野部の頂点を削除する

次はいよいよ頂点数を減らします。作業をやりやすくするため、Y軸を10倍に拡大します。

地形モデル再作成02

この状態から、境界付近の頂点や、地形テクスチャの4隅の頂点を選択から除外し、残りの頂点を削除します。

ちなみに、メタセコイアの「選択部の記憶」は、ファイルを保存して再び開くと無効です。材質を割り当てておいて「現在の材質の頂点・面を選択」で選択状態を戻すことを考えたのですが、地形テクスチャの4隅の頂点だけ残すことができません。

地形モデル再作成03   地形モデル再作成04

結局、4隅の周囲面も残しておいて、後で削除して作り直すことにしました(上左図)。

選択操作や頂点残しが思い通りにならなくて何度もやり直したのですが、平地面を作成してテクスチャマッピングを始めた段階で気付きました。この作業(下左図)を先にやっていれば、地形テクスチャの4隅の頂点を残す必要なかったですね(ーー;

地形モデル再作成05   地形モデル再作成06

モデルが完成しました。(上右図)



◎実装

作ったモデルをXNAで差し替えました。

地形モデル再作成07

うわー何だこりゃ?テクスチャがおかしいのか?でもMeshViewでは正常に表示されたのに…?

結局これはテクスチャマッピングの問題でした。XNAでWrapしない設定で描画しているので、各画像に対応した位置にマッピングし直す必要があったのですね。

地形モデル再作成08

これでテクスチャはOKです。ちなみに地形描画は5.5ms→0.7msと8倍になりました。メチャ軽いッス!^^


これでOKかな?と思ったものの、よく見ると山岳地帯でユニットの高さがズレることがあります。以前はほぼカンペキだったのに、何故?



◎大嘘でした

調査の結果、地形モデル生成時に64×64で作り直したので、253×253の高さマップと不整合が生じたことが原因と判明しました。…あれ?何かヘン??

前回「頂点数を4224→528としたら、5.5ms→0.5msになった」と書きましたが、実は確認ミスによる大嘘で、頂点数は

64009 → 528

でした。グハッ!どうりで10倍も早くなったわけだ(ーー;



◎再検討

頂点数と描画速度をあらためて掲示します。

頂点数:64009、5.5ms(253×253フル方式)
頂点数:2186、0.7ms(65×65平野部削除方式)
頂点数:528、0.5ms(適当に頂点削減方式)

で、今後どうするか改めて検討します。

A案:253×253平野部削除方式(予想2.5ms)

B案:65×65フル方式(予想1.0ms)

C案:65×65平野部削除方式(0.7ms)

A案だと、ビューポート分割時は4回描画するので計10ms。地形描画だけで10msは遅すぎなので不可ですね。一番速いのはC案ですが、今の所B案でも十分なので、平野部起伏付きのB案で再作成します。



◎再実装

グレースケールマップを縮小して地形モデルを再作成しました。

地形モデル再作成09

地形描画速度は予想通り1msなのでOKです。ただ、山がちょっと低いようなので、高さを2倍にしましょう。


地形モデルの高さを2倍にしたら、高さ情報と不整合が生じてしまいました。高さ情報を取得するコンテントパイプラインのプロパティを何度も調整したのですが、どうしても合いません。単純に2倍にしただけなのに、何故?

…実はメインプログラム側のGetHeight()で、高さ情報を返却する前に修正する必要があったのでした。(原因特定に半日かかりました(^^;)

地形モデル再作成10   地形モデル再作成11

通常表示で60fps、分割表示で30fpsになりました。さらに最適化すれば分割表示で60fpsが可能かもしれませんが、現段階ではこれで十分でしょう。



◎余談

ビューポートを左右分割した状態で、スクリーン座標を取得し、その座標を基準にスプライトバッチで絵や文字を表示する場合、グラフィックデバイスのビューポートや右側のビューポートから座標を取得するとズレます。左右いずれに描画する場合も、左側ビューポートから座標を取得すると上手くいきます。

これは恐らく、グラフィックデバイスのビューポートや右側のビューポートがX座標の差分を管理し、さらにスプライトバッチも同様にX座標の差分を管理して、X座標の差分が2度加算されてしまうからだと思います。



◎次回予告

今回は結局 253×253 → 65×65 としただけですが、いざとなったら平原部削除方式が使えることが検証できたので、頑張った甲斐はあったと思います。

地形描画の高速化によりビューポート分割表示が可能となったので、次回から履歴画面の検討に入ります。

スポンサーサイト

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

コメント

コメントの投稿


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

トラックバック


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



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