Metalではミップマップレベルはどのように計算されますか?


14

私の質問は、特にMetalに関するものです。なぜなら、別のAPIで答えが変わるかどうかわからないからです。

私がこれまでのところ理解していると信じているのはこれです:

  • ミップマップされたテクスチャには事前に計算された「詳細レベル」があり、元のテクスチャを何らかの意味のある方法でダウンサンプリングすることで、より低い詳細レベルが作成されます。

  • ミップマップレベルは、詳細レベルの降順で参照されます。レベル0は元のテクスチャであり、高レベルはその2のべき乗の縮小です。

  • ほとんどのGPUは、トライリニアフィルタリングを実装します。これは、各サンプルの2つの隣接ミップマップレベルを選択し、バイリニアフィルタリングを使用して各レベルのサンプルを選択し、それらのサンプルを線形ブレンドします。

私がよく理解していないのは、これらのミップマップレベルがどのように選択されるかです。Metal標準ライブラリのドキュメントでは、lod_options型のインスタンスを指定してもしなくても、サンプルを取得できることがわかります。この引数はミップマップレベルの選択方法を変更するものと思われ、lod_options2次元テクスチャには明らかに3種類あります。

  • bias(float value)
  • level(float lod)
  • gradient2d(float2 dPdx, float2 dPdy)

残念ながら、ドキュメントではこれらのオプションが何をするのかわからない。bias()自動的に選択された詳細レベルにバイアスがかかると推測できますが、バイアスのvalue意味は何ですか?どの規模で動作しますか?同様に、どのように離散ミップマップレベルlodlevel()変換されますか?そして、gradient2d()テクスチャ座標の勾配を使用するという仮定の下で動作する場合、その勾配をどのように使用してミップマップレベルを選択しますか?

さらに重要なのは、を省略した場合lod_options、ミップマップレベルはどのように選択されるのかということです。これは、実行されている機能のタイプによって異なりますか?

また、sample()関数のデフォルトのno-lod-options-specific操作がgradient2D()(少なくともフラグメントシェーダーで)次のようなことをすることである場合、単純な画面空間の派生物を利用するか、ラスタライザーおよび補間されたテクスチャ座標で直接動作しますか正確な勾配を計算するには?

最後に、この動作はデバイスごとにどの程度一貫していますか?古い記事(DirectX 9と同じ)は、複雑なデバイス固有のミップマップ選択について言及しましたが、新しいアーキテクチャでミップマップ選択がより適切に定義されているかどうかはわかりません。

回答:


17

Mipの選択は、今日、デバイス間でかなり標準化されています。ただし、異方性フィルタリングの要点の一部は例外です。これは、個々のGPUメーカーが定義する必要があります(そしてその正確な詳細は一般に公開されていません)。

ミップの選択について詳細に読むのに適した場所は、OpenGL仕様のセクション8.14「テクスチャの最小化」です。Metalでも同じように動作すると思います。(Apple ハードウェアとAPIの両方を作ることを考えて、何かを変更できたかもしれません...しかし、私は彼らが持っているとは思いません。)ここで要約します。

デフォルトのミップ選択(lod_optionsモディファイヤを使用しない)は、テクスチャ座標の画面スペースグラデーションを使用してミップレベルを選択します。基本的に、テクセルとピクセルの1:1マッピングに可能な限り近いミップレベルを選択しようとします。たとえば、グラデーションの長さがピクセルあたり4テクセルの場合、ミップレベル2(レベル0の1/4のサイズであるため、ピクセルあたり1ミクストテクセルが得られます)が選択されます。

トリリニアフィルタリングでは、通常、正確な 1:1マッピングに着陸しないため、最も近い2つのレベルを選択し、それらの間を線形補間します。これにより、カメラまたはシーン内のオブジェクトが移動するときにミップレベルがスムーズに移行します周り。

λλλλ=2.8

λログ21/4=2

さて、修飾子オプションについては:

  • biasλ
  • levelλλlod
  • gradient2dテクスチャ座標の暗黙的なスクリーン空間グラデーションの代わりに、独自のグラデーションベクトルを配置できます。残りのミップ選択とサンプリングプロセスは通常どおりに進行しますが、勾配が変更されます。これにより、異方性フィルタリングをカスタマイズできます。

フラグメントシェーダー以外の他のタイプのシェーダーでは、「スクリーンスペースグラデーション」の概念がないため、通常、後者の2つの操作のみが許可されます。暗黙的なグラデーションを使用しようとすると、コンパイルエラーが発生します。私はそれがMetalのやり方だとは思いませんが、それは他のAPIと連携することから期待することです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.