リアルタイム物理ベースレンダリング下調べ

※この記事は、レイトレ合宿3のアドベントカレンダー用に書きました。https://sites.google.com/site/raytracingcamp3/
こんにちは。レイトレ好き、CG好きな諸兄におかれましてはレイを飛ばすことに精進されているかと存じます。今回はレイトレではなくリアルタイムCGの話題で恐縮ですが、リアルタイムにおける物理ベースレンダリングとはどんなものなのか調べました。

物理ベースレンダリングとは、ざっくり下記のことです。

物理ベースレンダリング = シェーディングモデル + ライティングモデル (+ アンチエイリアス/ポスプロ + リニアワークフロー)

シェーディングモデル

シェーディングモデル = ディフューズ + スペキュラ

ディフューズ、スペキュラともエネルギー保存則を満たすBRDFが使用されます。

ディフューズ
ディフューズ = ランバートモデルを採用


ディフューズのモデルにはランバートの他に、マイクロファセットに基づいたオーレン・ネイヤーというのが有名でより良い結果が出るようですが、Unreal Engineシリコンスタジオの資料でも、今の所ランバートでいいよね、みたいな結論になっている雰囲気です。さらに、特に静的なオブジェクトには予めベイクしたライトマップを使うことも多いです。

スペキュラ
スペキュラ = クック・トランスモデルを採用

どの資料でも出てくるスペキュラ反射モデルのクック・トランスの式です。

クック・トランスモデル = フレネル(F) + ジオメトリの可視性(G) + NDF(D)
フレネル = Schlickのフレネル近似式を使用
ジオメトリの可視性 = SchlickのモデルをGGXに合うように修正したモデルを採用
NDF = 法線の分布 = スペキュラハイライトの形や大きさ = GGXモデルを採用

GGXというのは、従来のスペキュラ反射モデルであるPhongに代わるものです。他にBeckmannというのも有名なようです。各式の詳細は、後述の資料に載っています。

ライティングモデル

ライティングモデル = 従来型の光源 + IBL + ローカルリフレクション + エリアライト
従来型の光源 = ポイントライト + ディレクショナルライト + スポットライト
ローカルリフレクション = スクリーンスペースリフレクション

ライティングについては減衰が物理ベースに合わせた計算式に変更されています。IBLについてはミップマップにぼかした絵を作っておいて、ラフネスが高いほど荒いミップマップを使う感じです。
(Unreal Engineの資料より拝借)
このあたりの情報は、上記のUnreal Engineの資料を見れば詳細が得られると思います。エリアライトの式も載っています。

アンチエイリアス/ポスプロ

アンチエイリアス/ポスプロ = フィルタリング + アンチエイリアシング + ポストプロセス

これの重要度はとても大きいようです。物理ベースだと、とあるピクセルの輝度が非常に高くなってチラチラするので、この辺の処理は必須になります。前のフレームの結果を混ぜるテンポーラルアンチエイリアシング等が必要なようです。ボリュームフォグやブルームやトーンマップといったポスプロも必要ですね。この辺はシリコンスタジオの資料に詳しく載っています。

リニアワークフロー

ガンマがかかったディスプレイを用いて描かれたテクスチャには、逆ガンマをかけてリニアテクスチャにしてからライティングし、描画された絵を最後にディスプレイに合わせてガンマ補正しないと、正しい色が出ません。

マテリアルパラメータ

  • BaseColor
  • Metallic
  • Roughness
  • Cavity …床のタイルの継ぎ目とか布の継ぎ目の影用

パラメータは4つだけと、結構単純ですね。これでゲームで使う大半のマテリアルが表せるのだから凄いです。作ったマテリアルをノードベースのエディタでブレンドできるようにして表現力を上げるのが今時の標準のようです。
(Unreal Engineの資料より拝借)

まとめ

この他にも、実際のゲームを作るにはたくさんの要素が必要かと思います。

  • 最新グラフィックスAPIの知識
  • ディファードシェーディング
  • マルチスレッドレンダリング
  • 最適化のためのグラフィックスハードウェアの知識
  • 大量のグラフィックアセットを効率良くコンバートするシステム
  • 肌や海といった特殊シェーダ
  • etc...

しかし、この記事で紹介した内容の理解を深めていけば、とりあえず絵が出るレンダラーは作れると思います。
みんなで綺麗な絵をレンダリングして、楽しみましょう!!

読んだ資料

t-pot WebGL: 物理ベースレンダリング

http://t-pot.com/program/154_PBR/index.html
物理ベースシェーディングの式とシンプルにまとまっており、最初に見るものとしてとっつきやすいです。GitHubに上がっているソースは古いように見えますので、デモのページでソースを直接見るのがいいと思います。

シリコンスタジオ CEDEC2014 最新テクノロジーデモ解説

http://www.siliconstudio.co.jp/rd/presentations/
リアルタイム物理ベースレンダリングの概要が網羅された貴重な日本語資料です。この資料で紹介されたキーワードを1つずつ調べていけば、物理ベースレンダリングを実装できそうな気がします。

Physics and Math of Shading (SIGGRAPH2014 PBS Course)

http://blog.selfshadow.com/publications/s2014-shading-course/hoffman/s2014_pbs_physics_math_slides.pdf
(http://blog.selfshadow.com/publications/s2014-shading-course/)
PBSの理論がまとまっています。英語ですが図が豊富でわかりやすいです。

Real Shading in Unreal Engine 4 (SIGGRAPH2013 PBS Course)

http://blog.selfshadow.com/publications/s2013-shading-course/karis/s2013_pbs_epic_notes_v2.pdf
(from http://blog.selfshadow.com/publications/s2013-shading-course/#course_content)
必見の資料。ソースに簡単に落とせる物理ベースシェーディングの計算式と、IBLのソースコードが載っています。マテリアルパラメータ、マテリアルブレンド、エリアライトなどの解説もあります。SIGGRAPHのコースには、他にもたくさん良さげな資料があります。