ひとことで
肌、蝋、翡翠、牛乳、葉っぱ、大理石のような素材では、光は表面で跳ね返るだけでなく、内部に入り込んで散らばり、少し離れた場所から出てきます。これが表面下散乱(SSS)です。影の境目が柔らかく赤みを帯びる、薄い耳や指が逆光で赤く透ける、ろうそくの上部がぼんやり光る、といった「柔らかさ」や「生っぽさ」の正体です。
ゲームでの使いどころ
- キャラクターの肌:SSS がない肌は、石膏像やプラスチック人形のように硬く見えます。フォトリアルなキャラクターでは必須です。
- 逆光の耳・指・鼻:光源を背にしたキャラクターの耳が赤く透ける表現。
- 植物の葉・花びら:太陽に透ける葉の黄緑色(森の中の木漏れ日)。
- 蝋・石鹸・大理石・翡翠・氷・ゼリー:内部がぼんやり明るい半透明の素材。
- 生き物・モンスター:スライムや半透明の生物の表現。
しくみ
完全に計算するには、内部で何度も散乱する光の経路を追う必要があり、ゲームでは重すぎます。そこでいくつかの近似を組み合わせます。
1. ラップ照明(Wrap Lighting)
通常の拡散反射は で、影の境目で急に暗くなります。光が内部を回り込む分を近似して、境目の先まで光を回り込ませます。
回り込んだ部分に散乱の色(肌なら赤)を付けると、影の境目が柔らかく赤みを帯びます。
2. 厚みによる透過
光源から物体を突き抜けて視線に届く光を、通過する厚み で弱めます(ビール・ランバート則)。
を色ごとに変える(赤は通りやすく、青は通りにくい)と、薄い部分が赤く透けます。厚みは、事前に計算した「厚みマップ」を使うのが一般的です。デモでは、距離場の中を光源の方向へたどって、実際に厚みを測っています。
3. 画面空間での拡散(Screen-Space SSS)
一度描いた肌の照明結果を、画面上で肌の部分だけぼかし、光が内部で広がる様子を再現します。Unreal Engine の Subsurface Profile などで使われる本格的な方法です。
実装のポイント
- 厚みマップを焼く:モデルの各点で内側向きに AO を計算したものを反転すると、おおよその厚みになります。多くのエンジンがこの方法で透過を安く表現します。
- 散乱の色と半径:肌は赤が最も遠くまで散乱します。散乱の半径を色ごとに設定する(赤 > 緑 > 青)のが基本です。
- 法線マップを弱める:散乱で細かい凹凸の陰影はぼやけるので、拡散反射用の法線は細部を弱めた法線を使うとリアルになります。
つまずきやすい点
- 全体がぼやけすぎる:散乱を強くしすぎると、蝋人形のように輪郭や細部が失われます。
- 厚みマップは視点や変形に弱い:事前に焼いた厚みは、キャラクターが大きく変形すると合わなくなります。
- 影との組み合わせ:影の中にある部分は透過も弱めないと、壁の向こうの光で耳が光るといった不自然さが出ます。
デモで試すこと
- 「表現」を「表面の反射のみ」にすると、うさぎは石膏像のように硬く見え、後ろの光が当たっても耳は暗いままです。
- 「厚みで透過」にすると、耳のように薄い部分だけが裏からの光で赤く透けます。厚い胴体はほとんど透けません。
- 「ラップ照明」では、影の境目がほんのり赤く、柔らかくなります。
- 「内部の濃さ」を上げると光が内部で弱まり、ごく薄い耳の縁しか透けなくなります。素材を翡翠にすると、緑色に透けます。