私の質問は、特にMetalに関するものです。なぜなら、別のAPIで答えが変わるかどうかわからないからです。
私がこれまでのところ理解していると信じているのはこれです:
ミップマップされたテクスチャには事前に計算された「詳細レベル」があり、元のテクスチャを何らかの意味のある方法でダウンサンプリングすることで、より低い詳細レベルが作成されます。
ミップマップレベルは、詳細レベルの降順で参照されます。レベル
0
は元のテクスチャであり、高レベルはその2のべき乗の縮小です。ほとんどのGPUは、トライリニアフィルタリングを実装します。これは、各サンプルの2つの隣接ミップマップレベルを選択し、バイリニアフィルタリングを使用して各レベルのサンプルを選択し、それらのサンプルを線形ブレンドします。
私がよく理解していないのは、これらのミップマップレベルがどのように選択されるかです。Metal標準ライブラリのドキュメントでは、lod_options
型のインスタンスを指定してもしなくても、サンプルを取得できることがわかります。この引数はミップマップレベルの選択方法を変更するものと思われ、lod_options
2次元テクスチャには明らかに3種類あります。
bias(float value)
level(float lod)
gradient2d(float2 dPdx, float2 dPdy)
残念ながら、ドキュメントではこれらのオプションが何をするのかわからない。bias()
自動的に選択された詳細レベルにバイアスがかかると推測できますが、バイアスのvalue
意味は何ですか?どの規模で動作しますか?同様に、どのように離散ミップマップレベルlod
にlevel()
変換されますか?そして、gradient2d()
テクスチャ座標の勾配を使用するという仮定の下で動作する場合、その勾配をどのように使用してミップマップレベルを選択しますか?
さらに重要なのは、を省略した場合lod_options
、ミップマップレベルはどのように選択されるのかということです。これは、実行されている機能のタイプによって異なりますか?
また、sample()
関数のデフォルトのno-lod-options-specific操作がgradient2D()
(少なくともフラグメントシェーダーで)次のようなことをすることである場合、単純な画面空間の派生物を利用するか、ラスタライザーおよび補間されたテクスチャ座標で直接動作しますか正確な勾配を計算するには?
最後に、この動作はデバイスごとにどの程度一貫していますか?古い記事(DirectX 9と同じ)は、複雑なデバイス固有のミップマップ選択について言及しましたが、新しいアーキテクチャでミップマップ選択がより適切に定義されているかどうかはわかりません。