イベント
[CEDEC 2011]軽くてリアルな人肌を。曲率を利用した反射関数による表面化散乱の表現法
スキンシェーダ,つまり人肌表現に関する研究は,ある程度リアルなキャラクター描画の際には必須となる技術だ。レンダリング技術が実写並みになっており,風景などはすでに実写とCGで見分けが付かないようなものもあるのだが,最後かつ最大の難関が人体表現であることは論を待たないだろう。人間の目は人肌に厳しいのだ。
肌の表現が難しいのは,人体が不透明ではなく,半透明であることに由来する。半透明というのは透明度が低いというだけでなく,内部で光が散乱するという現象を含んだものとなっている。光学的に見ると,入った光が内部で乱反射して表に出てくることで,単なる拡散反射よりも明るく表現される。これは表面化散乱と呼ばれている。
こういった表面化散乱はスキンシェーディングでは,必ず話題に上るものだが,内部からの散乱光をどのようにモデル化して実現するかには,実にさまざまな手法があり,各所でいろいろな実装が試されている。NVIDIAのデモなどでもたまに紹介されているので,なんらかの記事を見たことのある人は少なくないだろう。記事にはしていなかったのだが,今年のGDCではEAによるブラーを使った低負荷な実装などが紹介されていた。
表面化散乱というのは,それなりに計算量が多い分野である。均一な材質であればまだ,よいのだが,手にしても顔にしても皮下には脂肪や骨,筋組織など透過率の違う材質が混在しているので,厳密にやろうとするともの凄く大変なことになる。そのあたりを適切にモデル化しつつ必要最低限の負荷で最大の効果を得ようと,スキンシェーダの実装者はみんな工夫をこらしている。今回の講演の手法は,表面の曲率だけに着目するという非常に大胆なものとなっている。
前置きが大変長くなったが,今回紹介された手法の要点を見てみよう。講演で示された球体の例が非常に分かりやすい。
普通の不透明体による球体に真横から平行光線を当てると,光が当たった側は陰影が付くのだが,半分より向こう側にはまったく光が届かず,真っ暗になる。
半透明な物体だと,光が裏側にまで回り込んでいるかのような状態になる(実際には内部を通過しているのだが)。
こういう見た目の特徴に従って,光を回り込ませる表面化散乱の表現方法がWrap Lightingと呼ばれる手法である。通常,光源と成す角が90度を超えると,裏面ということで光が届かないのだが,90度を超えても光が届くような反射関数を使用する。
そして,半径の小さい球ほど透過の影響を受けやすい。
そこで,どれくらい光を回り込ませるかというのを材質と表面の曲率で制御しようというのが,今回のアプローチになる。具体的な式については,以下のスライドで見てほしいのだが,値を決める変数要素が,
光源と法線の成す角度
離散パラメータと曲率の積
に限られる。2つのパラメータで一意に決まる式になることから,2次元でテーブル化してテクスチャに格納してやることで大幅な高速化を実現している。素材などに関係しない部分なので,一つのテーブルを用意しておけばどんな素材にでも使える。
小さい球ほど表面化散乱の影響が大きく出やすいというのは,透過距離に応じて減衰していく光が表に出てきやすいことと,縮尺の問題で散乱している部分の割合が大きくなることに起因していると思われる。物理的に要因はあるわけだが,それを表面の曲率で代替させているところが面白い。透過光の量と曲率には,間違いなく相関は認められるのだが,数学的に関連性を導き出したものではないようだ。あくまで「フェイク」だという。とはいえ有意な近似として使えるなら,それはそれでまったくかまわない。
すでにコーエーテクモゲームスの「戦国無双3 Z」と「真・三國無双6」で採用されており,ほぼすべてのシーンで使用されているという。
かなり軽く,実装も簡単ということで開発者からの評価も高く,全体にリーズナブルな負荷でよい効果を得られているようだ。
ただ,指先や耳たぶなどの細かい部分では効果がはっきり出るものの,それ以外では分かりにくいことなどが課題として挙げられたようだ。引きの状態で戦うことが多く,動きも速い無双系のゲームだとちょっと微妙なのかもしれない。ちなみに,講演ではTeam NINJAのキャラクターを使った画像も出ていたので,こっちのほうに期待してしまうのは私だけではないだろう。
キーワード
(C)TECMO KOEI GAMES CO., LTD. All rights reserved.
(C) TECMO KOEI GAMES CO., LTD. All rights reserved.