LITTLE CLAP ゲーム製作日記 -6ページ目

リトルロード製作中6 テクスチャの透視補正

 テクスチャの透視補正のテストをしました。

 ポリゴンの頂点には、3D空間上の位置を示すXYZ座標のほかにテクスチャの位置を示すUV座標というのがあります。座標は頂点にしかありませんので、ポリゴン内にピクセル単位の描画をするときは何らかの方法で補間しなければなりません。

LITTLE CLAP ゲーム製作日記-リトルロード20090621 テクスチャの透視補正  左図は床用の巨大な正方形ポリゴンにテクスチャを貼った様子です。

 上側はストレートな線形補間で埋めています。透視投影では遠くのものほど小さく見えるはずですが、縦方向のUVが均一になってしまい不自然です。たくさんの床ポリゴンを配置してスクロールしてみるともっと不自然に見えます。
 対して下側は透視補正が適用されています。UV座標の透視補正は以下の手順で行います。
  • Z座標の逆数を求める(_Zとする)
  • U座標、V座標に_Zを乗算する(_U、_Vとする)
  • _Z、_U、_Vについて線形補間を行う
  • _U、_Vを_Zで割ったものを、ピクセルのUV座標とする
 ピクセル単位の処理に除算が入ってしまうのが悩みどころです。また、ピクセル単位の処理は原則32ビット整数で行うため、オーバーフローやゼロ除算が発生しないよう注意しながらのコーディングを強いられます。
 今回のゲーム製作では背景のみにテクスチャ透視補正を使用します。また、背景に使用するポリゴンの角度を限定することで、除算はピクセル単位ではなくスキャンライン単位にしか使用しないように調整します。YZ平面に垂直なポリゴン(横壁)はスキャンラインを縦にする必要があります。

リトルロード製作中5 マップの作成方法

 3Dのマップをどうやって作ればいいのか分かりません……。

 リトルロードの1ステージ分のマップは、横幅10m、奥行き1kmくらいになります。メタセコイアで直接全体マップを作成しようとすると容量が大きくなってしまいますし、なにより面倒すぎます。何らかのマップチップ方式を採用したいのです。
 しかし、2Dのマップチップのように細かい正方形を単位にすると負荷が大きくなってしまいます。だからと言って大きくすると「薄い壁」のようなオブジェクトが配置しにくくなります。単位を可変にすると、今度は隙間なく埋めることが難しくなってしまい、隣り合うマップチップの高さが異なる場合は壁面でつなぎ合わせるのも自動では難しくなります。

 床系と壁系は分けて考えるべきなのかな?頭を抱えてしまっています。

リトルロード製作中4 マップ描画テスト

 マップの描画方法を検討しています。

 キャラクタはポリゴンで描画することになりそうですが、背景も全部普通のポリゴンで描画するのはマシン負荷が高そうです。テクスチャの透視補間をしようと思ったらなおさらです。
 現段階では擬似3Dでどんな表現が可能かをテストしています。


LITTLE CLAP ゲーム製作日記-リトルロード20090620 マップ描画テスト  起伏はあるが裏返りの無い局面を描画する陰面処理の一つとして、手前から順に描画する最大最小法というのを使ってみました。

 左図の描画をするのに私の環境で約2.575ミリ秒かかりました(バッファ消去やデバイス出力は除く)。

 テクスチャを貼ると2倍くらいの負荷になると予想できます。また、このテストではデプスバッファを使用していませんが、後でポリゴンキャラクタを描画するとなるとデプス値も設定しなければなりません。
 最大最小法を使用するスクリーン下半分はバッファ消去をせずいきなり描画することも可能であるなど、なんとかマシン負荷が少なくなるように工夫していきたいです。

素材の自動生成2 岩壁

 岩壁のようなテクスチャを作成してみました。

LITTLE CLAP ゲーム製作日記-フラクタルノイズ 岩壁A  大きさの異なる丸い土砂を大量に落とした様子を再現するつもりで起伏を作成し、左上から照明を当てた様子です。細かい土砂ほど件数が多くなるようにしています。

 ちょっと起伏が大きすぎる感じがしますが、その辺は適用する場所にあわせて調整します。

LITTLE CLAP ゲーム製作日記-フラクタルノイズ 岩壁B  丸い土砂のエッジをぼかさないようにしたものです。円形の縁取りが、まるで何かで引っ掻いた後のように残っています。

LITTLE CLAP ゲーム製作日記-フラクタルノイズ 岩壁C  丸ではなくピラミッド型の土砂を落としたものです。規則正しい構造を持った岩を乱暴に削り取ったような表面になっています。

 ここまでの3つの画像は同じ種の乱数を使用していて、大まかな起伏も揃っているのですが、素材として落としている土砂の形状によって印象の異なる画像が出力されています。

LITTLE CLAP ゲーム製作日記-フラクタルノイズ 岩壁D  光の反射の仕方を変えてギラギラさせてみました。

 何だろうこれ。何か使い道が考えられるのかな……。

 手書きで素材を描くのに自信がないから自動生成に気が行ってしまうわけですが、ゲームに登場するキャラクタは結局手書きで書くわけで。統一感のない画面が出来上がりそうで不安です。

デスクトップ クラッシュ スクリーンセーバー(作成中)

 スクリーンセーバーを作成中です。

 デスクトップを画像としてキャプチャし、それを細かい直方体に貼り付けてバラバラになる様子を映像化してみました。レンダリングにはOpenGLを使用しています。



 上記の動画ではデスクトップが画像として使われていますが、実行ファイルと同じフォルダに画像ファイル(JPEG,GIF,BMP)があった場合はその中からランダムに選択して使用するようになっています。
 現状では崩れ落ちるパターンが1つしかなく、また直方体の大きさ指定などの設定項目もないため、もう少し面白みのあるスクリーンセーバーにしていきたいです。


 ところで、このスクリーンセーバーを動画として撮影するのにちょっと苦労しました。デスクトップの映像をAVI保存するツールを作成して実行してみたのですが、結構マシン負荷が大きくて、実際の速度と録画した動画の速度が全く合いません
 そこで、スクリーンセーバーの動作速度を1/3にし、録画のタイミングも1/3にすることで何とか期待道理の動画にできました。自分の作成したスクリーンセーバーでなかったらお手上げなところです。


 動画をアメーバにアップロードしてみたのですが、さすがにゴチャゴチャした映像ノイズが多く入ってしまうようです。もっと綺麗な映像のまま公開できないのかなぁ。