物理ベースシェーディング
物理ベースシェーディング (Physically-based shading、PBS) とは、物理法則をベースとしたシェーディングのことであり、物理ベースレンダリング (PBR) において使われている。PBSシェーディングモデルとしては、メタルネス (金属さ) ワークフローで有名な「Disney 原則BRDF」が代表的だが、それを拡張した「Disney BSDF」もある。これらをベースとしたシェーダーは、PBRシェーダーとも呼ばれている。
物理ベースシェーディングは、写実的レンダリングだけでなく、非写実的レンダリング (NPR) にも使われている。
2003年、三菱電機の研究拠点の一つ Mitsubishi Electric Research Laboratories (MERL) は、幅広いマテリアルの測定を行ってデータベース化したMERL BRDF Databaseを発表した。
その後、ウォルト・ディズニー・アニメーション・スタジオは、BRDF Explorerを開発し、そのツールとMERL BRDF Databaseのデータを用いて新たなシェーディングモデルの開発を行い、2012年、SIGGRAPH 2012 Courseの「Physically-Based Shading at Disney」の中で、「Disney “principled" BRDF」(Disney 原則BRDF) を発表した。
2015年、DisneyはDisney BRDFに鏡面反射BSDF (反射+透過)とより正確な表面下散乱を統合したDisney BSDFを発表した。
物理ベースレンダリングにおいては、基本的にエネルギー保存の法則を守る必要がある。PBSのシェーダーモデルは、パラメータを変更してもエネルギーが保存されるようになっている。なお、光の相反性については、透過を実装するために使われるBTDFに相反性が無いとされる。
物理ベースシェーディングのパラメーターに対応する3Dファイル形式が増えている:
glTF 2.0形式
Stingray PBSシェーダー方式 - Stingrayゲームエンジンで使われていたシェーダーのパラメータ
Autodesk Standard Surfaceシェーダー方式 - Arnold 5以降で使われているStandard Surfaceシェーダーのパラメータ。Maya 2020.3以降対応。
マイクロファセット (微細表面) 理論導入前のシェーディングモデルは、経験則に頼っていた。特にGPUによる固定パイプラインにおいて、拡散反射は完全拡散反射を前提とするランバート反射モデルのみであり、鏡面反射は経験則のBlinn-Phongの反射モデルのみであった。
マイクロファセット理論導入後、シェーディングモデルは「表面の粗さに対応する拡散反射モデル」 (オーレン・ネイヤー反射モデル等) と「表面の粗さに対応する鏡面反射モデル」 (Cook-Torranceモデル (Beckmann分布関数ベース)、Walterモデル (GGX分布関数ベース)等) の合成となった。しかし、拡散反射のオーレン・ネイヤー反射モデルがフレネル反射に未対応であったり、拡散反射のオーレン・ネイヤー反射モデルと鏡面反射の反射モデルでラフネス相当のパラメータの範囲が異なっていたりなど、問題が多かった。
2012年、「Disney 原則BRDF」が登場し、独自の拡散反射モデル (Disney diffuse BRDF)と、GTR分布関数 (GGX分布関数を拡張したもの) ベースの鏡面反射モデルの合成により、両反射モデルのラフネスパラメータが統合された。また、メタルネス (金属さ) が導入され、光の透過や表面下散乱 (含拡散反射) のほぼ起きない「導体 (金属) 」と、金属光沢 (鏡面反射色のある強い鏡面反射) の起きない「誘電体 (非金属)」が別扱いされるようになった。また、影響の大きな色である導体の鏡面反射色および誘電体の拡散反射色が基本色 (ベースカラー)として同一に扱われるようになった。
2014年、マイクロファセット理論におけるフレネル反射の計算に、屈折率1.2〜2.2を近似した従来のSchlickの近似式に代わって、正確なGulbrandsenのフレネル方程式が登場したものの、Gulbrandsenのフレネル方程式はRGBレンダリングにおいて近似となり、Schlickの近似式よりも正確では無いものとなっていた。2019年、LucusFilm の Naty Hoffman によってそれらよりも正確な F82パラメータ(82度における反射率)の導入が提案されたものの、F82パラメータはエネルギーの保存に問題が存在した。2021年、「Adobe Standard Material」が登場し、そこにはその改良版である F82-tint(82度における色合い)が導入された。
2016年、多重散乱 (Multiscatter) を考慮する鏡面反射モデルが登場した。これは従来の鏡面反射モデルが単一散乱のみしか考慮されて居なかったためである。その後、多重散乱の高速な近似が登場している。
なお、拡散反射は表面下散乱の近似だとされているが、表面下散乱の距離が0に近い場合、一般的な拡散反射モデルに使われている完全拡散反射 (ランバート反射) とはならず、Chandrasekhar BRDFとなる。
表面下散乱では1993年、BRDFを表面下散乱へと近似したHanrahan-Krueger BRDFが登場した。
2001年、医療物理学向けの手法の応用により、双極子 (Dipole) モデルを用いたBSSRDFベースのレンダリング手法が確立されたものの、多重散乱部分は近似となっていた。
2015年、拡散モデル向けに単一散乱および多重散乱の両方を同時に近似したChristensen-Burley拡散プロファイルが登場し、この拡散プロファイルは同年のDisney BSDFでも採用された。
しかし、拡散モデルは平らな表面を前提としているために曲率の高い表面でアーティファクトが多く、Disney BSDFでは正確でアーティファクトの少ないPath-traced subsurface scattering (ランダムウォーク方式) も検討された。2014年には原子力学で使われていたゼロ分散なDwivediサンプリングをランダムウォーク方式の表面下散乱に使うことが提案されており、2016年にはその改良版が登場し、多くのレンダラーがランダムウォーク方式に対応していった。
2017年、Disney子会社のPixarはPath-traced subsurface scatteringの新たなモデルを公開した。このPixarの論文では異方性に加えてランベルト・ベールの法則よりも正確な非指数関数モデルが導入された。
リアルタイムにおける表面下散乱の表現では当初、擬似的なHalf-Lambertシェーダーが使われていた。その後、Wrapped Diffuseシェーダーにルックアップテーブルでカラーシフトを加える手法、深度マップを用いた吸収の近似、テクスチャ空間でのガウシアンぼかしによる拡散の近似が登場した。
2009年、テクスチャ空間の代わりにスクリーン空間でぼかし処理を行うScreen Space Subsurface Scattering (SSSSS)が登場した。2012年にはスクリーン空間でのぼかし処理を2つの畳み込みまで減らして高速化したSeparable Subsurface Scattering (SSSS)が登場した。Disney BSDF登場後は、ガウシアン拡散プロファイルの代わりにChristensen-Burley拡散プロファイルが使われるようにもなった。
また、表面下散乱の透過のために、焼き付けたThicknessマップも使われるようになった。
レイトレーシング導入前の透過には、2次元的なアルファブレンドが用いられていた。
レイトレーシング導入後、屈折の再現が可能となった。また、ランベルト・ベールの法則に基づく指数関数的減衰の再現により、半透明における、より正しい体積吸収 (ボリュームアブソープション) の再現が可能となった (なお、ランベルト・ベールの法則は関与媒体が無相関の場合のみ正確となる)。
また、位相関数を用いたボリュームレンダリングも行われるようになった (#ボリューム (体積)も参照)。
薄いサーフィスにおいては、「表面下散乱による拡散透過」が導入されたほか、屈折にもマイクロファセット理論が導入され、粗い (ラフネスの高い) 表面により拡散された拡散透過および鏡面透過の再現が可能となった。
3DCGのレンダリングでは昔より可視光の電磁スペクトルを考慮した物理的なスペクトラルレンダリングが考案され一部のレンダラーに実装されていたものの、多数の固定波長でのスペクトラルレンダリングでは速度の問題が存在し、また単一波長でのモンテカルロレイトレーシングによるスペクトラルレンダリングでは色ノイズの問題が存在しており、一般的なレンダリングの主流は長らく非物理的な光の三原色(RGB、赤-緑-青)を使ったRGBレンダリングに留まっていた。しかしながらRGBレンダリングには反射を繰り返すごとに色がズレていく、条件等色(メタメリズム)の再現が出来ない、光の分散や干渉や蛍光(増白も含む)が近似計算になるなどの問題が存在していた。
2014年に代表波長スペクトラルサンプリング (Hero Wavelength Spectral Sampling) が登場すると、四波長や八波長での処理でよりノイズの少ないスペクトラルレンダリングが可能となった。
スペクトラルレンダリングでRGB値指定のマテリアルや光源を扱うためにはスペクトルの再構築(通称アップサンプリング)が必要となる。
アップサンプリングの手法は古くより存在していたものの、1935年のMacAdam法はスペクトル形状を箱型として扱っており非常に荒いものとなっていた。滑らかなアップサンプリング法としては1989年にGlassnerによって平滑化関数の線形結合を使用する手法が登場したものの、実際の物質の反射率曲線は滑らかではないという問題が存在しており、1990年にはvan Trigtによって最小勾配二乗法を使用する手法が登場した。しかしながら、これらにはどちらも負の反射率が算出されうるという問題が存在していた。
その後、1999年にSmitsによってスペクトルを10個の箱型にした実用的なアップサンプリング法が登場し広く使われることとなった。しかしながら、この手法は狭色域のsRGB色空間でしか正しく動作しないという問題を抱えていた。この問題を解決する手法はいくつか提案されているものの、2021年現在もプロダクションレンダラーのManukaではこの手法の変種が使われており、そこでは広色域もsRGB色空間へと変換された後でアップサンプリングされている。
また各スペクトルの反射率は光が増幅しないよう 1.0 を超えることが出来ないが、それによって指定されたRGB色の彩度が高い場合に明るさを再現できないケースが存在し、2019年にはその問題を解決するために蛍光を考慮した蛍光アップサンプリング法が登場した。
「Disney 原則BRDF」には、ベースカラー (アルベド)、メタルネス (金属度)、ラフネス (粗さ)、スペキュラレベル (鏡面反射量) だけでなく、表面下 (サブサーフィス)や異方性 (アニソトロピック)やツヤ塗装やクリア塗装 (クリアコート)も含まれている。しかし、物理ベースシェーディングの実装によっては、それらの幾つかが省略されているものもある。
ディズニーの元資料の「Disney 原則BRDF」にあるパラメータは以下となっている。
メタルネス (金属さ、金属度、メタリック)
メタルネスパラメータは誘電体 (非金属)か導体 (金属)かを指定する。中間を指定すると、誘電体と導体がブレンド (ミックス)される。
誘電体では、光が入射すると正反射光と屈折光に分かれ、屈折光が表面下で散乱・吸収され散乱光 (拡散反射光を含む) となったり、透過・吸収されて透過光となる。導体では、光が入射すると一部の光が屈折して吸収され、それ以外の光が正反射される。
ベースカラー (アルベド)
ベースカラーパラメータは、誘電体の拡散反射色および導体の正反射色を指定する。
ラフネス (粗さ、粗度)
ラフネスパラメータは、微細表面 (マイクロファセット) 理論に基づくマイクロスケールでの表面の粗さを指定する (なお、メソスケールの粗さについては法線マップで再現する必要がある)。
ラフネスが高いほど、正反射光、屈折光および散乱光が表面で拡散することとなる。なお、誘電体か導体かに関わらず全てのマテリアルはフレネル反射を持つが、ラフネスが高くなるほどフレネル反射は小さくなる。
一部のPBS実装では、ラフネス (粗さ)の代わりにグロシネス (光沢度、滑らかさ)で実装されている (GGX/GTR鏡面反射モデルにおいては、ラフネス = 1.0 - グロシネス)。
スペキュラレベル (鏡面反射量、単にスペキュラとも書かれる)
スペキュラレベルパラメータは、誘電体の鏡面反射率を0.08 (8%) で割って指定する。スペキュラレベルは屈折率 (IOR) から算出することもできる: (((ior-1)/(ior+1))**2)/0.08 。
スペキュラレベルの標準値は0.5 (= IOR 1.5) となっている。glTF形式ではKHR_materials_specular拡張で対応しているものの、標準値は1.0となっている。
スペキュラティント (鏡面反射の色味)
スペキュラティントパラメータは、誘電体の正反射色をどれだけベースカラーに近づけるかを指定する (なお、導体の正反射色はベースカラーと同等)。なお、スペキュラティントは、フルネル反射の反射色に影響を及ぼさない。
glTF形式のKHR_materials_specular拡張では色味ではなくスペキュラカラー (鏡面反射色) となっている。
サブサーフィス (表面下)
サブサーフィスパラメータは、誘電体において、表面下で散乱された散乱光が拡散反射形に近いか表面下散乱形に近いかを指定する。
「Disney 原則BRDF」において表面下散乱は、Hanrahan-Krueger BSDFにインスパイアされた薄い散乱層向けの近似モデルを採用している。一方、Disney BSDFでは、従来の薄い散乱層向けの表面下散乱は、サブサーフィスパラメータからフラットネス (平坦さ) パラメータへと変更され、サブサーフィスには、より正確な表面下散乱として、独自の拡散プロファイルによる近似 (Christensen-Burley方式)、もしくは曲率の高いサーフィスでも問題の無いPath-traced subsurface scattering (ランダムウォーク方式) が導入された。
フラットネスパラメータには、LightWave、MODOなどが対応している。ランダムウォーク方式の表面下散乱には、ArnoldやBlender 2.80以降などが対応している。
アニソトロピック (異方性)
アニソトロピックパラメータは正反射の異方性の度合いを指定する。正反射の異方性は繊維や溝などの平行的な構造より生じるため、ブラッシングされた金属、布地、髪などのマテリアルで使用される。
Sheen (ツヤ)
シーンパラメータは、誘電体において、ラフネスパラメータで再現しきれない追加のフレネル反射の反射率を指定する。このパラメータと下のシーンティントパラメータは透過性繊維が含まれている布地などに必要となる。glTF形式では標準で対応しておらず、KHR_materials_sheen拡張への対応が必要となる。
SheenTint (ツヤ色味)
シーンティントパラメータは、誘電体において、追加のフレネル反射をどれだけベースカラーに近づけるかを指定する。
クリアコート (クリア塗装)
クリアコートパラメータは、レイヤー合成されるクリア塗装マテリアルの合成強度を、0.25で割って指定する。なお、「Disney 原則BRDF」では屈折率 1.5のポリウレタンによるクリア塗装を前提としている。glTF形式では標準で対応しておらず、KHR_materials_clearcoat拡張への対応が必要となる。
クリアコートグロス (クリア塗装の滑らかさ、クリア塗装の光沢度)
クリアコートグロスパラメータは、クリアコートの滑らかさを指定する。
glTF形式のKHR_materials_clearcoat拡張など一部のPBS実装ではクリアコートグロスの代わりにクリアコートラフネス (クリア塗装の粗さ) で実装されている (クリアコートラフネス = 1.0 - クリアコートグロス)。
ディズニー子会社のピクサーがRenderManのPxrDisneyシェーダーで実装していた拡張パラメータには以下がある。
サブサーフィスカラー (表面下の色)
サブサーフィスカラーパラメータは、誘電体の表面下散乱に用いられる表面下の色を指定する。
RenderMan、Blender、Houdini、Arnold、LightWaveなどが対応している。
エミットカラー (放射色、エミッションカラー、ルミナスカラー、発光色)
エミットカラーパラメータは、発光における放射色を指定する。
RenderMan、Arnold、Houdini、LightWaveなどが対応している。
Disney BSDFは基本的にDisney BRDFに透過 (拡散透過およびスペキュラ透過) とボリュームを足したものとなっている。Disney BSDFでは屈折率をスペキュラレベルではなくIORで直接指定する。
ディズニーのDisney BSDFの資料にある拡張パラメータには以下がある。なお、フラットネス (平坦さ)については、上記のサブサーフィスの項を参照。
スキャッターディスタンス (散乱距離、サブサーフィスラジアス、表面下の半径、サブサーフィスディスタンス、表面下の距離)
スキャッターディスタンスパラメータは、誘電体の表面下散乱において、それぞれの色の光線毎の表面下における平均距離を指定する。
Disney BSDF由来であり、Blender、Houdini、Arnold、LightWaveなどが対応している。
トランスミッタンスカラー (トランスミッションカラー、透過色)
トランスミッタンスカラーは、誘電体の体積吸収 (ボリュームアブソープション) において、吸収された光の色合いを指定する。
Disney BSDF由来であり、Houdini、Arnold、LightWaveなどが対応している。
アットディスタンス (トランスミッタンスディスタンス、トランスミッションデプス、透過距離)
アットディスタンスパラメータは、誘電体の体積吸収 (ボリュームアブソープション) において、吸収された光が透過色に達するまでの距離を指定する。
Disney BSDF由来であり、Houdini、Arnold、LightWaveなどが対応している。
specTrans (スペキュラ透過、トランスパレンシー、透明度、トランスミッションファクター、透過率)
specTransパラメータは誘電体においてスペキュラ透過 (屈折) のミックス割合を指定する。glTF形式ではKHR_materials_transmission拡張によって対応している (ベンダー拡張ADOBE_materials_thin_transparencyの後継)。
diffTrans (拡散透過、Translucency、半透明度)
diffTransパラメータは誘電体の薄いサーフィスにおいて、散乱による拡散反射と拡散透過の割合を0~2で指定する。
Enterprise PBR拡張 (後述) では値の範囲が0〜1となっている。
Index of Refraction (ior、屈折率)
表面の屈折率を直接指定する。
Enterprise PBR拡張 (後述) 及びglTF形式のKHR_materials_transmission拡張及びKHR_materials_ior拡張では標準値がポリウレタンの屈折率と同等の1.5となっている。glTF形式のベンダー拡張ADOBE_materials_thin_transparencyでは標準値が水の屈折率と同等の1.33となっていた。
Disney子会社のPixarはパストレース表面下散乱に以下のパラメータを導入した。
サブサーフィスアニソトロピー (表面下異方性、ディレクショナリティー、方向性)
表面下散乱の異方性を指定する。異方性は特にバックライトのシーンの薄い部位で違いが大きくなる。リアルな肌の表現には約0.8を指定する。
Arnold、RenderMan、Blender 3.0以降のCyclesなどが対応している。
ブリード (滲み)
非指数関数モデルの表面下散乱における光滲みを指定する。RenderManなどが対応している。
Dassault SystèmesのEnterprise PBRは、glTF形式の次世代PBRマテリアルの元になる予定となっている 。Enterprise PBRではスペキュラレベルと屈折率 (IOR)の両方のパラメータに対応している。またEnterprise PBRでは表面下散乱と体積吸収をまとめて扱っており、表面下散乱と体積吸収の比率はサブサーフィスカラーにより指定する。
Enterprise PBRで拡張されたパラメータには以下がある。
Sheenカラー (ツヤ色)
Sheenラフネス (ツヤの粗さ)
フレークカバレッジ (フレーク範囲)
フレークがどれだけ覆うのかを指定する。
フレークカラー (フレーク色)
フレークの色。
フレークラフネス (フレークの粗さ)
フレークの向きの分布の粗さを指定する。
フレークサイズ (フレークの大きさ)
フレークの直径をミリメートル (mm)で指定する。
フリップフロップエフェクト (フリップフロップ効果)
フレークのフリップフロップ効果を有効にするかどうかを0か1で指定する。
フリップフロップカラー (フリップフロップ色)
フレークのフリップフロップ効果が有効な場合の第二フレークカラー。
クリアコートノーマル(クリアコート法線)
クリアコートの法線を指定する。
エミッションバリュー (放射量)
エミッションバリューパラメータは、発光における放射量をlm/m2 (単位面積当たりの放射量)又はlm (全面積での放射量)で指定する。
エミッションモード (放射モード)
発光における放出量が単位面積当たり(lm/m2)か全面積(lm)かを指定する。
エネルギーノーマライゼーション (エネルギー正規化)
エネルギーノーマライゼーションパラメータは、発光における放射色の正規化を行うかを二値で指定する。
Thin Walled (薄肉)
Thin Walledパラメータはマテリアルが薄肉かどうかを二値で指定する。マテリアルが薄肉でない場合、表面下散乱が有効となる。glTF形式のKHR_materials_volume拡張ではthicknessFactor (厚み因数) が0の時にThin Walledとなる。
アテニュエーションカラー (減衰色)
誘電体の体積吸収および表面下散乱において吸収・散乱された光の色合いを指定する。glTF形式ではKHR_materials_volumeで対応している。
アテニュエーションディスタンス (減衰距離)
誘電体の体積吸収および表面下散乱における吸収・散乱された光が減衰色に達するまでの距離。glTF形式ではKHR_materials_volumeで対応している。
ディスプレイスメント (変位)
ディスパージョン (分散、トランスミッションディスパージョン、透過分散)
光の屈折で生じる分散に関するパラメータをアッベ数で指定する。Arnoldが対応している。HoudiniやOctaneも分散に対応しているが、これらはアッベ数の代わりに分散係数で指定を行う。
Autodesk Standard SurfaceシェーダーのパラメータはFBX形式に新たに導入されている。これらパラメータはArnold 5以降に実装されているStandard Surfaceシェーダーが基となっている。このシェーダーモデルでは単純なクリアコートの代わりに汎用なコートが導入されている。
コートカラー(コート色)
コートの色を指定する。
コートアニソトロピー(コート異方性)
コートの異方性を指定する。
コートローテーション(コート回転)
コートの異方性の回転を指定する。
コートIOR(コート屈折率)
コートの屈折率を指定する。
コートアフェクトカラー(コート影響色)
コートアフェクトラフネス(コート影響粗さ)
オパシティ (不透明度、カットアウトオパシティ)
オパシティは表面の不透明度を指定する。細かな穴のある布などを表現する時などに使われる。物理的に正しい不透明度を実装した実装系も存在する。
Thin Film Thickness (薄膜の厚み)
表面上の薄膜の厚みをナノメートルで指定する。薄膜は分散した屈折光の内部反射により玉虫色 (イリデスンス) となる (薄膜干渉/薄膜光学)。薄膜の厚みへと対応するものには、ArnoldやRenderManがある。
Adobe Standard Material は Substance 3D Stager などで使われている。
Sheenオパシティ (ツヤ不透明度)
Sheenの不透明度を指定する。
スキャッタリングディスタンススケール(散乱距離スケール)
表面下散乱の散乱距離の各色のスケーリングを指定する。
レッドシフト(赤方偏移)
表面下散乱の赤方偏移の度合いを指定する。肌に向くとされる。
レイリースキャッタリング(レイリー散乱)
表面下散乱のレイリー散乱の度合いを指定する。ミルク、石、空気などに向くとされる。
コートオパシティ (コート不透明度)
コートの不透明度を指定する。
コートスペキュラレベル(コート鏡面反射量)
コートの鏡面反射量を指定する。
コートノーマルスケール(コート法線スケール)
コートの法線の強さを指定する。
RenderManのPxrDisneyシェーダー (なお、Uberシェーダーは既にPxrSurfaceシェーダーに移行済み)
Blender 2.79以降のCyclesのPrincipled Node (透過はDisney BSDFと非互換の形で実装)
MODO 11.2以降のPrincipledシェーダー
3ds Max 2018及びMaya 2018以降に搭載のArnold 5以降のStandard Surface (「Disney 原則BRDF」のスーパーセット)
Houdini 16以降のMantraのPrincipled Shader VOPノード/Principled Shader SHOPノード (「Disney 原則BRDF」のスーパーセット)
LightWave 2018以降のPrincipled BSDF
appleseedのDisney BRDF
Blender 2.8以降のEeveeのPrincipled Node (一部未実装)
Godot 3.0以降
スキンシェーダーとは、肌の皮脂膜、表皮 、真皮 、皮下組織の各層の反射・散乱に対応するシェーダーのことである。
表皮は角質層と「生きている表皮」に分けることができる。表皮の光の吸収率はメラノソームによって合成された各種メラニン(ユーメラニン及びフェオメラニン)の濃度によって主に決定される。食べて吸収したカロテノイド(β-カロテンなど)も表皮で光で吸収を行うが、外観への影響は少ないとされる。
真皮は真皮乳頭層と真皮網状層に分けることができる。真皮の光の吸収率は酸化および脱酸化されたヘモグロビンの濃度によって主に決定される。また真皮のエラスチン(弾性線維)と親和性の高いビリルビンも真皮の色に影響を与えうる(黄疸)ほか、カロテノイドや水も少量の影響を与えるとされる。
かつては一部のレンダラーが標準でこれらの層に対応していたものの、その後、汎用の方式に置き換えられていっていった。
ArnoldのSkinシェーダー - Standard Surfaceに置き換えられて、廃止予定となっている。