技術

なんちゃってグローバルイルミネーション

2013-02-14 21.24.13

色の変化に乏しい壁に囲まれているキャラクターひとりだけに対してグローバルイルミネーション(以下GI)を適用するという条件下では、処理を大幅に簡略化出来るのではないかと思ったので実装してみました。
(そんな条件だとグローバルなイルミネーションって言えないような気がするので、あくまでもなんちゃってです。)

処理内容

  • まず壁のテクスチャを読み込むついでに、1×1のミップマップから色を取得して壁毎の平均色として保存しておく。(今回壁は1種類しかないですけどね。)
  • キャラクターの6方向(上下左右前後)にレイを飛ばし、それぞれぶつかった壁の遠さと平均色を取得する。
  • 上で取得した遠さと平均色をvec4x6としてキャラクターの頂点シェーダに送る。
  • キャラクターの頂点シェーダで法線の向きに応じて上下左右前後の色を混合する。また遠い方向ほど色の影響を小さくする。
  • 上で混合した色を、元々のキャラクターの色に加算する。
  • さらにキャラクターを光源としてキャラクター以外のオブジェクトを描画する。(これで相互反射してるように見える!?)

キューブ環境マッピングに近いイメージですが、キューブ環境マッピングがあるベクトルによって上下左右前後のうちどのテクスチャのどのテクセルを採用するか一意に決まるのに対し、この方法ではベクトルのx, y, z各成分毎にどの方向の色を採用するか決定し(つまり常に3面分がブレンドされる)、さらに色の影響をベクトルの各成分の大きさに比例させるようにしています。

2013-02-14 21.25.25左の壁に寄ってるので左の壁の色の影響が強くキャラクターの左側に出ている。

2013-02-14 21.27.00周りに壁が無いと暗くなる。
レイが壁にヒットしなかった時の色の値を工夫するともっと綺麗な見た目に出来るかも。

キャラクターを光源にしてるせいで、普通だと遮蔽されて暗くなる部分に逆にハイライトが出てるのでそのあたりをなんとかしたいです。

コメントを残す

メールアドレスが公開されることはありません。



※画像をクリックして別の画像を表示

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください