私の質問は、答えが別のAPIのために変わるかどうかわからないので、具体的にはメタルに関するものです。私は私がこれまで理解して信じて何ミップマップテクスチャはどのようにサンプリングされますか?
はこれです:
ミップマップテクスチャは下位の詳細レベルが何らかの意味のある方法で、元のテクスチャをダウンサンプリングすることによって作成された「詳細レベル」を、事前に計算しています。
ミップマップレベルは詳細レベルの降下レベルで参照されます。レベル
0
は元のテクスチャであり、上位レベルは2のべき乗の削減量です。ほとんどのGPUは、サンプルごとに2つの隣接ミップマップレベルを選択し、バイレベルフィルタリングを使用して各レベルからサンプルを抽出し、それらのサンプルを線形ブレンドするトリリニアフィルタリングを実装します。
私はこれらのミップマップレベルがどのように選択されているか分かりません。メタル標準ライブラリのdocumentationでは、lod_options
タイプのインスタンスを指定してもしなくても、サンプルを取得できます。私は、この引数は、ミップマップレベルが選択されている方法を変更することを前提としていますし、2Dテクスチャのためのlod_options
の3種類の明らかにあります。残念ながら
bias(float value)
level(float lod)
gradient2d(float2 dPdx, float2 dPdy)
、ドキュメンテーションはこれらのオプションの何が何を説明するのか気にしません。私はbias()
がいくつか自動的に選ばれたレベルの詳細をバイアスすると推測できますが、バイアスvalue
の意味は何ですか?それはどんなスケールで動作しますか?同様に、lod
のlevel()
は、離散ミップマップレベルにどのように変換されますか? gradient2d()
がテクスチャ座標の勾配を使用していると仮定して動作しますが、その勾配を使用してミップマップレベルを選択する方法はありますか?
さらに重要なことに、lod_options
を省略すると、どのようにミップマップレベルが選択されますか?これは実行されている関数のタイプによって異なりますか?
sample()
関数のデフォルトのno-lod-options指定の操作が(少なくともフラグメントシェーダでは)gradient2D()
のようなものであれば、単純なスクリーンスペースの導関数を利用するのですか、それとも直接動作しますかラスタライザと補間されたテクスチャ座標を使って正確な勾配を計算しますか?
最後に、この動作はデバイス間でどのくらい一致していますか?古い記事(DirectX 9の古いもの)は、複雑なデバイス固有のミップマップ選択を参照していましたが、ミップマップの選択が新しいアーキテクチャでよりよく定義されているかどうかはわかりません。