2017-08-26 9 views
1

私の質問は、答えが別の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の意味は何ですか?それはどんなスケールで動作しますか?同様に、lodlevel()は、離散ミップマップレベルにどのように変換されますか? gradient2d()がテクスチャ座標の勾配を使用していると仮定して動作しますが、その勾配を使用してミップマップレベルを選択する方法はありますか?

さらに重要なことに、lod_optionsを省略すると、どのようにミップマップレベルが選択されますか?これは実行されている関数のタイプによって異なりますか?

sample()関数のデフォルトのno-lod-options指定の操作が(少なくともフラグメントシェーダでは)gradient2D()のようなものであれば、単純なスクリーンスペースの導関数を利用するのですか、それとも直接動作しますかラスタライザと補間されたテクスチャ座標を使って正確な勾配を計算しますか?

最後に、この動作はデバイス間でどのくらい一致していますか?古い記事(DirectX 9の古いもの)は、複雑なデバイス固有のミップマップ選択を参照していましたが、ミップマップの選択が新しいアーキテクチャでよりよく定義されているかどうかはわかりません。

答えて

0

これは、トライリニアフィルタリングと用語 『MIPマッピング』を導入しましたランス・ウィリアムズの論文"Pyramidal Parametrics"は、ポールから来た提案を持っている、非常に簡単に、あなたがhttps://computergraphics.stackexchange.com/に尋ねたほうが良いかもしれませんが比較的大きな課題であるが、 Heckbert(3頁1列目を参照)は、あるシステムではある程度はまだ使われているかもしれないと思います。

実際、MIPマップレベルを計算するアプローチは、通常、画面のピクセルが小さな円であることを前提としています。この円は、ほぼ楕円を得るためにテクスチャにマップすることができます。最高解像度マップのテクセルで表される長軸の長さを見積もります。これにより、どのMIPマップをサンプリングすべきかがわかります。たとえば、長さが6、つまり2^2〜2^3の場合は、MIPマップレベル2と3をブレンドしたいと考えています。

関連する問題