異方性フィルタリングは、通常、最新のGPUでどのように実装されていますか?


14

異方性フィルタリングは、「エイリアシングを回避するためのMIPマップテクスチャの試行によって通常失われるテクスチャの鮮明さを保持します」。ウィキペディアの記事は、それをどのように実装できるかについてのヒントを提供します(「異方性の任意の方向のテクスチャ(...)をプローブする」)。

プレゼンテーションのノートで説明されているテストで示唆されているように、さまざまな実装があるようです。物理ベースのレンダリングの近似モデルここに画像の説明を入力してください

異方性フィルタリングを使用するときに正しいMIPレベルを選択するために(現代の)GPUによって実行される具体的な計算とは何ですか?


3
の仕様GL_EXT_texture_filter_anisotropicは非常に詳細です。たぶん、プロセスをよりよく理解するのに役立つかもしれません。
-glampert

回答:


14

テクスチャフィルタリングハードウェアは、さまざまなミップマップレベルのいくつかのサンプルを取得します(サンプルの最大量は異方性フィルタリングレベルによって示されますが、特定のフィルタリング操作で取得されるサンプルの正確な量は、フラグメントの導関数間の比率に依存します。 )テクスチャ空間に斜めの角度で表面を見ながら円錐を投影すると、ほぼ楕円形の投影になります。これは、斜めの角度が長くなるほど長くなります。追加のサンプルは、この楕円の軸に沿って(正しいミップレベルから、提供される事前フィルタリングを利用するために)取得され、よりシャープなテクスチャサンプルを提供するために結合されます。

rip-mapping(Mipmappingに関するWikipediaの記事で言及されている)として知られる別の手法は現代のGPUでよく見られる、テクスチャの事前フィルタリングを使用します。ミップとは対照的に、テクスチャは均一に縮小されるのではなく、さまざまなheight-width-ratios(選択した異方性フィルタリングレベルに応じた比率まで)を使用して縮小されます。テクスチャの変形-またはトライリニアフィルタリングを使用している場合は2つの変形-が、歪みを最小限に抑えるためにサーフェスの角度に基づいて選択されます。ピクセル値は、デフォルトのフィルタリング手法(バイリニアまたはトリリニア)を使用して取得されます。リップマップはサイズが非常に大きいため、私が知っているハードウェアでは使用されません。ミップマップは追加の33%のストレージを使用しますが、リップマップは300%を使用します。これは、AFを使用してもテクスチャの使用要件が増加せず、帯域幅のみが増加することに注意することで確認できます。

さらに読みたい場合は、EXT_texture_filter_anisotropic OpenGL拡張機能の仕様をご覧ください。サンプルの計算に使用される式と、異方性フィルタリングを使用する場合のサンプルの結合方法について詳しく説明します。


5
RIPマップは、おそらく一般的な対角線の場合には役立たないため、おそらく使用されません。FWIW、Microsoft Refrastのコードを見つけることができれば、その中の異方性フィルターの実装は、おそらく今日のHWがどのようにそれを行うかについての良いリファレンスです。
サイモンF

1
「これは、AFを使用してもテクスチャの使用要件が増加せず、帯域幅のみが増加することに注意することで確認できます。」キラー引数。いい答えです!
デビッドクリ

「GPUでの高性能ソフトウェアラスタライゼーション」リンクでは、1回の通過で異方性フィルタリングのみが言及されており、詳細については言及されていません。だから、私はそれが有益な方法で関連しているとは思わないので、答えから編集します。
ユリックス

@SimonFは、追加の帯域幅要件がかなり怖いことも追加できます。
v.oddou

9

API要件は、仕様または拡張機能のいずれかに記載されています。ここに1つがあります:https : //www.opengl.org/registry/specs/EXT/texture_filter_anisotropic.txt

AF品質は多くのベンチマークの一部であったため、すべてのGPUベンダーが仕様から逸脱する可能性があります。また、現在の実装は、新しいワークロードが既存の近似に負荷をかけるため、進化し続けます。残念ながら、どちらが何をするのかを正確に知るには、いずれかの企業の一員である必要があります。しかし、品質と実装コストの昇順でリストされている以下の論文から可能性の範囲を評価できます。

仕様から引用:

 Anisotropic texture filtering substantially changes Section 3.8.5.
 Previously a single scale factor P was determined based on the
 pixel's projection into texture space.  Now two scale factors,
 Px and Py, are computed.

   Px = sqrt(dudx^2 + dvdx^2)
   Py = sqrt(dudy^2 + dvdy^2)

   Pmax = max(Px,Py)
   Pmin = min(Px,Py)

   N = min(ceil(Pmax/Pmin),maxAniso)
   Lamda' = log2(Pmax/N)

 where maxAniso is the smaller of the texture's value of
 TEXTURE_MAX_ANISOTROPY_EXT or the implementation-defined value of
 MAX_TEXTURE_MAX_ANISOTROPY_EXT.

 It is acceptable for implementation to round 'N' up to the nearest
 supported sampling rate.  For example an implementation may only
 support power-of-two sampling rates.

 It is also acceptable for an implementation to approximate the ideal
 functions Px and Py with functions Fx and Fy subject to the following
 conditions:

   1.  Fx is continuous and monotonically increasing in |du/dx| and |dv/dx|.
       Fy is continuous and monotonically increasing in |du/dy| and |dv/dy|.

   2.  max(|du/dx|,|dv/dx|} <= Fx <= |du/dx| + |dv/dx|.
       max(|du/dy|,|dv/dy|} <= Fy <= |du/dy| + |dv/dy|.

 Instead of a single sample, Tau, at (u,v,Lamda), 'N' locations in the mipmap
 at LOD Lamda, are sampled within the texture footprint of the pixel.

 Instead of a single sample, Tau, at (u,v,lambda), 'N' locations in
 the mipmap at LOD Lamda are sampled within the texture footprint of
 the pixel.  This sum TauAniso is defined using the single sample Tau.
 When the texture's value of TEXTURE_MAX_ANISOTROPHY_EXT is greater
 than 1.0, use TauAniso instead of Tau to determine the fragment's
 texture value.

                i=N
                ---
 TauAniso = 1/N \ Tau(u(x - 1/2 + i/(N+1), y), v(x - 1/2 + i/(N+1), y)),  Px > Py
                /
                ---
                i=1

                i=N
                ---
 TauAniso = 1/N \ Tau(u(x, y - 1/2 + i/(N+1)), v(x, y - 1/2 + i/(N+1))),  Py >= Px
                /
                ---
                i=1


 It is acceptable to approximate the u and v functions with equally spaced
 samples in texture space at LOD Lamda:

                i=N
                ---
 TauAniso = 1/N \ Tau(u(x,y)+dudx(i/(N+1)-1/2), v(x,y)+dvdx(i/(N+1)-1/2)), Px > Py
                /
                ---
                i=1

                i=N
                ---
 TauAniso = 1/N \ Tau(u(x,y)+dudy(i/(N+1)-1/2), v(x,y)+dvdy(i/(N+1)-1/2)), Py >= Px
                /
                ---
                i=1 
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.