

表面下散乱(SSS)、別名表面下光輸送(SSLT)[ 1 ]は、半透明物体の表面を透過した光が物質と相互作用して散乱し、異なる地点から表面から出る可能性がある光輸送のメカニズムです。光は一般的に表面を透過し、物質内部で不規則な角度で何度も散乱された後、表面から直接反射された場合とは異なる角度で物質から出ていきます。
表面下散乱は、リアルな3Dコンピュータグラフィックスにおいて重要であり、大理石、肌、葉、蝋、牛乳などの素材をレンダリングするために不可欠です。表面下散乱が実装されていない場合、素材はプラスチックや金属のように不自然に見える可能性があります。

レンダリング効率を向上させるため、多くのリアルタイムコンピュータグラフィックスアルゴリズムは、オブジェクトの表面での反射率のみを計算します。実際には、多くの材料はわずかに半透明です。光は表面に入射し、吸収、散乱、そして場合によっては別の場所で再放出されます。皮膚はその良い例です。反射率の約6%だけが直接反射で、94%は表面下の散乱によるものです。[ 2 ]半透明材料の固有の特性は吸収です。光が材料を通過する距離が長くなるほど、吸収される割合が大きくなります。この効果をシミュレートするには、光が材料を通過した距離の測定値を取得する必要があります。


ピクサーが発表したこの技術は、最先端の技術とみなされており、通常はパス トレーシング レンダラーに統合されています。これは基本的に、マテリアル内で光路をトレースし、反転した法線の周りにランバート分布を使用して新しいパスを生成し、複数のステップで新しい方向を選択して光路をさらに散乱させることで、実際の光子に何が起こるかをシミュレートします。これが「ランダム ウォーク」という名前の由来です。等方性散乱は、球面に沿って均等にランダムな方向を選択することによってシミュレートされます。異方性散乱は通常、ヘニー・グリーンスタイン位相関数を使用してシミュレートされます。たとえば、人間の皮膚は異方性散乱を示します。光学的深さ/吸収は、ビア・ランバートの法則を使用してパスの長さに基づいて適用されます。パスは、寄与の最小しきい値または最大反復回数に達すると、マテリアル内で終了する場合があります。パス(光線)が再び表面に当たると、従来のパス トレーサーと同様に、ランバート分布で重み付けされたシーンからの放射輝度を収集するために使用されます。この手法は直感的で、薄い形状にも強い耐性を持つ。

この距離を推定する1つの方法は、シャドウマッピングと同様の方法で深度マップを使用することです[ 3 ]。シーンは光源の視点から深度マップにレンダリングされ、最も近いサーフェスまでの距離が保存されます。次に、深度マップは標準的な投影テクスチャマッピングを使用して投影され、シーンが再レンダリングされます。このパスで、特定の点をシェーディングするときに、光線がサーフェスに入った点の光源からの距離は、単純なテクスチャルックアップによって取得できます。この値を光線がオブジェクトから出た点から差し引くことで、光がオブジェクトを通過した距離の推定値を取得できます。
この方法で得られる距離の測定値は、さまざまな用途に利用できます。その一つとして、距離に応じて指数関数的に減衰するアーティスト作成の1次元テクスチャに直接インデックスとして使用することができます。このアプローチを他のより伝統的な照明モデルと組み合わせることで、大理石、翡翠、蝋などのさまざまな素材を作成できます。
モデルが凸型でない場合、問題が発生する可能性がありますが、深度剥離[ 4 ]を使用することでこの問題を回避できます。同様に、深度剥離は、骨や筋肉など、表面下のさまざまな密度を考慮するために使用でき、より正確な散乱モデルを得ることができます。
右側の蝋人形の画像からもわかるように、この手法では光が物体を通過する際に拡散せず、背面の特徴がはっきりと写っています。この問題を解決するには、深度マップの表面上の異なる地点で複数のサンプルを取得する方法があります。あるいは、テクスチャ空間拡散と呼ばれる別の近似手法を用いることもできます。
このセクションの冒頭で述べたように、表面下散乱の最も明白な効果の 1 つは、拡散光の全体的なぼやけです。拡散関数を任意に変更するのではなく、テクスチャ空間でそれをシミュレートすることで、拡散をより正確にモデル化できます。この技術は、 『マトリックス リローデッド』[ 5 ]の顔のレンダリングで先駆的に使用されましたが、リアルタイム レンダリング技術の分野でも使用されています。
このメソッドでは、まず元の頂点座標に基づいて照明を計算し、頂点シェーダーを使用してオブジェクトのメッシュを展開します。次に、頂点は、UVテクスチャ座標を頂点のスクリーン位置として使用して再マッピングされ、テクスチャ座標の [0, 1] の範囲から正規化されたデバイス座標の [-1, 1] の範囲に適切に変換されます。このように展開されたメッシュに照明を当てると、オブジェクトの照明を表す 2D 画像が得られ、これを処理してライト マップとしてモデルに再適用できます。拡散をシミュレートするには、ライト マップ テクスチャを単純にぼかすことができます。照明を低解像度のテクスチャにレンダリングするだけで、ある程度のぼかしが得られます。皮膚の表面下散乱を正確にモデル化するために必要なぼかしの量はまだ活発に研究されていますが、単一のぼかしだけを実行すると、真の効果を適切にモデル化できません。[ 6 ]拡散の波長依存性をエミュレートするには、(ガウス) ぼかし中に使用されるサンプルをチャネルごとに重み付けできます。これはある意味、芸術的なプロセスと言えるでしょう。人間の皮膚の場合、最も散乱が大きいのは赤色で、次に緑色、そして青色は散乱が非常に小さいです。
この方法の大きな利点は、画面解像度に依存しないことです。シェーディングは、オブジェクトのすべてのピクセルではなく、テクスチャマップのテクセルごとに一度だけ実行されます。したがって、当然ながら、オブジェクトのUVマッピングが良好であることが求められます。つまり、テクスチャ上の各点がオブジェクトの1つの点にのみマッピングされる必要があります。さらに、テクスチャ空間拡散を使用することで、ソフトシャドウを実現する要因の1つとなり、シャドウマッピングのリアリズム不足の一因を軽減できます。