14.狐火と夏休み その5 メインフィールドの木と草原の実装

さて・・前回のサイトの更新から2か月余り経ちました。今年は年始めからメインフィールドの木と草原の実装のためのコードの改良をしていました。とりあえずコードの方はひと段落ついたようなのでここまでの進捗をまとめてサイトにアップすることにしました。

これまでの住宅のオブジェクトを配置することと、木や草原を配置することに何の違いがあるのだ?と聞かれますと、まず配置するオブジェクトがこれまでの単一のオリジナルモデルではなく、フィールド内に沢山のオブジェクトを配置するためのコピーオブジェクトであることが違います。例えば木一本一本に対してモデルをロードして配置するとなると森を表現するために同じモデルのリソースを何百本も確保することになり、あっという間にGPUのVRAMを使い果たしてしまいます。同じモデルを描画するのならば一本の木だけをロードして、位置・スケール・回転角度を変えたオブジェクトを使いまわせばテクスチャリソースの大幅な節約になります。

もう一つ技術的なテクニックがありまして、例えば草原を表現するために草のモデルを1万本配置したとします。今までのコードであれば1フレーム描画するために1万回のドローコールを呼ぶ仕様になっているためフレームレートが大幅に減少します。この問題を解決するためにネットで調べたところ、1回のドローコールで位置やスケールなどのパラメータの異なる一つのオブジェクトを1万本まとめて描画できるGPUインスタンシングという技術があることを知りました。今回草原を実装するために茶エンジンでもこの機能を実装しました。

・・と、こういう訳でして、去年にサイトにアップしたコードからだいぶ改良されています。






さて・・コードの方は何とか落ち着きましたが、実際に草原を実装したテスト結果をご報告します。

今回のテストでは草のポリゴン数は全部で100万ポリゴン以上あると思います。動かしてみたところ、私のデスクトップ環境では60fpsの実現はかなり無理がありました(15fpsくらい?)。汎用ノートPCの方では更に動作が厳しくてとても実用レベルにはなっていないと思います。GPUがGTX960(VRAM 2G)でして、ChatGPTに聞いてみたところこのGPUで60FPSを実現するためにはポリゴン数を全部で100万ポリゴン以内に収めるのが適切だとの回答でした。

・・という訳でして、結局GPUのスペック不足ということになりそうです。市販のゲーム機のスペックがどの程度なのか調べてみたところ、任天堂switchのゼルダが100万~150万ポリゴンくらいで30fps固定だそうです。PS5くらいになると数千万ポリゴンは当たり前になるそうですが・・。GTX960は任天堂switchより少しスペックは上みたいですが、PS4よりは性能が少し劣るくらいだそうです。

今後のゲ制作の方針ですが、おそらくゲームがある程度形になるまでは5年くらいかかりそうなので、その頃には世の中のPCのスペックも大分上がっていて現在のRTX3060くらいの描画能力は普通になるかなー・・と想定しているので現状のPCのスペック不足はあまり気にせずガンガン作り込んでいこうか・・と思っています。数年後に制作用のPCを新調するかも知れません。







次に、今回アップロードしたModelStampToolの使い方を説明します。

住宅などのオリジナルモデルと木や草原のコピーオブジェクトを区別するためのパラメータはMDFファイルのCOPYで設定します。COPY:0あるいは設定なしの場合単一のオリジナルモデルになります。住宅などフィールド内に一つだけしかないオブジェクトは0で設定すると良いと思います。COPY:1の場合コピーオブジェクトとみなされます。

木や草原などを独自のシェーダで描画したい場合はListNumber:パラメータで別のリストに分けて配置すると良いと思います。リスト毎に単一のパイプライン(シェーダ)を設定すれば、それぞれのリストのコピーオブジェクトをGPUインスタンシングにより一括で描画できます。今回のデモアプリでは木の葉っぱと木の幹を分けて葉っぱはListNumber:4で風の揺らぎシェーダを使い、幹に関してはListNumber:0で通常の描画をしています。草はListNumber:5に配置したオブジェクトを別のパイプラインで描画して草の揺れを描画しています。現在の仕様ですと処理の高速化のためにListNumber:0のオブジェクトのみ当たり判定処理を行っています。

自分で作ったオブジェクトをフィールドに配置したい場合は各自でMDFファイルを作成する必要があります。ただのテキストファイルなので他のMDFファイルを参考にすれば書き方は簡単に分かると思います。ModelStampToolの役目はgridfileフォルダ内にテキストを追加するだけなのでアプリを終了した後にgridfile、modelフォルダをデモアプリのフォルダにコピーすればそのまま反映されます。ModelStampToolのシェーダは単純なディフューズ描画だけしか実装されていないのでデモアプリの方を改良して独自のパイプラインやシェーダを追加すると良いと思います。





今回のアプリのダウンロードは以下から。
現在のアプリの進捗だけ確認したい人はkitunebi1.0.8(exe).zipのみダウンロードすればOKです。コードを利用・確認したい、ソースからコンパイルしたい人はKitunebi1.0.8SourceとKitunebiToolsSourceをダウンロードしてください。デモアプリやModelStampToolで使われている茶エンジンのライブラリやModelViewerのソースなど、必要なファイルは全て揃っていると思います。

ちなみに作者の創作環境はマルウェアまみれなのでウィルスチェックなどのセキュリティに関しては各自でご対応願います。


Kitunebi1.0.8[exe]2025/03/06download
ModelViewer1.57.2[exe]2025/03/06download
ModelStampTool1.0.3[exe]2025/03/06download
Kitunebi1.0.8 Source[source]2025/03/06download
KitunebiToolsSource[source]2025/03/06download







さて・・今度こそコードの方は落ち着いたと思いますので3月以降はフィールド作成に着手していきます。まずは1か月(数か月?)かけて地面のモデルを再整備したいと思います。木々や草原などのモデル作成や配置はそれ以降になると思います。今年1年でどこまで進むかなあ・・。






© 2018 Chafumi Touji