
15.狐火と夏休み その6 スプラットマップによるフィールド描画の実装
前回のサイト更新から3か月余り経ちました。この3か月はモデル配置の下準備としてフィールドの大幅な修正を行うことにしました。
まず前回までのフィールドのポリゴンがだいぶ粗く感じたのでモデルをより細分化し、ポリゴンを滑らかにしました。この作業で3月から4月までの1ヶ月を丸々費やしました。その作業が終わった後、地表のテクスチャをもっと綺麗に修正したいなあ・・と思って解決策をChatGPTに聞いてみたところ、最近のオープンワールドのゲームではスプラットマップという技術が一般的に使われていて、この技術を使えばだいぶ見栄えのいいフィールドの表現ができそうだと分かりました。
「スプラットマップとは?」
スプラットマップとは草や土、道路などのそれぞれのテクスチャを別途用意しておき、スプラットマップというテクスチャ画像のR,G,B,Aの各パラメータをR="土"、G="草"、B="道路"などのテクスチャに割り当てて、マップの各色の強度をアルファ値として使用して草・土・道路などのテクスチャを合成して描画する方法です。
この技術の何が優れているのかと言いますと、土や草などのテクスチャはそれぞれタイルをリピートしてフィールド一杯に描画されているため、画像を凝縮して表示することで描画の解像度を上げることができるということです。今まで2048pxの解像度で描画されていた1枚のテクスチャに対して、草や土のテクスチャを半分のサイズに凝縮して縦横2回リピート描画すればレンダリング時の解像度は倍になる訳です。また、フィールドの雰囲気を変えたい場合は割り当てるテクスチャの土や草のオリジナルテクスチャをすり替えればそれだけの手間でフィールド全体が書き換わります。
・・と、めっちゃ効果的な技術なので茶エンジンでもこの技術を採用してフィールド全体を一新することにしました。4月から6月頭までの丸々2か月間はフィールドのスプラットマップの色を塗り分ける作業に費やしてしまいました。
まず前回までのフィールドのポリゴンがだいぶ粗く感じたのでモデルをより細分化し、ポリゴンを滑らかにしました。この作業で3月から4月までの1ヶ月を丸々費やしました。その作業が終わった後、地表のテクスチャをもっと綺麗に修正したいなあ・・と思って解決策をChatGPTに聞いてみたところ、最近のオープンワールドのゲームではスプラットマップという技術が一般的に使われていて、この技術を使えばだいぶ見栄えのいいフィールドの表現ができそうだと分かりました。
「スプラットマップとは?」
スプラットマップとは草や土、道路などのそれぞれのテクスチャを別途用意しておき、スプラットマップというテクスチャ画像のR,G,B,Aの各パラメータをR="土"、G="草"、B="道路"などのテクスチャに割り当てて、マップの各色の強度をアルファ値として使用して草・土・道路などのテクスチャを合成して描画する方法です。
この技術の何が優れているのかと言いますと、土や草などのテクスチャはそれぞれタイルをリピートしてフィールド一杯に描画されているため、画像を凝縮して表示することで描画の解像度を上げることができるということです。今まで2048pxの解像度で描画されていた1枚のテクスチャに対して、草や土のテクスチャを半分のサイズに凝縮して縦横2回リピート描画すればレンダリング時の解像度は倍になる訳です。また、フィールドの雰囲気を変えたい場合は割り当てるテクスチャの土や草のオリジナルテクスチャをすり替えればそれだけの手間でフィールド全体が書き換わります。
・・と、めっちゃ効果的な技術なので茶エンジンでもこの技術を採用してフィールド全体を一新することにしました。4月から6月頭までの丸々2か月間はフィールドのスプラットマップの色を塗り分ける作業に費やしてしまいました。
・・と、こういう訳で茶エンジンにスプラットマップを組み込むことは決定したのですが、それに伴いコードの大きな修正が加わることとなりました。
まず、前提としてBlenderではメッシュ一つに対してマテリアル(テクスチャ)を一つしか設定できない!という制約があります。Blender内で完結する作品であればシェーダを組み合わせていくらでもテクスチャを合成できるのですが、茶エンジンで適用できるColladaフォーマットで書き出せるデータは非常にシンプルな構造に限られています。
BlenderからColladaフォーマットで書き出せる部分は、
①モデルに割り当てられたマテリアルは複数個含めて全て書き出せる
②メッシュに適用されるマテリアルはそのうちの1つだけ
という条件になります。スプラットマップとして利用するマテリアルのテクスチャはRGBの3要素からなるjpeg画像を採用したので割り当てられるテクスチャはjpeg1枚分の3種類だけ・・ということになります。流石に3枚のテクスチャのみでフィールドを表現することは不可能なのでどうしても複数枚のスプラットマップを適用できるようにしないといけない。・・という訳で、茶エンジンの方で強引に複数枚のスプラットマップが使えるように改造しました。
そのため、スプラットマップを適用する際にはこれまでの通常のモデル描画とは異なる使い方になります。まず、通常のモデル描画とスプラットマップ描画の区別をつけるため、ModelViewerにTextureOverlayという項目を追加しました。
このチェックボックスをクリックすると何が起きるかというと、メッシュの描画時にマテリアルのテクスチャを強引に重ねて描画します。↑の①の条件で、モデルに割り当てられたマテリアルは複数個全てColladaファイルに書き出せる・・ので、そのマテリアルのテクスチャを全て重ねて描画します。このチェックボックスがチェックされた状態でモデルを書き出すとスプラットマップ用のモデルが書き出されることになります。
通常のモデルとスプラットマップ用のモデルとファイルの何が違うのかというと、パラメータがいくつか追加されて記述される部分が違います。まず、
/////////////////////////// splat map //////////////////////////
< SPLAT_MAP_COUNT > num
< SPLAT_MAP_TEXTURE_LAYOUT > num
という行が加わります。更にジオメトリのデータ内に
< IS_SPLAT_MAP_LAYOUT >
< SPLAT_MAP_DECAL_TEXTURE_NUM > -1
という行が加わります。 < IS_SPLAT_MAP_LAYOUT > と < SLPAT_MAP_DECAL_TEXTURE_NUM > の行を削除するとそのジオメトリは通常のモデルとして描画されます。
さて・・問題はここからです。先ほど複数のマテリアルを重ねて描画する、と書きましたがモデルを書き出す際に各テクスチャがどのような使われ方をするか・・という部分に関しては全く考慮されていませんでした。そのためnumと書かれている数字に関しては全く出鱈目の可能性があるのです。更にSPLAT_MAP_DECAL_TEXTURE_NUMのパラメータが加わっていますが、スプラットマップの他にデカールテクスチャが加わっている可能性があります。これらの数字に関しては手動で修正する必要があります。(デカールテクスチャとはマンホールや道路の白線などスプラットマップの上に重ねて描画する装飾用のテクスチャのことです。)
修正方法を書いておきます。
まず、SPLAT_MAP_COUNTの数字はマテリアルの数を見て、スプラットマップ用のjpeg画像が何枚あるかを確認し、その数を書きます。(サンプルでは2を書く)更にサンプル画像では3枚目がデカール用のpng画像になっているので< SPLAT_MAP_DECAL_TEXTURE_NUM > の番号を2に設定します。(マテリアル0番目から数えて何番目の画像がデカールテクスチャかを指定します。)デカールテクスチャが存在しない場合は-1を設定します。
< SPLAT_MAP_TEXTURE_LAYOUT > はスプラットマップのRGB各要素がどのテクスチャに割り当てられるかを識別するためのIDです。これはシェーダにおいて自由にカスタマイズしてください。
(注 複数スプラットマップが適用されているジオメトリにおいて、選択されているマテリアルがスプラットマップの一番最初のマテリアルであることを確認してください。2番目以降のスプラットマップが割り当てられていると最悪GPUが落ちます。)
まず、前提としてBlenderではメッシュ一つに対してマテリアル(テクスチャ)を一つしか設定できない!という制約があります。Blender内で完結する作品であればシェーダを組み合わせていくらでもテクスチャを合成できるのですが、茶エンジンで適用できるColladaフォーマットで書き出せるデータは非常にシンプルな構造に限られています。
BlenderからColladaフォーマットで書き出せる部分は、
①モデルに割り当てられたマテリアルは複数個含めて全て書き出せる
②メッシュに適用されるマテリアルはそのうちの1つだけ
という条件になります。スプラットマップとして利用するマテリアルのテクスチャはRGBの3要素からなるjpeg画像を採用したので割り当てられるテクスチャはjpeg1枚分の3種類だけ・・ということになります。流石に3枚のテクスチャのみでフィールドを表現することは不可能なのでどうしても複数枚のスプラットマップを適用できるようにしないといけない。・・という訳で、茶エンジンの方で強引に複数枚のスプラットマップが使えるように改造しました。
そのため、スプラットマップを適用する際にはこれまでの通常のモデル描画とは異なる使い方になります。まず、通常のモデル描画とスプラットマップ描画の区別をつけるため、ModelViewerにTextureOverlayという項目を追加しました。
このチェックボックスをクリックすると何が起きるかというと、メッシュの描画時にマテリアルのテクスチャを強引に重ねて描画します。↑の①の条件で、モデルに割り当てられたマテリアルは複数個全てColladaファイルに書き出せる・・ので、そのマテリアルのテクスチャを全て重ねて描画します。このチェックボックスがチェックされた状態でモデルを書き出すとスプラットマップ用のモデルが書き出されることになります。
通常のモデルとスプラットマップ用のモデルとファイルの何が違うのかというと、パラメータがいくつか追加されて記述される部分が違います。まず、
/////////////////////////// splat map //////////////////////////
< SPLAT_MAP_COUNT > num
< SPLAT_MAP_TEXTURE_LAYOUT > num
という行が加わります。更にジオメトリのデータ内に
< IS_SPLAT_MAP_LAYOUT >
< SPLAT_MAP_DECAL_TEXTURE_NUM > -1
という行が加わります。 < IS_SPLAT_MAP_LAYOUT > と < SLPAT_MAP_DECAL_TEXTURE_NUM > の行を削除するとそのジオメトリは通常のモデルとして描画されます。
さて・・問題はここからです。先ほど複数のマテリアルを重ねて描画する、と書きましたがモデルを書き出す際に各テクスチャがどのような使われ方をするか・・という部分に関しては全く考慮されていませんでした。そのため
修正方法を書いておきます。
まず、SPLAT_MAP_COUNTの数字はマテリアルの数を見て、スプラットマップ用のjpeg画像が何枚あるかを確認し、その数を書きます。(サンプルでは2を書く)更にサンプル画像では3枚目がデカール用のpng画像になっているので< SPLAT_MAP_DECAL_TEXTURE_NUM > の番号を2に設定します。(マテリアル0番目から数えて何番目の画像がデカールテクスチャかを指定します。)デカールテクスチャが存在しない場合は-1を設定します。
< SPLAT_MAP_TEXTURE_LAYOUT > はスプラットマップのRGB各要素がどのテクスチャに割り当てられるかを識別するためのIDです。これはシェーダにおいて自由にカスタマイズしてください。
(注 複数スプラットマップが適用されているジオメトリにおいて、選択されているマテリアルがスプラットマップの一番最初のマテリアルであることを確認してください。2番目以降のスプラットマップが割り当てられていると最悪GPUが落ちます。)
スプラットマップのジオメトリと溝やパネルなどのジオメトリをひとまとめにしてモデルを作りたい場合は注意が必要です。
まずBlender上においてそれらのメッシュを一つに結合しないでください。それぞれのモデルを選択し、選択されたオブジェクトのみ書き出しを指定して一つのDAEファイルに書き出します。その後、ModelViewerでTextureOverlayを指定してmdlファイルを書き出します。
次に、溝やパネルなどのジオメトリは通常のモデル描画がしたいので<IS_SPLAT_MAP_LAYOUT >と < SPLAT_MAP_DECAL_TEXTURE_NUM >の行を削除します。マテリアル名を見ればどのジオメトリが何のモデルなのかを判別できると思います。
まずBlender上においてそれらのメッシュを一つに結合しないでください。それぞれのモデルを選択し、選択されたオブジェクトのみ書き出しを指定して一つのDAEファイルに書き出します。その後、ModelViewerでTextureOverlayを指定してmdlファイルを書き出します。
次に、溝やパネルなどのジオメトリは通常のモデル描画がしたいので<IS_SPLAT_MAP_LAYOUT >と < SPLAT_MAP_DECAL_TEXTURE_NUM >の行を削除します。マテリアル名を見ればどのジオメトリが何のモデルなのかを判別できると思います。
・・と、そんなこんなで
なんとかスプラットマップを実装したフィールドが完成しました。今回サイトを更新するまで6月中少し時間があったのでついでにコードの別の機能をいくつか修正しました。修正した部分は
①ミップマップによるモアレの解消
②カスケードシャドウマップの実装
の二つです。前回までのアプリと比べて影の描画や遠くの家のテクスチャのちらつきが抑えられている部分が改良されたと思います。相変わらずGPUのスペック不足で動作が重たいのですが一応動くかと・・。フィールドのロード時にテクスチャがおかしくなるバグがまだ残っているみたいなのですが、追々修正していこうと思います。
なんとかスプラットマップを実装したフィールドが完成しました。今回サイトを更新するまで6月中少し時間があったのでついでにコードの別の機能をいくつか修正しました。修正した部分は
①ミップマップによるモアレの解消
②カスケードシャドウマップの実装
の二つです。前回までのアプリと比べて影の描画や遠くの家のテクスチャのちらつきが抑えられている部分が改良されたと思います。相変わらずGPUのスペック不足で動作が重たいのですが一応動くかと・・。フィールドのロード時にテクスチャがおかしくなるバグがまだ残っているみたいなのですが、追々修正していこうと思います。
今回のアプリのダウンロードは以下から。
現在のアプリの進捗だけ確認したい人はkitunebi1.0.9(exe).zipのみダウンロードすればOKです。ModelViewerとModelStampToolの新しいバージョンはkitunebi1.0.9_Tools(exe).zipに含まれています。 コードを利用・確認したい、ソースからコンパイルしたい人はkitunebi1.0.9_Source.zipをダウンロードしてください。kitunebi1.0.9、ModelViewer1.57.3、ModelStampTool1.0.4とコンパイルに必要なライブラリ等、必要なファイルは全て揃っていると思います。
現在のアプリの進捗だけ確認したい人はkitunebi1.0.9(exe).zipのみダウンロードすればOKです。ModelViewerとModelStampToolの新しいバージョンはkitunebi1.0.9_Tools(exe).zipに含まれています。 コードを利用・確認したい、ソースからコンパイルしたい人はkitunebi1.0.9_Source.zipをダウンロードしてください。kitunebi1.0.9、ModelViewer1.57.3、ModelStampTool1.0.4とコンパイルに必要なライブラリ等、必要なファイルは全て揃っていると思います。
ちなみに作者の創作環境はマルウェアまみれなのでウィルスチェックなどのセキュリティに関しては各自でご対応願います。今年の10月でWin10のサポートが切れるので新しい開発PCを組み直すことも考えるべきいい時期ではあるのですが・・。
Kitunebi1.0.9[exe] | 2025/06/25 | download |
Kitunebi1.0.9Tools[exe] | 2025/06/25 | download |
Kitunebi1.0.9Source[source] | 2025/06/25 | download |
・・という訳で、モデル配置の下準備はほぼ出来上がった状態となりました。今年は残り半分、ひたすらモデル作成とフィールドへの配置の作業が続くと思います。年末までにどこまで仕上がっているかなあ・・。