質感・ライティング

表面下散乱

Subsurface Scattering / SSS

内部へ入って散る光で肌や蝋を表す。

6 / 10

インタラクティブデモ

デモを準備しています…

表面下散乱

ドラッグで視点を回転、Ctrl(⌘)+ スクロールでズーム。タッチ操作は 2 本指です。

ひとことで

肌、蝋、翡翠、牛乳、葉っぱ、大理石のような素材では、光は表面で跳ね返るだけでなく、内部に入り込んで散らばり、少し離れた場所から出てきます。これが表面下散乱(SSS)です。影の境目が柔らかく赤みを帯びる、薄い耳や指が逆光で赤く透ける、ろうそくの上部がぼんやり光る、といった「柔らかさ」や「生っぽさ」の正体です。

ゲームでの使いどころ

  • キャラクターの肌:SSS がない肌は、石膏像やプラスチック人形のように硬く見えます。フォトリアルなキャラクターでは必須です。
  • 逆光の耳・指・鼻:光源を背にしたキャラクターの耳が赤く透ける表現。
  • 植物の葉・花びら:太陽に透ける葉の黄緑色(森の中の木漏れ日)。
  • 蝋・石鹸・大理石・翡翠・氷・ゼリー:内部がぼんやり明るい半透明の素材。
  • 生き物・モンスター:スライムや半透明の生物の表現。

しくみ

完全に計算するには、内部で何度も散乱する光の経路を追う必要があり、ゲームでは重すぎます。そこでいくつかの近似を組み合わせます。

1. ラップ照明(Wrap Lighting)

通常の拡散反射は max⁡(n⋅l,0)\max(\mathbf{n}\cdot\mathbf{l}, 0) で、影の境目で急に暗くなります。光が内部を回り込む分を近似して、境目の先まで光を回り込ませます。

wrap=max⁡ ⁣(n⋅l+w1+w, 0)\text{wrap} = \max\!\left(\frac{\mathbf{n}\cdot\mathbf{l} + w}{1 + w},\ 0\right)

回り込んだ部分に散乱の色(肌なら赤)を付けると、影の境目が柔らかく赤みを帯びます。

2. 厚みによる透過

光源から物体を突き抜けて視線に届く光を、通過する厚み dd で弱めます(ビール・ランバート則)。

T=e−σdT = e^{-\sigma d}

σ\sigma を色ごとに変える(赤は通りやすく、青は通りにくい)と、薄い部分が赤く透けます。厚みは、事前に計算した「厚みマップ」を使うのが一般的です。デモでは、距離場の中を光源の方向へたどって、実際に厚みを測っています。

3. 画面空間での拡散(Screen-Space SSS)

一度描いた肌の照明結果を、画面上で肌の部分だけぼかし、光が内部で広がる様子を再現します。Unreal Engine の Subsurface Profile などで使われる本格的な方法です。

実装のポイント

  • 厚みマップを焼く:モデルの各点で内側向きに AO を計算したものを反転すると、おおよその厚みになります。多くのエンジンがこの方法で透過を安く表現します。
  • 散乱の色と半径:肌は赤が最も遠くまで散乱します。散乱の半径を色ごとに設定する(赤 > 緑 > 青)のが基本です。
  • 法線マップを弱める:散乱で細かい凹凸の陰影はぼやけるので、拡散反射用の法線は細部を弱めた法線を使うとリアルになります。

つまずきやすい点

  • 全体がぼやけすぎる:散乱を強くしすぎると、蝋人形のように輪郭や細部が失われます。
  • 厚みマップは視点や変形に弱い:事前に焼いた厚みは、キャラクターが大きく変形すると合わなくなります。
  • 影との組み合わせ:影の中にある部分は透過も弱めないと、壁の向こうの光で耳が光るといった不自然さが出ます。

デモで試すこと

  1. 「表現」を「表面の反射のみ」にすると、うさぎは石膏像のように硬く見え、後ろの光が当たっても耳は暗いままです。
  2. 「厚みで透過」にすると、耳のように薄い部分だけが裏からの光で赤く透けます。厚い胴体はほとんど透けません。
  3. 「ラップ照明」では、影の境目がほんのり赤く、柔らかくなります。
  4. 「内部の濃さ」を上げると光が内部で弱まり、ごく薄い耳の縁しか透けなくなります。素材を翡翠にすると、緑色に透けます。

参考資料

Filament Material System ↗

分野全体の資料で、この項目を直接扱っているとは限りません。