突然ですが皆さんMinecraftは好きですか?ニックさんです。僕はMinecraftは大好きです。
圧倒的な自由度や無限に生成されるゲームフィールド、何でも破壊・設置可能なシステム、
Minecraftが世界中のゲームプレイヤーやゲームエンジニアに与えた影響はすさまじい物があるでしょう。
ちなみにMinecraftについてのレビュー記事が4gamerに良くまとまっています。

結局のところ「Minecraft」とは何だったのか?(リンク先:4gamer.net)


今日のブログの内容は、Minecraftみたいなサンドボックス型ゲームいいよね!ってことで僕が作っている
サンドボックス型の2Dオープンワールドゲームのご紹介をします。
特に今日はレンダリング回りについて話そうと思います。


いくらMinecraftのようなゲームが良いよね!って言っても同じように作ればただのパクりです。
ただのパクリも面白いんですが、Minecraftライクなゲームは世の中に溢れているので、
どうせならもっと違ったことがやりたいなぁ~と思っていたところに15さはら君に教えてもらった技術が
記事タイトルにもあるDistanceFieldです。(さはら君ありがとう)

DistanceFieldとは剛体までの最短距離を敷き詰めたスカラー値のグリッドのことで、
これとバイリニア補間を併用すれ線形近似をした連続空間を構成可能です。
まずはその利用例を見てみましょう。
DistanceField

左の図は壁までの距離を0~1のグレイスケールで表示した図です。グリッド上なのでカクカクしてますね。
右の図は左の図をフラグメントシェーダーを用いてバイリニア補間したものです。
結構滑らかにつながっている事がお分かりでしょうか?

またDistanceFieldは壁までの距離や法線ベクトルも高速に取得できます。
当たり判定も比較的簡単に少ない計算量で行えるので流体のシミュレーションなどでよく使われるそうです。
DistanceField2

もちろんゲームにも使われていて、例をとしてUnrealEngineでのアンビエントオクルージョンや、
G-Games制作のThe Tomorrow Childrenでも利用されているようです。


さて、今回のゲームは2Dで見下ろし型のサンドボックス型ゲームです。
DistanceFieldは有用な技術ですが、単一種類のオブジェクトの距離しか扱えないため、
Minecraftのように「岩」「土」「レンガ」などの種類を持たせることが出来ません。
そこで私が勝手に考えたのがColoredDistanceFieldという技術です。
ColoredDistanceFieldは単純で、グリッドに浮動小数点である距離値の他に、
オブジェクト情報である「Color」として整数型の値も埋め込みます。
ColoredDistanceField

この図の一番右の画像がColoredDistanceFieldを利用して描画された図です。
三色の色情報を埋め込んで、その境界付近は適当にグリッド間で線形補間することで合成しています。
これによって距離情報を埋め込んだ浮動小数点テクスチャと種類情報を埋め込んだ整数型テクスチャを
フラグメントシェーダに渡すだけでシェーダー側からたくさんの種類のオブジェクトを描き分けることが出来ます。
やったぜ。


以上の技術を使って描画されたゲーム画面がこちらです。
GameField

実際はテクスチャに埋め込んだ離散化された情報だけを持っているのですが、
線形補間でもそれっぽく見えるものですね。


ちなみにこの画面を出力するまでの描画パスは次のとおりです。
RenderGameField

ColoredDistanceFieldの情報を使ってベースカラーマップやら法線マップやらを先に出力して、
そこからシャドウマップやらフォンシェーディングやらで遅延レンダリングしています。
DistanceFieldを使うと嬉しいのが、距離情報が簡単に取れるのでアンビエントオクルージョンもすぐ出来ます。
嬉しい!


そしてDistanceFieldの特徴として、オブジェクトを変形するときは変形範囲のみ
グリッドの値を書き換えれば良いのでゲーム中フィールドの破壊や創造も簡単です。

anime
もりもり岩肌を削れていますね。動的に影やシェーディングがなされているとこにも注目!


現状製作出来ているものはこんな感じです。
来週9/13(日)に開催されるGAME^3というイベントに出展するので興味がある方は是非見に来てください。
Bitbucketにもソースを上げているので中身が気になる方はこちらもどうぞ。

工大祭に間に合うと良いですね。あと研究も進めば良いですね。