皮下の散乱はテクスチャ空間でボカして再現する

ところで、逆に考えると、全ての表皮のピクセルがこのRDPに沿って反射するように陰影処理すればリアルな皮下散乱が再現できることになるのではないか。

白色レーザー光を皮膚に照射

右上図が、その光の散乱を直上で観察した結果

ただし、"この理屈"がうまく行くのは、その面に対して垂直に、光を照射し、なおかつ、それを光の入射方向から見ているような状況の時だけだ。

しかし、もし、この条件が使えるならば、この皮下散乱は、表皮ピクセルに対して行った拡散反射の陰影処理結果を、ただこのRDPに沿うように、ボカしてやるだけで実現できることになる。

ならば、「この条件」が使えるような次元でレンダリングしてみようではないか。

ということで考案されたのが、「テクスチャ座標(2D)系を使用したレンダリング」だ。これは簡単に言えば、ピクセル陰影処理(実際のレンダリング)はちゃんとした3D実空間で行うが、その出力(描き出し)は3Dモデルの皮を切り開いて2Dの紙に貼り付けたような座標系(魚拓、あるいは地球の地図のようなイメージ)に対して行うもの。

レンダリング結果を2次元上に展開しこれを前出の測定した散乱結果に沿うように畳み込み計算を行えばいいことになる。畳み込みは実質的にこの測定結果に基づいてブラーを掛けることに相当する

レンダリング結果を切り開いた2D上に描き出す

顔面であればこんな感じになる

概念図上ではここの処理に当たる

それをボカすとこのようになる。これを今度は3D実空間の3Dモデルにテクスチャマッピングする

概念図上ではここの処理に当たる

レンダリングされた結果は3Dパースのついた映像ではなく、まさしく魚拓や地図のような完全な平面の結果になるが、陰影自体はちゃんと3D実空間に沿った結果となっている。

これを、今度は2D座標系で、前出のRDPに沿う形でボカしてやるのだ。これで表皮は皮下散乱した陰影結果となるのだ(問題は残っているがそれは後述)。

このままではただの魚拓画像なので、今度はこれを3Dモデルにちゃんとテクスチャマッピングしてやる。これで皮下散乱したライティングの終了した顔の完成となる。

ただし、このボカ仕方に工夫が要る。ただ、全体的にぼかすブラー処理ではダメ。

なぜならば、前段で紹介したRDPを見ても分かるように入射光はそのRGB各光によって散乱の仕方が違うから。そこで、異なるボカし幅(ボカし半径)で、RGB各光で異なる減退率でボカして、これを全てリニア合成してやる必要があるのだ。

ただし、残っている問題がある。

ガウスぼかし(ガウスフィルタ)は左右と上下に2回に分けて実装できる。GPU向き

NVIDIAの実装ではブラーは各RGBごとに異なる重みをつけて、ブラー半径を変えて6回行っている

これらを全てリニア合成する

合成結果

RGB各要素でブラーの結果を見てみると赤はディテールが失われブラーが強く、逆に青はブラーの度合いが少なく皮膚の表面上のディテールを多く残す