拡散反射とサブサーフェイス・スキャタリングの関係

下の記事を読んで、レンダリングの勉強をし始めたころに悩んだ拡散反射光とサブサーフェイススキャタリングの違いをとても納得のいく形で説明されてたので、整理を兼ねて書きます。

blogs.unity3d.com

拡散反射光は近似的な考え方であるということ

拡散反射光とは、物体に入射する光のうち、物体の内部に一度入り込み、物体表面から出てくる光のことです。
一度内部に入り込むと通過する過程で物体により一部の波長が弱められるため、拡散反射光には色が付きます。
これが物体固有の色として人間の目に見えます。

f:id:halya_11:20180209000029p:plain:w400

拡散反射光を簡単に計算するためには、単純化のため、ある点に入射した光のうち拡散反射光として出てくるものは同じ点から出てくる、としてしまいます。

f:id:halya_11:20180209000055p:plain:w400

この近似は物理ベースレンダリングでも使われる考え方で、BRDFは拡散反射光がすべて入射地点から出射するとする反射モデルです。
(物理ベースなのに物理的に正しくないじゃん。)

BRDFについては以下の記事がわかりやすいです。

qiita.com

サブサーフェイス・スキャタリングを使う意味

上述の近似は、拡散反射光が入射地点と近い位置から出てくるような状況では、妥当だといえます。

しかし皮膚のような物体では、下記の理由から、違う考え方が必要になってきます。

  • 透明度が高くて光が物体の奥まで届き、その結果拡散反射光の射出位置も広範囲に広がる
  • 物体内部に血管やらなにやらいろんな色をしたものが詰まっているので、射出する光の色が射出位置によって異なる

図にするとこうなります。

f:id:halya_11:20180209000200p:plain:w400

このような状況下では拡散反射の近似的な考え方がとても雑なものとなり、正確な計算結果が得られないため、他の方法を考える必要が出てきます。
それがサブサーフェイス・スキャタリングということです。

まとめると、BRDFのような拡散反射の計算もサブサーフェイス・スキャタリングも拡散反射光を表現する手法であるという点に変わりはないが、
BRDFなどは近似的な考え方を用いているため状況によっては正確なレンダリングができず、
それを補うのがサブサーフェイス・スキャタリングである、ということになります。(長い!)