Skip to content
Go back

Moment-based order-independent transparency

· Updated:

doi paper web

拙訳

  • 深度に対する透過率の関数を近似するモーメントbbを格納する:
    • b=EZ(b)=l=0n1ln(1αl)b(zl)b = \mathcal{E}_Z(\mathbf{b}) = \sum_{l=0}^{n-1}{-\ln{(1-\alpha_l)} \cdot \mathbf{b}(z_l)}
    • 詳細:
      • 透過率をalpha coverageで表現する:
        • T(zf)=l=0,zl<zfn1(1αl)T(z_f) = \prod_{l=0, z_l < z_f}^{n-1}{(1 - \alpha_l)}
          • zfz_fはフラグメントの深度値
      • 吸光度absorbanceを使うことで総乗を総和に変換する:
        • A(zf)=lnT(zf)=l=0,zl<zfn1ln(1αl)A(z_f) = -\ln{T(z_f)} = \sum_{l=0, z_l < z_f}^{n-1} -\ln{(1-\alpha_l)}
      • A(zf)A(z_f)は単調増加するので、累積分布関数とみなすことができる:
        • Z=l=0n1ln(1αl)δzlZ = \sum_{l=0}^{n-1}{-\ln{(1-\alpha_l)} \cdot \delta_{z_l}}
          • δzl\delta_{z_l}は各表面の深度と同じところで11になる関数
      • ZZを軽量な形式で表現するため、Moment Shadow Mapping[Peters and Klein 2015Peters, C. and Klein, R. 2015. Moment shadow mapping. Proceedings of the 19th symposium on interactive 3D graphics and games 7–14. 10.1145/2699276.2699277. https://momentsingraphics.de/I3D2015.html.]の方法を用いる
  • モーメントから再構築される透過率の関数を使ってシェーディングを行う:
    • l=0n1LlαlT(zf,b,β)\sum_{l=0}^{n-1}{L_l \cdot \alpha_l \cdot T(z_f,b,\beta)}
      • T(zf,b,β)=exp(A(zf,b,β))T(z_f, b, \beta) = \exp(-A(z_f, b, \beta))
        • zfz_fはフラグメントの深度値
        • β\betaは下界と上界を補間して、値を持ち上げるための重み
          • 0.250.25あたりでちょうどいい感じ
    • b0=0b_0 = 0のピクセルは透過しないので、早期にリターンする
    • 詳細:
      • Moment shadow mapの方法でZZの下界を計算する
        • 下界を使うことで、表面が自身を遮蔽しないことを保証することはできるけど、どうしても可視性のoverestimationが起こってしまう
      • この方法では上界を求めることもできる
      • β=0.25\beta = 0.25で補間して上界に寄せると、全体的な結果が良くなる
  • 精度による品質の低下を回避するため、zz空間を正規化する:
    • z=lnzvlnzminlnzmaxlnzmin21[1,1]z = \frac{\ln z_v - \ln z_{min}}{\ln z_{max} - \ln z_{min}} \cdot 2 - 1 \in [-1, 1]
      • zmin,zmaxz_{min},z_{max}は半透明物体すべてを包む境界球から導かれる
  • 結果を合成する:
    • exp(b0)Ln+1exp(b0)l=0n1αlT(zf,b,β)l=0n1LlαlT(zf,b,β)\exp(-b_0) \cdot L_n + \frac{1-\exp(-b_0)}{\sum_{l=0}^{n-1} \alpha_l \cdot T(z_f,b,\beta)} \cdot \sum_{l=0}^{n-1} L_l \cdot \alpha_l \cdot T(z_f,b,\beta)
      • LnL_nは不透明表面の放射輝度
      • 再構築された透過率は正確ではなく、単純に足し合わせるとエネルギー保存的ではないので、WBOIT[McGuire and Bavoil 2013McGuire, M. and Bavoil, L. 2013. Weighted blended order-independent transparency. Journal of Computer Graphics Techniques (JCGT) 2, 2, 122–141. http://jcgt.org/published/0002/02/09/.]の方法で正規化してバイアスを小さくする

冪モーメント(power moments)

  • 再構築アルゴリズム:
    • コレスキー分解を使ってqRm/2+1q \in \mathbb{R}^{m/2+1}に関して解く:
      • (b0b1bm/2b1b2bm/2+1bm/2bm/2+1bm)q=(1z01z0m/2)\left( \begin{matrix} b_0 & b_1 & \cdots & b_{m/2} \\ b_1 & b_2 & \cdots & b_{m/2+1} \\ \vdots & \vdots & \ddots & \vdots \\ b_{m/2} & b_{m/2+1} & \cdots & b_m \end{matrix} \right) q = \left( \begin{matrix} 1 \\ z_0^1 \\ \vdots \\ z_0^{m/2} \end{matrix} \right)
        • z0=zfz_0 = z_f
        • mmはモーメントの個数(偶数)
    • qm/2zm/2++q0z0=0q_{m/2} \cdot z^{m/2} + \cdots + q_0 \cdot z^0 = 0zzに関して解いてz1,,zm/2Rz_1, \dots, z_{m/2} \in \mathbb{R}を得る
    • 差商divided differencesを取ることでuRm/2+1u \in \mathbb{R}^{m/2+1}に関してVandermonde systemを解く:
      • (1z01z0m/21zm/21zm/2m/2)u=(v0vm/2)\left( \begin{matrix} 1 & z_0^1 & \cdots & z_0^{m/2} \\ \vdots & \vdots & \ddots & \vdots \\ 1 & z_{m/2}^1 & \cdots & z_{m/2}^{m/2} \end{matrix} \right) u = \left( \begin{matrix} v_0 \\ \vdots \\ v_{m/2} \end{matrix} \right)
        • v0=βv_0 = \beta
        • zl<z0z_l < z_0ならvl=1v_l = 1、そうでないならvl=0v_l = 0
    • j=0m/2bjuj\sum_{j=0}^{m/2} b_j \cdot u_jを返す
  • モーメントが4次か6次の場合はMSMの論文で堅牢なソルバが実装済み
    • MSMはb0=1b_0 = 1として実装されているので、 bbb0b_0で割ってからソルバに通して、得られた結果にb0b_0をかけ戻す
    • b0=l=0n1ln(1αl)b_0 = \sum_{l=0}^{n-1}{-\ln{(1-\alpha_l)}}は個別に格納する

三角法モーメント(trigonometric moments)

  • モーメント生成関数b\mathbf{b}にフーリエ基底関数を用いる
    • x(z)=exp(2πiz+12)Cx(z) = \exp(2\pi i \frac{z+1}{2}) \in \mathbb{C}
    • 丸め誤差には強くなるが、計算負荷は高くなる
  • SUSPENDED