皮下の光散乱をどう取り扱うべきか

それでは残りの94%、皮下の散乱についてはどうするのか。これについては脂質層での反射とは全く異なる方法のアプローチをとる必要がある。

光が皮下でどういうふうに伝搬したかに配慮しなければならず、それを一意的に求めるのは困難だ。今描画しようとしている肌のピクセルは他の位置から入射した光の散乱光を含んでいるかもしれないし、逆にここに入射している光が吸収されている影響も考えなければならない。まともに取り合っていてはリアルタイムに計算することはまず無理だ。

そこで、この難しい計算を簡略近似化するアプローチを考える。

まず「光が散乱して再び出てくるまでの平均距離はどのくらいなのか」「光が吸収されてしまう平均頻度はどれくらいなのか」ということだけに着目することにする。

ところで、入射光の約10%は、実は最初の脂質層を突破するものの、この時点で光の指向性は失われて拡散光となってしまう。なお、それ以外の光は、前述したようなKS BRDFとフレネル反射を考慮した反射光だったり、あるいは脂質を抜けて表皮に到達した時点までに吸収されてしまう。

つまり、この脂質を抜けてきた10%の拡散光について皮下散乱を考えればよいことになる。だったら、これは、単純に入射光に対して拡散反射の陰影処理を行って画像の皮膚テクスチャと乗算して、前述のKS BRDF+フレネル反射の結果と合成するだけでよいのではないか。

実は、これに相当する実装をやったのが前節のハーフライフ2の肌の表現になる。

これでも、まあいいのだが、ただ、かなり乾いた感じに見えてしまう。

KS BRDF+フレネル反射の結果 + 拡散反射×画像テクスチャだとこうなる。これは実はハーフライフ2式スキンシェーダとほぼ同じ。若干乾いた感じに見えてしまう

この乾いた感じになってしまうのはよく考えると当たり前のことだ。

あるピクセルに着目して、ここから出てくる拡散光はそのピクセルに入射した光が拡散したものだけではない。隣接する他のピクセルに入射した光が皮膚内で散乱して出てきた(出射してきた)拡散光も含まれるからだ。

そう、これが皮膚のしっとりとした透明感表現と深い関係があるのだ。ではどうすればいいのか。

NVIDIAが引用したのはCraig DonnerとHenrik WannらがSIGGRAPH 2005で発表した「Light Diffusion in Multi-Layered Translucent Materials」という論文の方法だ。

この論文では「三層の皮膚モデル」という概念を採用し、医療業界、光学系業界で測定された散乱パラメータを用い、3Dモデルのデジタイズサービス企業であるXYZRGB社の高精度頭部モデルを活用して、数分のレンダリング時間でリアルな顔をレンダリングする技術を発表していた。

NVIDIAがこの論文で着目した点は、皮膚の光散乱は単層ではなく複数層として処理した方がリアルに見えるという部分だ。

単層の光散乱は大理石や蝋のようなものの表現ではそれなりに効果が高いのだが、異なる散乱パラメータを持った複数層からなる材質については結果があまり芳しくない。人間の皮膚は前出の断面図を見ても分かるように脂質層、表皮層、真皮層の三層からなる。これにより深く浸透した光は減退しながらも広範囲に散乱する傾向がある。これが皮膚のリアルな光散乱表現の重大なポイントとなっている……とNVIDIAは睨んだわけだ。(続く)

左が単層の皮膚モデルでレンダリングした結果。右が三層の皮膚モデルでレンダリングした結果。左はやや蝋人形のように見えてしまっている

(トライゼット西川善司)