こんばんきーつね。ども、Pocolです。
今日は…
[Wyman 2017] Chris Wyman, Morgan McGuire, “Hashed Alpha Testing”, I3D 2017, No.7, pp.1-9, 2017.
を読んでみようと思います。
いつもながら、誤字・誤訳があるかと思いますので,ご指摘いただける場合は正しい翻訳例と共に指摘していただけると大変助かります。
Abstract
レンダラーは、単純なプロキシジオメトリでアルファテクスチャを使用して複雑なシルエットをマスクアウトするアルファテストを適用します。広く使用されている一方で、アルファテストには、商業ゲームでは観察可能な文献では過小報告されている長年の問題があります:アルファマップされたポリゴンが距離と共に後退すると、ジオメトリが完全に消滅する可能性があります。仮想現実の中心窩レンダリングが広まるにつれて、周辺縮小化やプレフィルタリングが近くのオブジェクトにもこの問題を引き起こすため、この問題は悪化します。
確率的アルファテストとハッシュ化アルファテストという2つのアルゴリズムを紹介します。確率的アルファテストでは、固定のアルファ閾値\(\alpha_{\tau}\)を使う代わりに、ランダムに選ばれた\(\alpha_{\tau}\)以下のアルファを持つフラグメントを破棄します。ハッシュ化アルファテストは、\(\alpha_{\tau}\)を事前に選択するためにハッシュ関数を使用し、テンポラルフリッカーを抑える安定したノイズを生成します。
優れたハッシュ関数と入力があれば、ハッシュ化アルファテストは、従来のアルファテストよりもテンポラルフリッカーをもたらすことなく、遠くのジオメトリを維持します。ハッシュ化アルファテストと確率的アルファテストが、アルファトゥカバレッジと網戸透過にどのように適用されるか、また、確率的透過をどのように単純化するかについて説明します。
1 Introduction
何十年もの間、対話的レンダラーはアルファテストを使用し、アルファが指定された閾値\(\alpha_{\tau}\)を下回るフラグメントを破棄してきました。アルファ合成[Porter and Duff 1984]や次数に依存しない透明度[Wyman 2016a]が必要な透明なサーフェスには適していませんが、アルファテストはアルファマップに格納された2値の可視性をレンダリングする安価な方法を提供します。アルファテストは、ディファードレンダリング[Saito and Takahashi 1990]または複雑なポストプロセッシングを使用するエンジンで特に一般的です。今日、ゲームでは、葉、フェンス、デカール、その他の小規模なディテールのアルファテストが広く行われています。
アルファテストではアーティファクトが発生します。そのバイナリクエリは、テクスチャ空間で発生するアルファ境界(\(\alpha \approx \alpha_{\tau}\))上のエイリアスを問い合わせ、ジオメトリアンチエイリアシングを非効果的にします。ポストプロセス・アンチエイリアシングのみがこの問題に対処します(例えば、[Lottes 2009; Karis 2014])。テクスチャのプレフィルタリングは、ポストフィルタのアルファテストがまだバイナリ結果を与える場合に失敗します。
あまり知られていませんが、アルファマップされたジオメトリは、図1に示すように遠くに消えてしまうことがあります。学術的な文脈ではほとんど無視されていますが、ゲーム開発者はこの問題に頻繁に遭遇します(例えば、[Castano 2010])。シーン固有のチューニングやコンテンツ作成の制限によって、この問題は軽減されますが、完全に解決されることはありません。
この問題を解決するために、固定のアルファ閾値\(\alpha_{\tau}\)を、(0..1]で一様に選ばれた確率的閾値に置き換えることを提案します:
確率的テストでは:
これにより、高周波数の空間的およびテンポラルノイズが追加されるため、ハッシュ化アルファテストは同様ですが安定した動作をすることを示します。
本稿は以下の貢献をします:
- 確率的アルファテストは、離れたジオメトリであっても一貫したカバレッジを維持することを示します;
- ハッシュ化アルファテストが同様の利点を提供し、適切に選択されたハッシュ入力によって、従来のアルファテストに匹敵する空間的・時間的安定性を提供することを示します;
- 従来のアルファテストがすでに問題なく機能しているように、拡大されたサーフェスをノイジーにすることなく、これらのアルゴリズムをレンダラーに組み込みする方法を示します;
- 確率的アルファテストが確率的透明性 [Enderton et al.2010]に収束し、\(\alpha_{\tau}\)の十分な確率的サンプルがあればorder-independent transparencyが得られることを示します;
- 我々の新しいアルファテストをアルファトゥカバレッジと網戸透過に関連づけ、確率論とハッシングを使ってこれらのアルゴリズムをどのように改善できるかを示します。
2 Why Does Geometry Disappear?
アルファテストされたジオメトリが消えることは、学術的な文献ではあまり取り上げられていません。しかし、ゲーム開発者は繰り返しこの問題に遭遇します。Castano [2010]は、その原因を調査し、アドホックな先行解決策を説明しています。アルファテストされたジオメトリのカバレッジが失われる原因として、3つの問題があります:
アルファ分散の減少.
ミップマップ構築は、アルファチャンネルを繰り返しボックスフィルターし、より粗いミップマップレベルのアルファの分散を減らします。最も粗い詳細レベル(lod)では、単一のテクセルがベーステクスチャ上のアルファ、\(\alpha_{avg}\)を平均化します。多くのテクスチャは\(\alpha_{avg} \ll \alpha_{\tau}\)を含み、特にテクスチャがパディングを含む場合、より粗いlodでより多くの失敗したアルファテストを引き起こします(図2参照)。基本的に、より粗いミップでアルファテストに合格するテクセル比率は減少します。
離散可視性テスト.
アルファブレンディングとは異なり、アルファテストは2値の可視性を与えます。ジオメトリは各ピクセルで見えるか見えないかのどちらかになります。ジオメトリがビューアに近づいたり遠ざかったりすると、ピクセルは突然、カバーされたりされなかったりします。これにより、距離に応じてジオメトリが離散的に侵食されます(図3参照)。ある時点で、1ピクセル幅のジオメトリは0ピクセル幅のジオメトリに侵食され、消滅します。
粗いラスターグリッド.
十分な距離があれば、ビルボード化されたプロキシのジオメトリでさえサブピクセルになります。この場合、比較的粗いラスタライズグリッドではジオメトリのサンプリングが不十分です。ビルボードが画面にまったく表示されなくなり、カバレッジが見かけ上失われることがあります(図4参照)。我々のアルゴリズムではこの問題に対処していませんが、保守的なラスタライズとマルチサンプリングはこの問題を軽減します。
3 State of the Art in Alpha Testing
ゲーム開発者は、アルファマップされたジオメトリが消えてしまうことに何年も対処してきました。ゲームでは、フォリッジ、フェンス、髪の毛などが遠くから表示されることが多いからです。様々なテクニックがこの問題を解決するのに役立ちます。
テクスチャのミップマップレベルごとに\(\alpha_{\tau}\)を調整する.
ミップマッピングはアルファをフィルタリングするため、ミップレベルごとに\(\alpha_{\tau}\)を調整することで、分散の減少を補正することができます。\(A_0\)ピクセルをカバーし、\(a_0\)ピクセルがミップレベル0でアルファテストに合格した、スクリーンアラインされたアルファテスト済みのビルボードを考えてみましょう。遠くから見ると、このスクリーンアラインされたビルボードはミップレベル\(i\)を使用している可能性があります:
\begin{eqnarray}
a_0/ A_0 \approx a_i/A_i.
\end{eqnarray}
各ミップマップ [Castano 2010] に対してこの比率を維持するしきい値\(\alpha_{\tau} (i)\) を事前計算することができます。しかし、コンテンツはこのしきい値に影響を与えるため、テクスチャ間やミップレベル(つまり、\(\alpha_{\tau} (i, u, v)\))内でも異なります。完全なレベルごとのしきい値であっても、距離に伴ってジオメトリが消えるのを防ぐことはできません; 図3のフェンスは、ほぼ一定の\(\alpha_{\tau} (i)\) を持っていますが、距離が離れるとすぐに消えてしまいます。
常にもっとも微細なミップLODからサンプリングする.
フィルタリングはアルファ分散を減少させ、閾値\(\alpha_{\tau}(i)\)を変化させるので、常にミップレベル0から\(\alpha\)をサンプリングすることで些細な問題は回避されます。しかし、この場合、1ピクセルあたり2テクセルフェッチ(1つはRGB用、もう1つはアルファ用)のコストがかかるか、カラープリフィルタリングが不要になります。別の方法として、ミップマップの最大LODを手動で指定した \(i_{max}\) に制限し、\(i \gt i_{max}\) のときにレベル \(i_{max}\) を使用する方法があります。しかし、どちらのアプローチもテクスチャキャッシュをスラッシュさせ、テクスチャの詳細の時間的安定性を低下させます。
まず\(\alpha\)-テストでレンダリングし、次に\(\alpha\)-ブレンドでレンダリングする.
アルファテストの人気は、order-independent blendingの難しさに起因しています。ナイーブブレンディングは、透明なフラグメントによってZバッファが汚染されるとハレーションを引き起こします。最初にアルファテストを使ってレンダリングし、次にアルファブレンディングを使って再レンダリングすることで、Zバッファの汚染を減らすことができます[Moore and Jefferies 2009]。これは、透明なフラグメントが不透明なフラグメントを遮蔽しないことを保証しますが、アルファマップされたジオメトリを2回レンダリングする必要があり、ディファードシェーディングでは機能しません。
スーパーサンプリング.
バイナリ可視性を保存する場合、ベーステクスチャのアルファチャンネルは0または1のみを含みます。十分に密なスーパーサンプリングでは、常にフル解像度のテクスチャにアクセスでき、正確な可視性を提供します。しかし、必要な密度は、ジオメトリ変換やパラメータ化によって、任意に高くなる可能性があります。
アルファトゥカバレッジ.
\(n\)-サンプル・マルチサンプリングでは、アルファは離散化され、\(\lfloor n\alpha \rfloor\)個のディザバイナリーカバレッジサンプルを出力します[Kharlamov et al 2008]。通常、これらのディザパターンは固定されており、レイヤー間の相関を引き起こし、正しいマルチレイヤー合成を妨げます。Endertonら[2010]は、この問題に対処するために、ランダムなパターンの並べ替えを選択することを提案しています。
網戸透過.
現在では一般的ではありませんが、網戸透過は、ディザリングが複数のピクセルにわたって発生することを除けば、アルファトゥカバレッジに似た動作をします。網戸透過にはさまざまなマスク選択テクニックが存在しますが[Mulder et al. 1998]、ランダムなマスクパターンであっても、合成されたレイヤーとスクリーン上に見えるディザパターンの繰り返しに相関が生じます。
4 Stochastic Alpha Testing
確率的アルファテストの重要なアイデアは単純で、固定のアルファ閾値(\(\alpha_{\tau}=0.5\))を確率的閾値(\(\alpha_{\tau}=drand48()\))に置き換えることです。本質的に、これは、規則的なグリッドパターンからの1つのサンプル(すなわち、0.5で[0…1]をサンプリングする)を、1つの均一なランダムサンプルに置き換えます。
これにより、確率的透過性[Enderton et al. 2010]を単純化し、1ピクセルにつき1サンプルを使用します。これは些細なことのように思えますが、固定のアルファ閾値をランダムなものに置き換えることで、アルファマップされた表面が距離とともに消えることがなくなり、カバレッジが消える問題が解決されることがわかります(図5参照)。固定アルファ閾値の場合とは異なり、確率的サンプリングでは、可視性\(V=(\alpha \lt \alpha_{\tau}) \, ? \, 0 : 1\)は、\(\alpha\)の正しい期待値\({\mathbf E}[V]\)を持ちます。
しかし、1つのランダム・サンプルでは不十分で、連続的にキラキラ輝る大きなノイズが入ります(ビデオ参照)。フレーム間でランダムシードを再利用し、層別化を使用することで、静的ジオメトリのノイズを安定化させることができます。しかし、オブジェクトやカメラが動くと高周波ノイズが再発してしまいます。スーパーサンプリングは役立ちますが,1ピクセルあたり1サンプルを使用することは,フォワードシェーディングとディファードシェーディングで,MSAAなしで,ローエンドハードウェアでも動作するので,アルファテストの大きな魅力です。
5 Hashed Alpha Testing
ハッシュ化アルファテストでは、確率的アルファテストと同等の品質を目指すと同時に、従来のアルファテストと同等の安定性を達成します。
確率的サンプリングの代わりに、アルファ閾値を生成するためにハッシュ関数を使用することを提案します。適切なハッシュ関数には、\([0 .. 1)\)に一様に分布する出力を生成するものがあり、一様乱数発生器と直接置き換えることができる一方、入力を調整することでより細かい制御が可能になります。
空間的・時間的に安定した分布ノイズを得るために、以下のハッシュ特性を求めました:
- スイミングの見た目を避けるために、サーフェイスに固定されたノイズ;
- アルファマップが重なったレイヤー間の相関がない;
- そして、\(\alpha_{\tau}\)をほぼピクセル単位で離散化して出力するので、サブピクセルの平行移動は同じハッシュ値を返す。
5.1 Hash Function
我々のハッシュ関数は、それらの特性よりも重要ではありません。McGurie[2016]の以下のハッシュ関数\(f:{\mathbb R}^2 \rightarrow [0..1)\)を使います:
他のハッシュ関数も試してみましたが、(潜在的に)異なる乗数で入力をスケーリングして出力に同様の度数を得た後、ほぼ同等の結果を得ました。
3D座標をハッシュ化する場合、ハッシュ\(f:{\mathbb R}^3 \rightarrow [0..1)\)の方がよりコントロールしやすいかもしれません。2Dハッシュを繰り返し適用することで、うまくいきました:
5.2 Anchoring Hashed Noise to Geometry
サーフェイス上をスイミングするノイズを避けるため、hash()の入力はカメラやオブジェクトの動きに対して固定されていなければなりません。安定した入力の候補としては、テクスチャ、ワールド空間、オブジェクト空間の座標に基づくものがあります。
テクスチャのパラメタライズがユニークなシーンでは、テクスチャ座標がうまく機能します。しかし、多くのシーンにはそのようなパラメータ化がありません。
ワールド空間座標をハッシュ化することで、静的なジオメトリに対して安定したノイズが得られます。しかし、これは動的なジオメトリでは失敗します。オブジェクト空間座標は、スキニングや剛体変換、動的カメラに対して安定したハッシュを与えます。
座標フレームがサブピクセルになると、各ピクセルが異なる座標を使ってハッシュされた閾値を計算するため、安定性の向上はすべて消えてしまいます。そのため、オブジェクトの一部(例えば、各リース)ではなく、集合体サーフェイス全体(例えば、木)で一貫性のある座標を使用することが重要です。
5.3 Avoiding Correlations Between Layers
アルファマップされたサーフェスが重なっている場合、レイヤー間で同じような\(\alpha_{\tau}\)閾値を使用すると、ハードウェアのアルファトゥカバレッジで観察されるような望ましくない相関関係が生じます。これらの相関は、ウィンドウまたは視線空間の座標を持つときに最も顕著ですが、テクスチャ空間の入力でも発生する可能性があります。
ハッシュにz座標を含めると、これらの相関は些細なことで取り除かれます。潜在的な相関を避けるために、常に3D座標でハッシュすることを推奨します。
5.4 Achieving Stable Pixel-Scale Noise
遅い動きの下では、フレーム間に新しい閾値\(\alpha_{\tau}\)を必要としません。これは、重大なテンポラルノイズを引き起こすためです。ただし、\(\alpha_{\tau}\)はピクセル間で変化すると予想され、隣接するピクセル上の不透明度のディザリングが可能になります。これは、ピクセルスケールのノイズを使用し、サブピクセルの動きに\(\alpha_{\tau}\)を再利用することを示唆しています。ノイズはサーフェイスに固定されているため、大きな動きの場合は\(\alpha_{\tau}\)も再利用され、異なるピクセルになります。
5.4.1 Stability Under Screen-Space Translation in \(X\) and \(Y\)
安定したピクセルスケールノイズのために、オブジェクト空間座標をスクリーン空間微分で正規化し、クランプします。これにより、ピクセルスケール上のすべての値が同じハッシュ値を生成します:
ここで、pixScaleはobjCoordをスケーリングし、ハッシュ入力を(floor()を介して)ほぼピクセルスケールで離散化し、ピクセルサイズの領域内のすべての入力が同じハッシュ値を返すようにします。ユーザ・パラメータ g_HashScale は、ピクセル単位で目標とするノイズスケールを制御します(デフォルトは 1.0)。g_HashScaleを変更すると、選択したハッシュが別の周波数でノイズを出力する場合に便利です。また、テンポラルアンチエイリアシングを行う場合、ピクセルスケール以下のノイズ(例えば、0.3-0.5)を使用することで、時間的平均化を行うことができます。
5.4.2 Stability Under Screen-Space Translations in \(Z\)
このアプローチでは、垂直方向と水平方向の小さな平行移動に対して安定したノイズが得られます。しかし、カメラのz軸に沿って移動すると、導関数dFdx()とdFdy()が変化するため、ハッシュ入力が絶えず変化します。これにより、\(\alpha_{\tau}\)の閾値がフレームごとにハッシュによって効果的にランダム化されるため、確率的アルファテストに匹敵するノイズの多い結果が得られます。
z-平行移動下で安定させるためには、そのような運動によって引き起こされる変化を離散化する必要があります。この場合、変化するのはpixDerivだけなので、これを離散化することで必要な安定性が増します:
しかし、pixDerivが多くのピクセルで同時に離散的な値の間で変化する場合、例えば、ビューに整列した大きなビルボードを描くときなど、これはまだ不連続性を示します。理想的には、以下のように、pixDerivの2つの離散的な値に基づくハッシュの間を補間することによって、ノイズをゆっくりと継続的に変化させることです:
これでほぼ目的は達成できますが、2つの問題があります。まず、\(0 \leq {\rm maxDeriv} \lt 1\)の場合に失敗します。これを解決するために、pixDerivをリニアスケールで離散化する代わりに、pixScaleを対数スケールで離散化します:
より厄介な問題は、補間の際に生じます。よく設計されたハッシュ関数\(f: {\mathbb R}^2 \rightarrow [0..1)\)は、\([0..1)\)に一様に分布する出力値を生成します。\([0..1)\)に一様分布する2つの値の間を補間しても、\([0..1)\)に一様分布する新しい値は得られません。これは、ハッシュ化されたノイズの分散が運動中に変化するため、閃光を発することをもたらします。
幸いなことに、(補間した2つの一様乱数値の)累積分布関数を計算し、補間した閾値を代入することで、出力を一様分布に戻すことができます。累積分布関数は
\begin{eqnarray}
{\rm cdf}(x) = \begin{cases}
\frac{x^2}{2a(1-a)} & 0 \leq x \lt a \\
\frac{x-a/2}{1-a} & a \leq x \lt 1-a \\
1 – \frac{(1-x)^2}{2a(1-a)} & 1-a \leq x \lt 1
\end{cases} \tag{1}
\end{eqnarray}
\(a\) = min(lerpFactor, 1 – lerpFactor)です。
これらの改良を組み合わせることで、リスト1に示す\(\alpha_{\tau}\)の最終的な計算が得られます。
5.5 Implementation Considerations
ハッシュ化されたアルファテストをレンダラーに追加する場合、遠くのアルファマップされたジオメトリのフェードアウトを回避することが目的でしょう。伝統的なアルファテストは近くのジオメトリには問題なく機能し、近くのエッジに沿って安定したノイズがあることは望ましくないかもしれません。
5.5.1 Fading in Noise with Distance
幸いなことに、アルファの閾値を次のように設定することで、ハッシュ化ノイズをフェードインすることができます:
\begin{eqnarray}
\alpha_{\tau} = 0.5 + \delta
\end{eqnarray}
ここで、伝統的なアルファテストでは\(\delta=0\)であり、hasedとstochasticのバリエーションでは\(\delta \in (-0.5..0.5]\)です。我々はこれを次のように修正することを提案します:
\begin{eqnarray}
\alpha_{\tau} = 0.5 + \delta \cdot b({\rm lod}), \tag{2}
\end{eqnarray}
\(b({\rm lod})\)はノイズの中でゆっくりとブレンドされるもので、すなわち、ハッシュ化アルファテストに完全に依存するほど粗い\({\rm lod}=n\)に対して\(b(0)=0\)と\(b(n)=1\)でした。\(n\)の値は、テクスチャサイズとノイズの許容値によって異なります。全ての実験で\(n=6\)がうまく機能することが分かりました。
\(b\)をリニアにランプしても、カメラに近すぎるノイズが発生することがわかりました。次のような2次関数的なランプは、良好な遷移を与えます:
\begin{eqnarray}
b(x) = \begin{cases}
0 & x \leq 0 \\
(x/n)^2 & 0 \lt x \lt n \\
1 & x \geq n
\end{cases} \tag{3}
\end{eqnarray}
異方性フィルタリングはより細かいミップレベルに繰り返しアクセスするため、比較的低いミップレベルでもアルファジオメトリがフェードアウトしてしまいます。\(b(x)\) を計算する前に異方性に基づいて \(x\) をスケーリングすると、これが修正されます:
異方性が高くなると\(x\)が増加し、式2の\(\alpha_{\tau}\)が大きく変化し、これらの消失するアルファマップがグレージング角度で固定されます。
5.5.2 Using Premultiplied Alpha
ハッシュ化されたアルファテストは、標準的なアルファテストよりもやや大きな領域からディフューズテクスチャサンプルにアクセスするため、特にテクスチャの大きな領域からフィルタリングする場合、高いミップレベルでは、アーティストが透明領域に追加した描画中のディフューズカラーをサンプリングしないように注意する必要があります。
私たちは、正しくミップマップし、この問題を回避する事前乗算アルファを使用することを推奨します(例えば、さらなる議論についてはGlassnerの[2015]の研究を参照)。しかし、事前乗算されたアルファテクスチャは\((\alpha R, \alpha G, \alpha B, \alpha)\)を格納するので、サンプルカウントを増加させるときにグランドトゥルースへの収束を維持するために、アルファテストされた色\((R, G, B)\)を再作成する前にアルファで割る必要があります。
ハッシュ化されたアルファのテストは、非前乗算拡散テクスチャでは機能しますが、ハッシュ化された\(\alpha_{\tau} \lt 0.5\)の場合、色が透明なテクセルから滲み、アルファ境界で任意色のハローが発生することが頻繁に見つかりました。
6 Applications to Alpha-to-Coverage
セクション3で述べたように、アルファトゥカバレッジはフラグメントアルファを離散化し、\(n\)-サンプルバッファ上でディザリングされた\(\lfloor n \alpha \rfloor\)カバレッジビットを出力します。\(\lfloor n \alpha \rfloor\)個のカバレッジビットを生成することは、アルファの閾値をスーパーサンプリングすること、すなわち、閾値を用いたn回のアルファテストを実行することと等価です:
\begin{eqnarray}
\alpha_{\tau} = \frac{0.5}{n}, \frac{1.5}{n}, \cdots, \frac{n – 0.5}{n} \tag{4}
\end{eqnarray}
この観察から、従来のアルファテストは\(n=1\)の特殊なケースであることがわかります。
アルファトゥカバレッジにハッシュ化アルファテストや確率的アルファテストを適用することは、閾値をジッターサンプリングすることに等しいです:
\begin{eqnarray}
\alpha_{\tau} = \frac{\chi_1}{n}, \frac{1 + \chi_2}{n}, \cdots, \frac{n-1 + \chi_n}{n}, \tag{5}
\end{eqnarray}
ハッシュ化されたサンプル\(\chi_i\)に対して \(\chi_i\)は、サンプルごとに独立して選択することも、フラグメントごとに1回選択することもできます(すなわち、\(\chi_i=\chi_j\))。
従来のアルファトゥカバレッジでは、同じアルファを持つすべてのフラグメントに対して固定のディザパターンを使用していました。このため、重なり合う透明なフラグメント間に相関関係が生じ、集合的なジオメトリの不透明度が失われます(図1参照)。
これを避けるために、フラグメントごとのオフセット\(\alpha_o\)を計算し、\(\alpha_{+}\)をインクリメントし、サンプルごとのアルファ閾値を適用します:
\begin{eqnarray}
\alpha_{\tau} = \frac{ \chi_i + ((\alpha_o + i\alpha_{+} \, {\rm mod} \, n) }{n}, \forall i \in [0 \cdots n-1]
\end{eqnarray}
ハッシュ化された\(\xi_1, \xi_2 \in [0..1)\)が与えられ、\(n\)を2のべき乗に制限すると、\(\alpha_o = \lfloor n \xi_1 \rfloor\)は0から\(n-1\)までの整数、\(\alpha_{+} = 2 \lfloor 0.5 n \xi_2 \rfloor + 1\)は1から\(n-1\)までの奇数整数となります。\(\xi_1\)または\(\xi_2\)がカメラからの距離によって変化する場合、これはジッターされた閾値をデコレートします。
6.1 Applications to Screen Door Transparency
網戸透過は、複数のサブピクセルサンプルではなく、複数のピクセルにわたってカバレッジビットをディザリングするだけです。そのため、インターリーブされた\(\alpha_{\tau}\)閾値のランダム化とレイヤー間の非相関は、ピクセル内ではなくピクセル間で発生する可能性があります。
7 Comparison to Stochastic Transparency
確率的アルファテストは、基本的に、確率的な透明度を1ピクセルあたり1サンプルに単純化します。したがって、ピクセルあたりにより多くのテストを使用するとき、確率的アルファテストは、確率的透明性がそうであるように、グラウンド・トゥルースに収束します。
このように考えると、式4の閾値に基づくと、アルファトゥカバレッジは、ランダムなサンプルではなく、規則的なサンプルによる確率的透過性となります。式5のようにランダムな閾値を使用することは、層化された確率的透過性に相当します。
しかし、重要な違いは、アルファテストは1ピクセルあたり1サンプルで動作するように設計され、頻繁に期待されていることです。時間的、空間的なノイズを避けることが採用の鍵であり、それゆえ我々の安定したハッシュ化アルファテストは、従来のアルファテストに代わる魅力的な選択肢を提供すると信じています。
8 Results
我々は、Falcorプロトタイピング・ライブラリ[Benty 2016]を使用して、OpenGLベースのレンダラーでハッシュ化と確率的アルファテストをプロトタイプ化しました。最適な性能よりも安定したノイズを求めたため、特に確率的アルファテストでは性能の最適化は行いませんでした。タイミングには、ハッシュ、フェードイン関数、およびその他の正規化要素のバリエーションを探索するためのロジックが含まれています。
表1は、すべてのサーフェスに1つのシェーダーを使用し、透明と不透明、\(1920 \times 1080\)でレンダリングした場合の、従来のアルファテストに対するパフォーマンスを示しています。テクスチャやグローバルメモリアクセスを追加することなく、すべての計算でハッシュ化アルファテストのオーバーヘッドを追加しました。我々の確率的アルファテストのプロトタイプは、ランダムなシードテクスチャを使用し、シードの再利用による相関を避けるために同期を必要とします。これは大幅な速度低下を引き起こします。
コストは、アルファマップされたサーフェスの数、深度の複雑さ、スクリーンのカバー範囲によって異ります。\(1920 \times 1080\)で、フラグメントごとに1つのテストを行う場合、アルファマップされたフラグメントの数が一般的なシーンでは、ハッシュ化されたアルファテストのコストは、1フレームあたり0.1~0.3ミリ秒追加されます。確率的アルファテストの場合、同期コストは奥行きが複雑なシーンで大きく増加します。
図1は、アルファマップされたヘアビルボードを持つゲーム品質の頭部モデルです。距離が離れると、髪の毛は消えます。これは、あごに髪が描かれていないディフューズテクスチャの下にあるため、あごひげで最もよくわかります。このモデルとのダイナミックな比較については、補足ビデオを参照してください。
図6は、XFrogがサンプルとして提供した、多くのアーティストが作成した樹木モデルでの同様の比較を示しています。これらの樹木のアルファマップには50~70%のトランスペアレントピクセルが含まれているため、遠景や低解像度でレンダリングすると葉がすぐに消えてしまいます。ハードウェアアクセラレーションによるアルファトゥカバレッジは、レイヤー間の相関性が高いため、葉が単一レイヤーとして表示され、過度に透過してしまいます。ハッシュ化アルファテストとハッシュ化アルファトゥカバレッジは、これらの問題を修正し、低解像度でレンダリングしたにもかかわらず、よりグラウンド・トゥルースに近い表示になります。
図7は、異方性フィルタリング下でのハッシュ化アルファテストの挙動を示しています。従来のアルファテストでは、チェーンリンクフェンスはすぐに消えてしまいますが、ハッシュ化アルファテストでは遠くのディテールが残っています。しかし、フェンス上の近くのチェーンでさえもエッジにノイズがあります。セクション5.5.1の詳細度制御に基づく遷移は、カメラに近いアルファテストに切り替えながら、遠くのノイズの多いディテールを維持します。動きのある場合の動作については動画をご覧ください。
図8は、より複雑な例を示しています。この例では、ハッシュ化されたノイズが近傍で望ましくない可能性があり、セクション5.5.1のフェードインによって、視聴者の近くで鮮明なエッジが維持されます。
図9は、従来のアルファテスト、ハッシュ化アルファテスト、確率的アルファテストの時間的安定性を、わずかなサブピクセルの動きのもとで比較したものです。同じサブピクセル動きの下では、ハッシュ化アルファテストは従来のアルファテストとほぼ同等の時間的安定性を示すことに注意してください。確率的アルファテストと、ノイズを固定したりピクセル単位に離散化したりしない方法は、著しく不安定性を示します。
遠方または低解像度のアルファマップされたジオメトリに使用する以外にも、ハッシュ化アルファテスト用のアプリケーションが存在します。仮想現実のヘッドマウントディスプレイでは、特にディスプレイの解像度が高くなると、ユーザーの周辺部でのフル解像度でのレンダリングは計算上無駄になります。代わりに、中心窩レンダリング[Guenter他2012]は、ユーザーの視線から離れた場所で低解像度でレンダリングされます。Patneyら [2016] は、すべてのレンダリング項を事前フィルタリングすることを提案していますが、結果を事前フィルタリングできないため、アルファテストをサポートできませんでした。中心窩レンダリングでのナイーブなアルファテストでは、周辺部で近くの葉さえも消えてしまいます (図10参照) 。テンポラルアンチエイリアシングを使用すると、ハッシュ化されたアルファテストによって、中心窩レンダラでアルファマップされたジオメトリを使用できるようになります。
図11は、より複雑な環境でのハッシュ化アルファテストを示しています。シーンのスケールが十分に小さく、非常に粗いミップマップにアクセスするピクセルを最小限に抑えることができるため、結果はより微妙なものとなります。
9 Conclusions
アルファマップされたジオメトリが距離とともに消えてしまう問題を解決するために、2つの新しいアルゴリズムを導入しました。確率的アルファテストは、固定された閾値ではなく、ランダムに選ばれたアルファテスト閾値\(\alpha_{\tau}\)を使用します。これでは時間的なノイズが発生するため、ハッシュ関数を用いて手続き的に生成された安定したノイズを提供するハッシュ化アルファテストを開発しました。
2つのスケールで離散化された物体空間座標をハッシュ化することで、安定したピクセルスケールのノイズを得ました。補間されたハッシュ値が一様な分布を保つようにする方法を示し、図9と添付のビデオで時間的安定性を実証しました。ハッシュテストを再現するためのインラインコードも提供しました。
\(\alpha_{\tau}\)を変化させながらアルファトゥカバレッジと網戸透過化について考えることで、これらすべてが透明化のための異なる離散サンプリング戦略であることを示す洞察が得られます:アルファテストとアルファトゥカバレッジは通常のサンプリングを行い、網戸透過化は反復サンプリングを行い、確率的アルファテストはランダムにサンプリングし、ハッシュ化アルファテストは一様なハッシュ関数を介した準ランダム・サンプリングを使用します。
我々のハッシュ化テストは、シーンに依存しないパラメータで空間的・時間的に安定したノイズを提供しますが、2Dと3Dのハッシュ関数の空間を探索し、フレーム間のフリッカーを最小化するのはどれかを調べることはしませんでした。さらに、物体空間座標よりも洗練されたハッシュ入力は、より多様な高度にインスタンス化されたシーンで一般化するかもしれません。この2つの分野は、今後の研究にとって有益であると思われます。
10 Acknowlegements
このアイデアはより大きなプロジェクトから生まれたもので、多くの研究者が間接的に貢献したことを意味します。式1のcdfを導出してハッシュの一様性を維持してくれたPete Shirley、研究する価値のある単純化されたドメインとしてアルファマップを提案してくれたCyril Crassin、安定したノイズに関する議論をしてくれたAnton Kaplanyan、彼の中心的なレンダラにハッシュテストを追加してくれたAnjul Patney、より大きな研究の方向性に関する議論をしてくれたDave Luebke、Aaron Lefohn、Macro Salviに特に感謝します。