実は前々から球面調和関数によるGI(Irradiance Environment Mapping)の
コードを実装させていたのですが…バグが多くてお蔵入りしていたものが今回ようやく
人にお見せ出来る形になったのでさっそく動画にしてみました。
普段なら球面調和関数について…とここで解説を入れたいところですが。。実装しておきな
がら自分でもあまりよく分かっていない部分が多いんですよね;ものすごく大雑把に説明
してみますが、球面調和関数というのはフーリエ変換と似たようなもので、単純な成分の
組み合わせで複雑なデータを表現できるというやつです。自分のプログラムでは2次の
球面調和関数の成分までで計算しているため、細かいGIは表現出来ませんが2次までの
計算なら4x4の行列に球面調和ライティングのイラディアンスを格納できるため、シェーダ
から行列計算でライティングが出来てしまいます。
またイラディアンスをどういう形で保持しておくかは、通常はシーン全体のボクセルに持た
せるのが普通だと思いますが、自分のプログラムでは地面の各頂点ごとに持たせました。
描画する場合はキャラクターの位置の地面のポリゴンの3頂点からイラディアンスを求めて
シェーダに転送する、といった感じです。
ただこの手法だと地面のポリゴンが荒いと上の画像のように不自然な感じになります。
上の画像のキャラクターは花の赤色の影響を受けていますが、花は後ろにあるのにキャラ
クターの正面に影響を与えているので、これはちょっと不自然です。…まぁこれはポリゴンを
細かく分割すれば済む話なので問題無し、でいいかな。
個人的に球面調和関数はスキンメッシュの自前実装と同じ位難しかったでした。技術的に
難しいことをしている上に詳しい説明の資料が乏しいので、かなりてんてこ舞いでした笑。