Skip to content
Go back

拙訳「Efficient Screen-Space Subsurface Scattering Using Burley's Normalized Diffusion in Real-Time」

· Updated:

[Golubev 2018Golubev, E. 2018. Efficient Screen-Space Subsurface Scattering Using Burley's Normalized Diffusion in Real-Time. Advances in Real-Time Rendering in Games course. ACM SIGGRAPH. https://advances.realtimerendering.com/s2018/index.htm.]

url

表面下散乱とは?#

  • 表面下の関与媒質内部での光輸送

表面下散乱とは何かを理解しようとするところから始めよう。

定義により、それは表面下の関与媒質内部での光輸送である。

光は誘電体の境界で屈折して…

…関与媒質内部で複数回散乱して…

…再び外へ屈折する。

  • BSSRDF: fss(pentry,pexit,l,v)=cFt(pentry,l)R(pentrypexit)Ft(pexit,v)f_{ss}(p_{entry}, p_{exit}, l, v) = c F_t(p_{entry}, l) R(\| p_{entry} - p_{exit} \|) F_t(p_{exit}, v)

散乱は一般的に等方的であると仮定され(これは多重散乱に対して理に適った仮定である)、故に、放射対称な拡散プロファイルによってモデル化される[Jensen et al. 2001Jensen, H. W., Marschner, S. R., Levoy, M. and Hanrahan, P. 2001. A practical model for subsurface light transport. Proceedings of the 28th annual conference on computer graphics and interactive techniques 511–518. 10.1145/383259.383319. https://graphics.stanford.edu/papers/bssrdf/bssrdf.pdf.]

これはBidirectional Subsurface Scattering Reflectance Distribution Function(縮めてBSSRDF)の上述followingの定義をもたらす。ここで、RRは拡散プロファイルであり、FtF_tはフレネル透過率であり、CCは正規化定数である。

実践においてこれの意味する所は、肌のようなマテリアルが一般にプラスチックのようではなく、なめらかで有機的organicであるように見えることである。<ここにあるのはリアルタイムにHDRPでレンダリングした肌と眼の表面下散乱を示しているモデルの例である。>

照明が唐突に変化するエリアの周りでいくらかの色にじみcolor bleedingがあったりもする。

SSSを使うとすべてのシャドウ境界の近くで色にじみを目立たせてしまうget pronouncedというある種の誤解が存在するように思われる。実際、シャドウがソフトであるならば、それは非常に些細なことである。

リアルタイム表面下散乱#

  • オリジナル: テクスチャ空間、4つの計測データへのガウシアンのフィッティング[d'Eon et al. 2007d'Eon, E., Luebke, D. and Enderton, E. 2007. Efficient rendering of human skin. Proceedings of the 18th eurographics conference on rendering techniques 147–157. https://eugenedeon.com/pdfs/efficientskin.pdf.]
  • 動機: ガウシアンの畳み込みは可分separable→高速
  • ゲーム: スクリーンスペースのアルゴリズム
  • 拡散プロファイルのモデル:
    • 1つのガウシアンとディラックのデルタ[Mikkelsen 2010Mikkelsen, M. S. 2010. Skin Rendering by Pseudo-Separable Cross Bilateral Filtering. https://mmikk.github.io/papers3d/cbf_skin.pdf.]
    • 2つのガウシアン[Jimenez et al. 2015Jimenez, J., Zsolnai, K., Jarabo, A., Freude, C., Auzinger, T., Wu, X.-C., von der Pahlen, J., Wimmer, M. and Gutierrez, D. 2015. Separable subsurface scattering. Computer Graphics Forum 34, 6, 188–197. 10.1111/cgf.12529. https://www.iryoku.com/separable-sss/.]

表面下散乱は一般的にどうやって実装されるか?

最初のリアルタイムSSSアプローチはEugene d’Eonによって提案され、計測された拡散プロファイルに対する数値的なフィッティングを生成するために(具体的には4つの)ガウシアンの混合mixture of Gaussianを用いた。

ガウシアンはいくつかの理由により選ばれた:

  • ガウシアンの混合は数値的なフィッティングにとって便利な対象である。
  • 加えて、ガウシアンでの畳み込みは可分であり、すなわち、サンプル数に(二乗ではなく)線形な複雑さを持つ。
  • そして最後に、“小さな”ガウシアンでの反復した畳み込みは”大きな”ガウシアンでの単一の畳み込みと等価である。

このアプローチは素晴らしいfantastic結果を生み出すが、ゲーム用には依然として、今日でさえも、高価すぎる。故に、リアルタイム制約はスクリーン空間でSSSを実装することを強制する。

そのフィルタは通常1または2つのガウシアンとディラックのデルタ関数から成る。これは実践においてオリジナル画像とブラーされた画像の間を補間することを意味する。

可分な表面下散乱での問題#

  • 動機: ガウシアンの畳み込みは可分であり、それ故に、高速である
    • 平面上でフィルタリングするときにだけ可分である
  • バイラテラルフィルタリングは畳み込みを”偽の可分”にする
    • 結果は見た目にもっともらしい
  • 混合ガウスGaussian mixtureの定式化は、ガウシアンごとに2つの畳み込みパスを行わない限り、明らかに不可分である
    • コンテンツ側で修正しなければならないようなアーティファクトを引き起こすかもしれない、幾分可分somewhat separableスクリーンスペースSSS(SSSSSSS) を引き起こし得る
    • 2つのガウシアンに対して4つのパスを処理するのは実践において高価すぎる
  • 2つのガウシアンでは計測データに対する部分的なフィッティングをもたらすのみである[Christensen and Burley 2015Christensen, P. H. and Burley, B. 2015. Approximate Reflectance Profiles for Efficient Subsurface Scattering. https://graphics.pixar.com/library/ApproxBSSRDF/.]

単一のガウシアンは多重散乱の近似ではかなり良い仕事をする。

しかし、2つのガウシアンの混合でさえ単一および多重散乱の組み合わせを正確に表現するのに苦戦する。

画像では、リファレンス結果を白色に、2重のガウシアン近似を赤色に確認できる。

  • 混合ガウスはアーティストフレンドリーではない
    • ガウシアンは単なる数学的な概念である
    • アーティストは計測データを用いるか、数値的フィッティングを”目測eyeball”するかのいずれかを強制される
      • 多すぎる自由度(7)
      • 多くの組み合わせは無意味である

混合ガウスモデルGaussian mix modelを実装した後、我々はもうひとつの問題に遭遇した --- アーティストフレンドリーではない。

ガウシアンは単なる数学的な概念であり、SSSの文脈において物理的な意味を持たない。そして、lerpパラメータとそれらの内の2つがあるとき、その自由度は7になり、結果の組み合わせが理にかなうようにこれらをセットアップする方法は必ずしも明らかではない。

触れておくべきこととして、熟練のアーティストは依然として混合ガウスモデルで素晴らしい結果を達成することができる。しかし、これは、Unityに上手く合致しない、長々しく複雑なプロセスとなり得る。

でも、不可分な畳み込みは遅いんでしょ?#

  • ともかく、試してみよう :-)

Burleyの正規化済み拡散モデル#

  • “Disney SSS”として知られる
  • Brent BurleyとPer Christensenによって開発される[Christensen and Burley 2015Christensen, P. H. and Burley, B. 2015. Approximate Reflectance Profiles for Efficient Subsurface Scattering. https://graphics.pixar.com/library/ApproxBSSRDF/.]
  • リファリンスのMCデータに対する曲線フィッティング[Wang et al. 1995Wang, L., Jacques, S. L. and Zheng, L. 1995. Monte Carlo modeling of light transport in multi-layered tissues. Computer Methods and Programs in Biomedicine 47, 2, 131–146. 10.1016/0169-2607(95)01640-F. https://omlc.org/software/mc/mcml/MCman.pdf.]
  • 関与媒質内部での単一および多重散乱の両方を計算に入れる

では、より良い解法はあるのか?まあ、このトークのタイトルにあるけど。 :-)

我々は、我々がDisney SSSと呼ぶ、Burleyの正規化済み拡散モデルを実装した。

これはモンテカルロシミュレーションを用いて得られたリファレンスデータに対する正確なフィッティングをもたらす。

必然的にnaturally、これは単一および多重散乱の両方を計算に入れることを意味する。

R(r)=Asesr+esr/38πrR(r) = As \frac{e^{-sr} + e^{-sr/3}}{8 \pi r}

これは2つのパラメータのみを持つ: ボリュームのアルベドAAと形状パラメータss。両方とも色のように補間することができる。

形状パラメータは散乱距離に反比例する。また、これはUIに開示しているものである。

結果のプロファイルのグラフを見ると、2つのことが明らかとなる:

  1. 鋭いピークと長いテールは単一のガウシアンではモデル化できない
  2. 結果のフィルタは明らかに不可分である
  • 拡散プロファイルは正規化され、PDFとして使うことができる
02π0rR(r)drdϕ=Ap(r)=rR(r)A\begin{gather} \int_0^{2\pi} \int_0^{\infty} rR(r) dr d\phi = A \\ p(r) = \frac{rR(r)}{A} \end{gather}

その拡散プロファイルは正規化され、確率密度関数(縮めてPDF)として直接使うことができる。すぐ後に分かるだろうが、これはモンテカルロ積分に対して有用な特性である。

表面下散乱の実装#

  • ディフューズBRDFはSSSの遠距離場far-fieldの近似である
    • ディフューズ透過の振る舞いを定義するためにDisneyのディフューズBRDFの定式化を使う[Christensen and Burley 2015Christensen, P. H. and Burley, B. 2015. Approximate Reflectance Profiles for Efficient Subsurface Scattering. https://graphics.pixar.com/library/ApproxBSSRDF/.]
      • 物理的にもっともらしくないが、ランバート分布を仮定するより良好である
fd(l,v)=AπFdt(l)Fdt(v)+frrFdt(x)=10.5(1nx)5\begin{gather} f_d(l, v) = \frac{A}{\pi} F_{dt}(l) F_{dt}(v) + f_{rr} \\ F_{dt}(x) = 1 - 0.5(1 - |n \cdot x|)^5 \end{gather}

ディフューズBRDFは散乱距離がピクセルのフットプリントの内にあるときにSSSを近似する。

これの意味する所は両方のシェーディングモデルがある距離を越えた所で同じビジュアルを持つ必要があるということである。

これを達成するため、我々は誘電体の境界でディフューズ透過の振る舞いを定義するためにDisneyのディフューズBRDFの定式化を用いる。

GGXモデルによって定義される透過と合致しないが、ランバート分布を仮定するよりかは依然として良好である。

  • スペキュラ透過のサポートなし(単一および多重散乱のみ)

我々はスペキュラ透過をモデル化せず、我々のモデルはガラスのようなアルベドの低いマテリアルに対して一般化しない。

注: 透過は紛らわしい項であるかもしれない。スペキュラ透過はなめらかな誘電体の境界でのフレネル透過を指す。 ディフューズ透過は粗い誘電体の境界を通る透過をモデル化し、一般に大きな多重散乱の量を仮定する。しばしば、これは単なるランバート項である。

  • ディフューズBRDFはSSSの遠距離場の近似である
    • ボリュームアルベドとして表面のアルベドを使う
      • 2つのテクスチャリングの選択肢を提供する[d'Eon et al. 2007d'Eon, E., Luebke, D. and Enderton, E. 2007. Efficient rendering of human skin. Proceedings of the 18th eurographics conference on rendering techniques 147–157. https://eugenedeon.com/pdfs/efficientskin.pdf.]
        • 散乱後post-scatterテクスチャリング: 脱出exit位置でのアルベド
        • 散乱前および後pre- and post-scatterテクスチャリング: 侵入enterおよび脱出の両方でのsqrt(albedo)sqrt(albedo)

ビジュアル上の無矛盾性consistencyを強制するため、我々はボリュームアルベドとして表面のアルベドを直接的に用いることも行う。

我々は2つのアルベドテクスチャリングの選択肢を提案する:

  1. 散乱後テクスチャリングはアルベドテクスチャがすでにSSS由来の色にじみを含むときに使うべきである。これはスキャンや写真の場合に使われる。このモードでは、脱出位置で、一度だけアルベドを適用する。
  2. 散乱前および後テクスチャリングはアルベドを事実上ブラーする。これは、ある場合に望ましい、よりソフトでより自然に見える結果をもたらし得る。

表面下散乱(無効)#

両方のテクスチャリングモードの例をいくつか見ていこう。

WikiHumanプロジェクトで親切にも共有されkindly sharedているEmilyのオリジナルモデルから始めたい。

この画は明らかにいくらかのSSが必要である…

表面下散乱(散乱後)#

さて、これが、散乱後テクスチャリングを有効化したものである。

(行ったり来たりする)

思った通り、散乱後のオプションがディテールを維持することではより良い仕事をこなしていることに気付くかもしれない。

その差は微妙であるので、後に良いディスプレイ上でスライドを見ることをオススメする。

表面下散乱(散乱前および後)#

そして、これが散乱前および後テクスチャリングである。

(行ったり来たりする)

思った通り、散乱後のオプションがディテールを維持することではより良い仕事をこなしていることに気付くかもしれない。

その差は微妙であるので、後に良いディスプレイ上でスライドを見ることをオススメする。

表面下散乱の実装#

  • 拡散プロファイルは正規化される
    • これは実質的に幾何表面に沿ったエネルギー保存的ブラーである
  • スクリーン空間におけるバイラテラルフィルタで近似する[Mikkelsen 2010Mikkelsen, M. S. 2010. Skin Rendering by Pseudo-Separable Cross Bilateral Filtering. https://mmikk.github.io/papers3d/cbf_skin.pdf.]

Burleyの拡散プロファイルは正規化されているので、SSSはエネルギー保存的なブラーフィルタとして実装できる。

周囲の表面に渡って侵入点から再分配される光のエネルギーをイメージできる…

以前のアプローチと同様に、我々はスクリーン空間で畳み込みを行い、表面ジオメトリを計算に入れた深度バッファを用いる。

表面下散乱のアルゴリズム#

アルゴリズム全体をビジュアル的に概説しましょう。

ライティングパス:

表面の侵入点で入射する放射輝度を計算する

光の方向から表面へのディフューズ透過を処理する

テクスチャリングモードに依存して侵入点のアルベドを適用する

レンダターゲットに透過した放射輝度を記録する

SSSパス:

脱出点の周りの拡散プロファイルで放射輝度バッファのバイラテラルフィルタリングを処理する

テクスチャリングモードに依存して脱出点のアルベドを適用する

ビュー方向における表面の外側のディフューズ透過を処理する

理想的には、オブジェクトの表面を直接サンプリングすべきである(注)が、リアルタイムアプリケーションでは高価すぎる。

代わりに、我々はオフラインで事前計算し、(概念的に)円板上に配置するサンプルのセットを用いる。ここでは緑の破線で描かれる。

ほぼ間違いなくarguablyより悪いことは、円板から表面へのサンプルの投影が距離を歪ませるので、投影されたサンプルは最終的に異なる分布内となる。我々はこれについてなにかを行わなければならないが、まずは…

注:これは基本的にフォトンマッピングを用いるSSSである。

拡散プロファイルのサンプリング#

  • 拡散プロファイルに従って円板サンプリングを処理する
    • 良いサンプル分布が欲しい
      • パフォーマンス上の理由から、少ないサンプルのひとつひとつを有意義に使う!

…円板サンプリングについて話そう。

我々はパフォーマンス上の理由から少数のサンプルのみを取ることができる。つまり、我々はそのひとつひとつを有意義に扱う必要がある。

  • 拡散プロファイルに従って円板サンプリングを処理する
    • 重点サンプリングを行う --- PDFp(r)p(r)に従ってrrを分布させる
      • PDF: p(r)=s8π(esr+esr/3)p(r) = \frac{s}{8\pi}(e^{-sr}+e^{-sr/3})
      • CDF: P(r)=114esr34esr/3P(r) = 1 - \frac{1}{4} e^{-sr} - \frac{3}{4} e^{-sr/3}
      • ssはスペクトル値であり、(1/s散乱距離σ2)(1/s \propto 散乱距離 \propto \sigma^2)1であり、ssの最小値で色チャネルを重点サンプリングする

それ故に、我々は放射距離radial distanceを重点サンプリングする --- 拡散プロファイルのPDFに従ってこれらを分布させる。

形状パラメータssはスペクトル値であり、散乱距離に反比例する。それ自体は分散に比例する。できる限りの最良の分散低減を達成したいので、我々は最長の散乱距離に対応する色チャネルを重点サンプリングすることを選ぶ(肌では赤チャネル)。

  • 拡散プロファイルに従って円板サンプリングを処理する
    • 重点サンプリングを行う --- PDFp(r)p(r)に従ってrrを分布させる
      • CDFP(r)P(r)は解析的に可逆でない
      • Halley法を用いて数値的に逆関数を求める[Press et al. 2007Press, W. H., Teukolsky, S. A., Vetterling, W. T. and Flannery, B. P. 2007. Numerical Recipes: The Art of Scientific Computing.]
        • ssxxを仮定して、P(r,s)=xP(r, s) = xを解く
        • ニュートン法に似ているが、2つの微分が必要
        • 2〜4回の反復でフル浮動小数点精度に収束する

重点サンプリングでは、累積分布関数(CDF)を逆にする必要がある。

残念ながら、そのCDFは解析的に逆関数を求められないので、Halley法を用いて数値的に逆関数を求めるという最終手段を取るresort。これは、そうは言っても、実践においてかなり効率的である。

注:Halley法は、ニュートン法に続く、Householder法に分類される2つ目のアルゴリズムである。

  • 拡散プロファイルに従って円板サンプリングを処理する
    • フィボナッチ数列を用いて角度φ\varphiを一様にサンプリングする[Hannay and Nye 2004Hannay, J H and Nye, J F 2004. Fibonacci numerical integration on a sphere. Journal of Physics A: Mathematical and General 37, 48, 11591. 10.1088/0305-4470/37/48/005.]
      • 球や円板に分布する他のlow-discrepancy列より優れて一般に処理する[Marques et al. 2015Marques, R., Bouville, C., Santos, L. P. and Bouatouch, K. 2015. Efficient Quadrature Rules for Illumination Integrals.]
      • さすれば、拡散プロファイルでの畳み込みは単なるサンプル値と重みの内積である:
I2πni=1nR(ri)p(ri)L(ri,ϕi)=i=1nwiL(ri,ϕi)I \approx \frac{2\pi}{n} \sum_{i=1}^{n} \frac{R(r_i)}{p(r_i)} L(r_i, \phi_i) = \sum_{i=1}^n w_i L(r_i, \phi_i)

最後に極角polar angleを一様にサンプルするためにフィボナッチ数列を用いる。これは球や円板上に良いサンプル分布を生み、反射プロブフィルタリングのような、多くの文脈で有用である。

我々は円板に渡って畳み込みを行うためにモンテカルロ積分法を用いる。これはとどのつまりサンプル値と重みの内積になる。

重点サンプリング処理は結果としてこのように見え得る事前計算されたサンプルパターンをもたらす。

エネルギーのほとんどがそこに集中しているので、原点近くをより密にサンプルすることに注意してほしい。

バイラテラルフィルタリング#

サンプルを事前計算する方法を知った所で、平面の近似に戻ろう。

表面ジオメトリは円板に整列せず、そして、我々は事前計算されたサンプル用いるので、我々の唯一の選択肢はどうにかしてそのサンプルを再び重み付けすることである。これはバイラテラルフィルタリングと呼ばれる。

バイラテラルフィルタリングは畳み込みに深度を考慮させる。

これを正しく取り入れることは、品質の向上だけでなくフォアグラウンドへのバックグラウンドのにじみを回避するために、非常に重要である。逆もまた然り。

  • 非平面の表面にまたがってフィルタリング可能[Mikkelsen 2010Mikkelsen, M. S. 2010. Skin Rendering by Pseudo-Separable Cross Bilateral Filtering. https://mmikk.github.io/papers3d/cbf_skin.pdf.]
    • I2πni=1nR(ri,di)p(ri,di)L(ri2+di2,ϕi)I \approx \frac{2\pi}{n} \sum_{i=1}^n \frac{R(r_i, d_i)}{p(r_i, d_i)} L \left( \sqrt{r_i^2+d_i^2}, \phi_i \right)
  • 拡散プロファイルの放射対称性を用いると、以下を得る
    • I2πni=1nR(ri2+di2)p(ri,di)L(ri2+di2,ϕi)I \approx \frac{2\pi}{n} \sum_{i=1}^n \frac{R \left( \sqrt{r_i^2+d_i^2} \right)}{p(r_i, d_i)} L \left( \sqrt{r_i^2+d_i^2}, \phi_i \right)

畳み込みのモンテカルロの定式化を用いると、サンプルの重みは関数の値とPDFの比として定義される。

関数の値を修正することは簡単である --- 我々は侵入点と脱出点の間の実際のユークリッド距離を用いてプロファイルを計算するだけである。

注:解説を簡単にするため、計算は直角三角形right triangleを仮定し、それ故に、ピタゴラスの定理を用いる。一般的に言えば、同じように射影歪みperspective distortionを計算に入れる必要がある[Mikkelsen 2010Mikkelsen, M. S. 2010. Skin Rendering by Pseudo-Separable Cross Bilateral Filtering. https://mmikk.github.io/papers3d/cbf_skin.pdf.]

  • サンプル位置はすでに古い”平面”のPDFに従って分布しているので、PDFを修正することはそれほど単純ではない
    • 直観的には、p(x)1/A(x)p(x) \propto 1/A(x)
    • Ωf(x)dA(x)i=1nf(xi)A(xi)1ni=1nf(Xi)p(Xi)\int_{\Omega} f(x) dA(x) \approx \sum_{i=1}^n f(x_i) A(x_i) \approx \frac{1}{n} \sum_{i=1}^n \frac{f(X_i)}{p(X_i)}
    • 傾斜に従っていくつかのコサイン項を追加できるかも…
  • 実践では、表面の形状を計算に入れるのは難しい
    • SSで耳の表面積を計算してみる:-)

残念ながら、我々のサンプル位置がすでにこの古い”平面”のPDFに従って分布しているので、我々はPDFで同じことをできない。

モンテカルロ積分に対する公式と面積上の積分に対する求積quadrature公式を結びつけるmake a connection betweenならば、我々はPDFの値が各サンプルに関連する面積に反比例することを理解できる。

では、どうやってこの面積を計算するのか?表面についてのある仮定を作り、傾斜を考慮するいくつかのコサインファクタを追加できればあるいは…

しかしながら、一般的で堅牢な方法でこの問題を解くことは**難しいhard**。それは特にスクリーン空間における制限された情報に由来する。

  • サンプル位置はすでに古い”平面”のPDFに従って分布しているので、PDFを修正することはそれほど単純ではない
  • 代わりに、エネルギー保存則を単純に矯正する(1の分割partition of unityを満たすために重みを正規化する)
I=i=1nR(ri2+di2)p(ri)L(ri2+di2,ϕi)i=1nR(ri2+di2)p(ri)=i=1nwiL(ri2+di2,ϕi)i=1nwiI \approx = \frac{\sum_{i=1}^n \frac{R \left( \sqrt{r_i^2+d_i^2} \right)}{p(r_i)} L \left( \sqrt{r_i^2+d_i^2}, \phi_i \right)}{\sum_{i=1}^n \frac{R \left( \sqrt{r_i^2+d_i^2} \right)}{p(r_i)}} = \frac{\sum_{i=1}^n w_i L \left( \sqrt{r_i^2+d_i^2}, \phi_i \right)}{\sum_{i=1}^n w_i}

代わりに、我々は、我々のフィルタがエネルギー保存的であることを意味する、という事実を単純に活用し、合計が1になるように重みを正規化することができる。

近似の次数order of approximation#

円板にまたがってバイラテラルフィルタリングを行う方法を知った所で、この円板の位置と向きを決める方法を考えてみよう。

円板はワールドまたはカメラ空間でカメラレイとジオメトリとの交差点に必然的に配置される。

しかし、円板の向きはどうだろうか?我々にはいくつかの選択肢がある。

0次の近似はスクリーン平面と平行に円板を整列させることである。これはスクリーン空間における円板と直接的に対応する。

これは単純で高速だが、斜角oblique anglesでのジオメトリに対する不十分なサンプル分布をもたらし得る。

より良い解法は円板を表面の点の近傍のタンジェント平面と平行にすることである(1次の近似)。

これは、一般的にGバッファが補間された頂点法線を含まないので、チャレンジングになり得る。

そして、残念ながら、シェーディング法線を用いるとアーティファクトをもたらす可能性がある。これは、シェーディング法線がしばしば表面の点の周囲のジオメトリとほとんど共通点を持たずhas little in common with背を向くことback-facingさえあり得るためである。

触れておくべきこととして、実践においてナイーブな手法でもかなり上手く処理される。

半透明#

SSSは逆光back-litオブジェクトの半透明ルックに対する責任も持つ。

その下地となる物理的な処理は厳密に同じである一方、効率性の理由から、我々はこの効果をより単純な方法で扱う。

我々は2つの異なるアプローチを実装した。

1つ目は薄いオブジェクトでのみ動作し(一般的にfoliageで使われる)、2つ目はより一般的な半透明のケースを扱おうと試みる。

2つの間の主な違いは幾何的な厚さである。これは2つの異なる方法でシャドウを扱うことを強制する。

薄いオブジェクトの半透明#

  • [Jimenez et al. 2010Jimenez, J., Whelan, D., Sundstedt, V. and Gutierrez, D. 2010. Real-time realistic skin translucency. IEEE Computer Graphics and Applications 30, 4, 32–41. 10.1109/MCG.2010.39. https://www.iryoku.com/translucency/downloads/Real-Time-Realistic-Skin-Translucency.pdf.]の単純なモデルを用いる
    • 現在のピクセルに対して、そのジオメトリが、前面front-faceの法線を反転したものである後面back-faceの法線を持つ一定の厚さの平らな板planar slabであると仮定する
      • (法線に沿った)厚さはテクスチャマップで提供される
    • 後面全体が一定の照明を受けると仮定する
    • ジオメトリが薄いので、シャドウイングは前面と後面で同じである
    • 後面上で拡散プロファイルを解析的に積分する
      • I=02πrR(r2+t2)Lttdr=14A(est+3est/3)LttI = \int_0^\infty 2\pi r R(\sqrt{r^2+t^2})L_{tt}dr = \frac{1}{4} A(e^{-st}+3e^{-st/3})L_{tt}
    • 前述の通り、我々は2回透過し、前面のアルベドを適用する

薄いオブジェクトの半透明では、我々はJorge Jimenezによって提案される単純なモデルを用いる。

我々は現在のピクセルに対して、ジオメトリが、前面の法線を反転したものである後面の法線を持つ一定の厚さの平らな板であると仮定する。

厚さはアーティストがオーサリングしたテクスチャマップで提供される。

加えて、我々は後面全体が一定の照明を受けることを仮定する。

ジオメトリ自体が薄いので、シャドウイングは前面と後面で同じである。ゆえに、我々は1回のシャドウマップフェッチを共有できる。

この単純化されたセットアップを仮定すれば、後面上で拡散プロファイルの寄与を解析的に積分することが可能である。

そして前述の通り、我々は2回透過を行い、前面のアルベドを適用する。

厚いオブジェクトの半透明#

  • シャドウはジオメトリの厚さを考慮しなければならない
  • シャドウマップから厚さを計算しようと試みる[Barré-Brisebois 2011Barré-Brisebois, C. 2011. Approximating Translucency for a Fast, Cheap and Convincing Subsurface Scattering Look. Game Developers Conference. https://www.gdcvault.com/play/1014538/Approximating-Translucency-for-a-Fast.]
    • しかし、シャドウ精度は不完全であり、それ自体のアーティファクトをもたらし得る
    • シャドウマップが、オブジェクトは遮蔽されていない、とするならば、厚さは0である!
  • 複合combinedアプローチを用いる
    • max(textureThickness,shadowThickness)max(textureThickness, shadowThickness)を用いる
    • シャドウは厚さを計算するためだけに使い、実際のシャドウイングには使わない
      • shadowThicknessshadowThicknessが大きい場合、透過はライティングの減衰を行う
      • 直接および透過ライティングの両方に対してトータルで1つのシャドウサンプルのみを必要とする

より厚いオブジェクトでは、前面のシャドウイング状況を再利用することは明らかに機能しない(後面は前面に影を落とすので)。

まず、我々はシャドウマップによって与えられる最も近いオクルーダーへの距離を用いて単独でsolely実行時に厚さを計算しようと試みた。

このアプローチがシャドウマップの制限された精度のために微細な幾何的特徴に対して上手く機能しないことがすぐに明らかとなった。

代わりに、複合アプローチを選択した。我々は両方の手法を用いて厚さを計算し、その最大値を取る。これはアーティストに”焼き込まれた”厚さテクスチャを用いてシャドウマッピング問題を迂回する機会をもたらす。

この手法は明らかにいくらかの調整を必要とするが、いくらかの取り組みによってもっともらしい結果を達成できる。

最適化#

  • SSSはR11G11B10バッファでのフルスクリーンCSパスとして実装される
  • SSSパスのCSはGCNで高占有率になるようカリカリにheavily最適化される[Aaltonen 2017Aaltonen, S. 2017. Optimizing GPU occupancy and resource usage with large thread groups. GPUOpen. https://gpuopen.com/learn/optimizing-gpu-occupancy-resource-usage-large-thread-groups/.]
    • 32つのVGPR、38つのSGPR、16x16スレッドグループのサイズでの6656バイトのLDS
  • VRAMトラフィックを減らすために20x20近傍に対するL0キャッシュとしてLDSを用いる
    • LDSのバンク衝突を減らすためにSoAで放射輝度と線形深度を格納する
    • GCNのレンダターゲットのメモリレイアウトと合わせるためにZ階数曲線Z-order curve [Morton 1966Morton, G. M. 1966. A Computer-Oriented Geodetic Data Base, and a New Technique in File Sequencing.]に沿ってスレッドを順序付けする

実装詳細と効率化する方法について手短に…

先に述べた通り、我々はオフラインで重点サンプリングし、事前計算したサンプルのセットを実行時に用いる。

SSSパス自体はフルスクリーンのコンピュートシェーダとして実装される。これは帯域幅ヘビーであり、外部off-chipメモリのトラフィックを減らすためにLDSを多用する。

スレッドグループ&LDSの使い方#

スレッドグループ(数字で示される)は4つのwavefrontsから構成され、データ局所性を改善するためにZ階数曲線に沿って順序付された個々のスレッドを持つ。

LDSキャッシュ(色付きブロックで示される)は放射輝度と線形深度の値を含み、各ピクセルが少なくとも小さくキャッシュされる近傍を持つように2つのテクセル境界を持つ。

最適化#

  • Gバッファパスはマテリアルタイプでステンシルをタグ付けする
    • 早期脱出するためにHTile情報を抽出する
  • ライティングパスはマテリアル分類を用いる[Garawany 2016Garawany, R. 2016. Deferred Lighting in Uncharted 4. Advances in Real-Time Rendering in Games course. ACM SIGGRAPH. https://advances.realtimerendering.com/s2016/.]
    • SSSマテリアルは拡張された標準Litシェーダを用いる
    • SSSパス中にステンシルの読み出しを避けるためにSSSバッファをタグ付けする
    • ライティングパス中に侵入および脱出の両方の点の透過を適用する
      • 概念的には誤りだが、ビジュアル上の差異は最小限である
  • シェーダ内intra-shader離散的LODシステムを実装する
    • 1ピクセルのフットプリント以内の最大半径の円板 → 畳み込みなし
    • 4x4ピクセルのフットプリント以内の最大半径の円板 → 少なめのサンプルを用いる
    • 4x4ピクセルのフットプリント以上の最大半径の円板 → 多めのサンプルを用いる
    • 矛盾のないビジュアル、LOD”ポップ”なし

我々は基本的なLODシステムも実装した。

我々はフィルタのスクリーン空間のフットプリントに応じて3つの離散的段階にサンプル数を変化させる: サブピクセルサイズの円板ではフィルタリングを無効化し、中位のサイズでは21つのサンプルを使い、それ以外では55つのサンプルを使う。

ビジュアルは矛盾のないままであり、LODの遷移は見えない。

  • 無作為なカーネルの回転でアンダーサンプリングに対処する[Jimenez et al. 2015Jimenez, J., Zsolnai, K., Jarabo, A., Freude, C., Auzinger, T., Wu, X.-C., von der Pahlen, J., Wimmer, M. and Gutierrez, D. 2015. Separable subsurface scattering. Computer Graphics Forum 34, 6, 188–197. 10.1111/cgf.12529. https://www.iryoku.com/separable-sss/.]

我々はサンプル分布の無作為なピクセル毎の回転を行うことが重要であることも発見した。これはより目立ちにくいノイズと構造化されたアンダーサンプリングアーティファクトをトレードすることを可能にする。

パフォーマンス#

  • 1080pで基本のPS4上でテストする
  • ピクセルあたり21サンプル
  • CSは畳み込みを行い、スペキュラライティングと結果をマージする
  • GPU時間は1.16ms

ビジュアル比較: JimenezのSSSSアプローチ#

我々は比較のためにJorge Jimenezの最新の混合ガウスモデルも実装した。

その差異が確認できるなら、メガネは必要ないでしょう:-)

*行ったり来たりする*

単一のパラメータなので、Disneyのモデルは非常に制御しやすく、わずか数分でよい結果を達成できる。

ビジュアル比較: Disney BurleyのSSSSアプローチ#

ビジュアル比較: JimenezのSSSSアプローチ#

Disneyモデルの主な利点はよりシャープなビジュアルである。これは同じ散乱距離を与えるとより多くの法線マッピングの詳細を保持する。

同僚であるSebastien Lachambreへ、彼の顔のスキャンを使わせてくれたことへの多大な感謝を。

ビジュアル比較: Disney BurleyのSSSSアプローチ#

制限#

  • アンダーサンプリングは結果としてビジュアル上のノイズをもたらし得る

制限について手短に…

表面下散乱は拡散プロファイルと表面下ライティングバッファの畳み込みによって実装される。

拡散プロファイルは重点サンプリングされるが、ライティングはされない。故に、ライティング信号のアンダーサンプリングは結果として典型的な確率的ノイズをもたらし得る。

十分な照明下では、通常ビジュアル上の問題にならない。しかし、人工的なライティング条件では問題を引き起こし得る。

例えば、交互にlitと完全unlitを入れ替えるパッチの単純なチェッカーボードパターンは、技術的に言えば、帯域制限された信号ではない。

我々はノイズの量を減らすためにテンポラルアンチエイリアシングを用いる。

  • アンダーサンプリングは結果としてビジュアル上のノイズをもたらし得る
  • 散乱距離を大きな値に設定するとパフォーマンスを劣化させる可能性がある
  • 厚いオブジェクトの半透明は大きな厚さの値であまり正確ではない

我々の手法のもうひとつの制限は非常に大きなスクリーンフットプリントを持つカーネルである。サンプルは離れ離れになり、テクスチャキャッシュを滅茶苦茶にして、パフォーマンスを劣化させてしまう。

最後に、厚いオブジェクトの半透明は複雑な厚いオブジェクトに対して正確な結果をもたらすには仮定を立てすぎている。

今後の課題#

  • タンジェント空間の畳み込みに対するサポートを追加する
    • 深度バッファから堅牢なタンジェント空間の法線を計算する
  • 現在の”一定の厚さの一様に照らされる平板”モデルの先を征く
    • ライティングパス中に処理される[Jimenez and von der Pahlen 2013Jimenez, J. and von der Pahlen, J. 2013. Next Generation Character Rendering. Game Developers Conference. https://www.iryoku.com/stare-into-the-future/.]のブルートフォースな数値積分と概念的に似ている
      • 最も近い後面に対するディフューズライティングと深度を格納する
      • スクリーン空間の半透明パスを処理する
        • 後面から前面への寄与を累積すること以外は、SSSパスと本質的に同じもの

Footnotes#

  1. 訳注:\proptoは比例関係を表す。