このページはレイトレ Advent Calendar 2018の記事として制作しました。
初っ端から遅れてすみません...
レンダリングの世界では、3Dモデルの見た目を向上させるために実際のジオメトリの法線ではなく、補間やテクスチャーによって与えた別の法線 = シェーディング法線をよく使います。非常に便利なシェーディング法線ですが、光輸送アルゴリズム、特に双方向なアルゴリズムに実装する際には正しく扱わないとレンダリング結果が破綻します。このページでは光輸送アルゴリズムにおけるシェーディング法線の扱い方について解説します。
(a) ジオメトリック法線 | (b) シェーディング法線 |
図1. シェーディング法線の効果 3Dモデルの面法線(ジオメトリック法線)をそのまま使ったレンダリング(a)とシェーディング法線を使ったレンダリングの比較(b)。同じ頂点数ながらスムースな見た目を実現できる。 |
3Dのレンダリングの世界ではレンダリング性能の観点から、頂点数・ポリゴン数を減らした3Dモデルが使われることがあります。そのようなモデルは計算負荷やメモリ使用量の点で有利ですが、当然見た目の品質は高ポリゴンモデルに対して劣ります。低ポリゴン数のモデルの見た目を可能な限り高ポリゴンモデルに近づけるため、頂点法線と法線補間という考えが使用されます。本来法線とは3Dモデルを構成する(ポリゴン)面ごとに定まる(面法線)ものですが、それを頂点ごとに定義(頂点法線)して各シェーディング点では周囲の頂点法線から補間することでシェーディングの結果をスムースに見せかけることができます(図1)。また、法線をテクスチャーの値に応じて変位させることで本来のジオメトリよりも詳細な形状を持ったように見せかけるバンプマッピング(bump mapping)というテクニックもよく使用されます。これらのテクニックのいずれか、または両方を使う場合は、実際のジオメトリの法線とシェーディングに用いる法線が同じではなくなります。前者をジオメトリック法線(geometric normal)、後者をシェーディング法線(shading normal)と呼びます。
レンダリング方程式より、ある点の反射光( = シェーディング) $ L_r(\vx, \vomega_o) $ は次の式によって定められます。 \begin{equation} L_r(\vx, \vomega_o) = \int_{\mathcal{S}^2} f_{s, g}(\vx, \vomega_i, \vomega_o) L_i(\vx, \vomega_i) \abs{\vomega_i \cdot \vec{n}_g} \d\vomega_i \label{eq:Lr_geometric} \end{equation} ここではジオメトリック法線を使う場合とシェーディング法線を使う場合を区別するために、それぞれに関連するBSDFと法線を $ f_{s, g} $ と $ \vec{n}_g $、$ f_{s, s} $ と $ \vec{n}_s $ として書き分けます。 シェーディング法線を使う場合は、上記の計算は次の式で置き換えられます。 \begin{equation} L_r(\vx, \vomega_o) = \int_{\mathcal{S}^2} f_{s, s}(\vx, \vomega_i, \vomega_o) L_i(\vx, \vomega_i) \abs{\vomega_i \cdot \vec{n}_s} \d\vomega_i \label{eq:Lr_shading} \end{equation} 見てわかるように式\eqref{eq:Lr_geometric}、\eqref{eq:Lr_shading}の違いはBSDFと法線がシェーディング法線に関連するものに置き換わるだけです。BSDFはそれ自身に変化はないものの、入射・出射方向は法線を含む基底の上で考える必要があるため、区別しておく必要があります。
ところで、上式における法線と入射方向の内積、つまりcos項は入射する放射輝度を放射照度に変換する係数として考えられることがあります。シェーディング法線を使うことでその係数が変化しシェーディング結果に影響を与えることができます。しかしレンダリング方程式の定式化によっては、cos項は直接的にシェーディングに関わらない要素の一部として考えられることもあります(例:幾何項など)。そのような場合はcos項は依然としてジオメトリック法線を使う必要があります。そこで、シェーディング法線はcos項としてではなく、BSDFへ影響を与えるパラメターとして解釈します。式で書くと次のようになります。 \begin{eqnarray} L_r(\vx, \vomega_o) &=& \int_{\mathcal{S}^2} f_{s, s}(\vx, \vomega_i, \vomega_o) \frac{\abs{\vomega_i \cdot \vec{n}_s}}{\abs{\vomega_i \cdot \vec{n}_g}} L_i(\vx, \vomega_i) \abs{\vomega_i \cdot \vec{n}_g} \d\vomega_i \label{eq:Lr_shading_mod} \\ &=& \nonumber \int_{\mathcal{S}^2} \bar{f}_s(\vx, \vomega_i, \vomega_o) L_i(\vx, \vomega_i) \abs{\vomega_i \cdot \vec{n}_g} \d\vomega_i \end{eqnarray} 式\eqref{eq:Lr_shading_mod}が式\eqref{eq:Lr_shading}に等しいことは明らかです。そしてシェーディング法線を含んだ修正されたBSDFを $ \bar{f}_s $ として定義します。後ほど詳細について述べますが、非常に重要な点としてこの修正BSDFはもはや(BRDF成分に関してさえ)相反性を持たないことが挙げられます。
(a) 非対称性を考慮しない場合 | (b) 非対称性を考慮した場合 | (c) 拡大図 |
図2. 双方向パストレーシングにおけるシェーディング法線による非対称性の考慮の有無の違い シェーディング法線はBSDFの相反性を完全に無くす。それを考慮しない場合、双方向アルゴリズムのレンダリング結果は破綻してしまう(a)が、正しく考慮することでその他のアルゴリズムと結果を一致させることができる。 |
パストレーシングなどの光輸送アルゴリズムでは経路を構築する際、BSDFのサンプリングとウェイトの累積を行いながら経路を延長していきます。(パストレーシングにおける)経路の頂点ごとに累積されるウェイトは次の式で表されます。
\begin{equation*}
\frac{f_{s, g}(\vx, \vomega_i, \vomega_o) \abs{\vomega_i \cdot \vec{n}_g}}{p_\sigma(\vomega_i)}
\end{equation*}
BSDFとサンプリング方向 $ \vomega_i $ のcos項、サンプリングの確率密度から構成されています。式\eqref{eq:Lr_shading}に従えば、このウェイトを次の式に置き換えることでシェーディング法線を使うことができます。
\begin{equation}
\frac{f_{s, s}(\vx, \vomega_i, \vomega_o) \abs{\vomega_i \cdot \vec{n}_s}}{p_\sigma(\vomega_i)} \label{eq:onestep_weight_shading}
\end{equation}
ところで「双方向パストレーシング実装」にあるように、双方向なアルゴリズムでは光源と視点両方から経路の構築を行うものの、構築の大部分においてはどちら側の経路かをほぼ意識する必要がありません。それなら双方向なアルゴリズムにおいても、ウェイト累積部分を式\eqref{eq:onestep_weight_shading}に置き換えるだけで済むんじゃ...と期待してしまいますが、残念なことにそうはなりません。
例として経路長 $ k = 2 $ の経路による寄与の積分 $ I_{j, 2} $ を 経路積分形式のレンダリング方程式を用いて考えてみましょう。扱う積分は次のようになります。
\begin{equation}
I_{j, 2} = \int_\mathcal{M} \int_\mathcal{M} \int_\mathcal{M}
W_e(\vx_1 \RAR \vx_0) G(\vx_1 \LRAR \vx_0) f_s(\vx_2 \RAR \vx_1 \RAR \vx_0) G(\vx_2 \LRAR \vx_1) L_e(\vx_2 \RAR \vx_1) \d A_2 \d A_1 \d A_0 \label{eq:path_integration_k2}
\end{equation}
まずは経路全体を視点側からのサンプリングによってのみ構築する場合(BPTにおける $ s = 0, t = 3 $ 戦略、そしてナイーブなパストレーシングに相当)のモンテカルロ推定量を考えてみます。
\begin{equation}
\Abk{I_{j, 2}} = \underbrace{\frac{W_e(\vx_1 \RAR \vx_0)}{p_A(\vx_0)} \frac{G(\vx_1 \LRAR \vx_0)}{p_A(\vx_1 | \vx_0)}
f_{s, s}(\vx_2 \RAR \vx_1 \RAR \vx_0) \frac{\abs{\vomega_{21} \cdot \vec{n}_{s1}}}{\abs{\vomega_{21} \cdot \vec{n}_{g1}}} \frac{G(\vx_2 \LRAR \vx_1)}{p_A(\vx_2 | \vx_1)}
L_e(\vx_2 \RAR \vx_1)}_{\mbox{from eye}} \label{eq:s0t3}
\end{equation}
ここで $ \vomega_{21} $ は $ \vx_2 $ から $ \vx_1 $ へと向かうベクトルを、$ \vec{n}_{s1} $, $ \vec{n}_{g1} $ は $ \vx_1 $ におけるシェーディング法線、ジオメトリック法線を表しています。その他のベクトル、法線に関しても同様です。この戦略では視点 $ \vx_0 $ のサンプリングから経路の構築を行います。$ p_A(\vx_1 | \vx_0) $ は $ \vx_1 $ が $ \vx_0 $ からのサンプリングによって得られていること、そしてその確率密度を表しています。基本的には式\eqref{eq:path_integration_k2}にモンテカルロ積分を適用したものですが、式\eqref{eq:Lr_shading_mod}や式\eqref{eq:onestep_weight_shading}に従ってBSDFの項を修正しています。式を左から見ていけば、経路構築の流れが想像しやすいのではないでしょうか。
今度は反対に経路全体を光源側からのサンプリングによってのみ構築する場合(BPTにおける $ s = 3, t = 0 $ 戦略、そしてナイーブなライトトレーシングに相当)のモンテカルロ推定量を考えてみます。
\begin{equation}
\Abk{I_{j, 2}} = \underbrace{W_e(\vx_1 \RAR \vx_0) \frac{G(\vx_1 \LRAR \vx_0)}{p_A(\vx_0 | \vx_1)}
f_{s, s}(\vx_2 \RAR \vx_1 \RAR \vx_0) \frac{\abs{\vomega_{10} \cdot \vec{n}_{s1}}}{\abs{\vomega_{10} \cdot \vec{n}_{g1}}} \frac{G(\vx_2 \LRAR \vx_1)}{p_A(\vx_1 | \vx_2)}
\frac{L_e(\vx_2 \RAR \vx_1)}{p_A(\vx_2)}}_{\mbox{from light}} \label{eq:s3t0}
\end{equation}
式を右から見ていけば、経路構築の流れが想像しやすいかと思います。経路構築方向は式\eqref{eq:s0t3}の場合とは逆方向になるので、$ \vx_1 $ におけるBSDFサンプリングによって得られる方向は $ \vomega_{10} $ になります。そのため式\eqref{eq:onestep_weight_shading}で示したようにサンプリング方向のcos項を使ってBSDFに修正を加えています。鋭い方はもう気がついたかもしれませんがここが誤りです。式\eqref{eq:s0t3}と\eqref{eq:s3t0}を見比べてみてください。もちろんサンプリング戦略が異なるのでPDFは異なるものを使っていますが、PDFを無視して被積分関数についてだけ考えてみるとこれらはもはや同じ式を推定しようとしていません。シェーディング法線をBSDFに変化を加えるパラメターとして導入した結果、完全に相反性が無くなっているため、視点側、光源側の経路構築においてこの非対称性を考慮しないと各戦略が異なる推定を行ってしまいます。双方向パストレーシングにおいてこの非対称性の考慮の有無によって変わる結果を図2に載せています。双方向パストレーシングでは、取りうる各戦略それぞれに得意・不得意はあろうとも同じ結果に収束することを大前提にMISウェイトをかけて結果を合成していますが、非対称性を考慮しない場合(a)のようにアーティファクトが出てしまいます。
この問題の解決方法は簡単です。パストレーシングのように視点側から経路を構築する場合は、BSDFに加える修正項にサンプリング方向を用いましたが、ライトトレーシングのように光源側から経路を構築する場合には、トレースしてきた既知の方向を用いてBSDFを修正するようにします。このページでは経路の構築方向に依存せず、光としての入射方向、出射方向をそれぞれ $ \vomega_i $, $ \vomega_o $ として扱っているので式で表せばどちらの場合の修正BSDFも次の形になります。
\begin{equation*}
f_{s, s}(\vx, \vomega_i, \vomega_o) \frac{\abs{\vomega_i \cdot \vec{n}_s}}{\abs{\vomega_i \cdot \vec{n}_g}}
\end{equation*}
あるシェーディング点において$ \vomega_i $ はパストレーシングの場合には次のサンプリング方向ですが、ライトトレーシングの場合にはトレースしてきた既知の方向になります。したがってライトトレーシングにおける経路の頂点ごとに累積されるウェイトは次の式で表されます。
\begin{equation*}
\frac{f_{s, s}(\vx, \vomega_i, \vomega_o) \abs{\vomega_o \cdot \vec{n}_g}}{p_\sigma(\vomega_o)} \frac{\abs{\vomega_i \cdot \vec{n}_s}}{\abs{\vomega_i \cdot \vec{n}_g}}
\end{equation*}
式\eqref{eq:onestep_weight_shading}の場合にはジオメトリック法線を含む項がキャンセルされて消えていましたが、ライトトレーシングのように光源側からサンプリングを行う場合には消えずに残ることになります。
ところで上記のように双方向パストレーシングにおいて、シェーディング法線を適用したBSDFの非対称性を正しく考慮しないといけないのであれば、一頂点だけ光源側から経路をサンプルするnext event estimation (NEE)を実装したパストレーシングにおいても注意が必要なのでは?と思うかもしれません。結果から言えばNEEはセーフです(だと思います)。上記と同じように経路長 $ k = 2 $ の場合を経路積分形式で考えてみましょう。NEEの場合のモンテカルロ推定量は次の形になります。 \begin{equation} \Abk{I_{j, 2}} = \underbrace{\frac{W_e(\vx_1 \RAR \vx_0)}{p_A(\vx_0)} \frac{G(\vx_1 \LRAR \vx_0)}{p_A(\vx_1 | \vx_0)} f_{s, s}(\vx_2 \RAR \vx_1 \RAR \vx_0) \frac{\abs{\vomega_{21} \cdot \vec{n}_{s1}}}{\abs{\vomega_{21} \cdot \vec{n}_{g1}}}}_{\mbox{from eye}} G(\vx_2 \LRAR \vx_1) \underbrace{\frac{L_e(\vx_2 \RAR \vx_1)}{p_A(\vx_2)}}_{\mbox{from light}} \label{eq:s1t2} \end{equation} NEEの場合、BSDFを評価する点は依然として視点側からのサンプリングで得ているため、おそらくBSDFの修正項には $ \vomega_{21} $ を含むものを使っているのではないでしょうか。それならばセーフです。
双方向パストレーシング以外の双方向な光輸送アルゴリズムで有名なものとしてフォトンマッピングが挙げられます。フォトンマッピングの場合はこのページで述べたような考慮をせずとも一見問題のなさそうな絵が得られます。なぜならフォトンマッピングは双方向手法とは言っても使用する戦略は基本的には一種類であるため、双方向パストレーシングのようにわかりやすいアーティファクトが出ないからです。しかし、その他のアルゴリズムの収束結果の一致をとる場合にはやはりこのページで述べた対策が必要になります。
シェーディング法線は双方向な光輸送アルゴリズムでなくともアーティファクトを引き起こします。シェーディング法線の使用に起因するアーティファクトは二種類あり、light leak 問題とblack surface 問題と呼びます。
反射に関するlight leak 問題は図3(a)に示すような状況で起こります。ここで $ \vomega_o $、$ \vomega_i $ をそれぞれ視線ベクトル、光線ベクトルだと考えてください。$ \vomega_o $ と $ \vomega_i $ は幾何的には物体表面を挟んで反対側に位置していますが、シェーディング法線について考えると同じ側に位置しています。そのため、単純にBSDFを評価してしまうと、不透明な材質だったとしても物体の裏側から(反射によって!)光を運んできてしまいます。また、透過に関するlight leak 問題は図3(b)に示すような状況で起こります。$ \vomega_o $ と $ \vomega_i $ は幾何的には同じ側に位置していますが、シェーディング法線について考えると反対側に位置しています。そのため、単純にBSDFを評価してしまうと、物体表面の同じ側から(透過によって!)光を運んできてしまいます。こちらは反射と違って問題が想像しづらいかもしれません。(現実には存在しないですが)反射が一切無く透過しかしない物体を考えてみましょう。透過に関するlight leakが起こると、物体の表側にある光を拾ってしまうため、まるで反射しているかのように見えてしまうでしょう。これは好ましくありません。light leak 問題は $ \vomega_o $、$ \vomega_i $ それぞれが二つの法線に関して同じ側にある場合にのみBSDFを評価するように変更することで防ぐことができます。つまり $ (\vomega_o \cdot \vec{n}_g)(\vomega_o \cdot \vec{n}_s) > 0 $ かつ $ (\vomega_i \cdot \vec{n}_g)(\vomega_i \cdot \vec{n}_s) > 0 $ の場合にのみBSDFを評価します。
light leak 問題と表裏一体の問題としてblack surface問題があり、反射に関するblack surface 問題は図3(b)のような状況で起こります。この状況ではジオメトリ自体は見えているのにも関わらず、シェーディング法線に関して $ \vomega_o $ が裏側に位置しているために、反射光を評価しても完全にゼロになってしまい物体表面が真っ暗に見えてしまいます。拡散面で目立ちやすいでしょう。この問題への対策として、BRDFであっても異なる半球に位置する $ \vomega_i $, $ \vomega_o $ に関して値を評価するように拡張することが提案されています[Veach1998]。BTDFも同様に同じ半球に位置する $ \vomega_i $, $ \vomega_o $ に関して値を評価するように拡張します。拡張されたBRDF、BTDFはいずれもあらゆる組み合わせの $ \vomega_i $, $ \vomega_o $ に関して値を持てるようになりますが、BSDF評価時には二つの方向が「ジオメトリック法線」に関してどう位置しているかに応じてBRDF, BTDFが選択されます。具体的には $ (\vomega_i \cdot \vec{n}_g)(\vomega_o \cdot \vec{n}_g) > 0 $ の場合にはBRDFが、そうでない場合にはBTDFが選択されます。
シェーディング法線に起因する様々な問題を回避する手法についてこのページで紹介しましたが、性能面での負荷が許すのであればやはり高精度な3Dモデルを使うに越したことはありません。とはいってもバンプマッピングで適用するような非常に細かな凹凸表現を本当のジオメトリで実現するのには限界があります。マイクロファセット理論を用いてこのページで紹介した手段とは異なるアプローチでシェーディング法線問題に取り組んだものとしてMicrofacet-based Normal Mapping [Schüssler2017]があります。