1

textureQueryLod 呼び出しは、次の 2 つのコンポーネントを返します。

  1. x - 使用されるミップマップ レベルの比率を示します。
  2. y - 詳細レベル。

両方とも同じですか?

4

1 に答える 1

4

このような問題があり、GLSL 関数のクラスの基本的な API ドキュメントを調べても十分に答えられないことがわかった場合は、正式な GLSL 仕様を参照してください。

仕様、特にSection 8.9.1 - Texture Query Functionsを読むと、「使用される」ミップマップ レベルの非常に詳細な説明に出くわします。つまり、この値は、縮小 + ミップマップ フィルタリング中に最も近いミップマップ レベルを選択するために使用される分数コンポーネントです。

ミップマップ サンプルを解決するには、次の 2 つの方法があることを思い出してください。

  1. 最も近い 2 つのミップマップ LOD 間を補間します (線形ミップ フィルター)

    • これは、トライリニアフィルター の 3番目の 線形です。

  2. 最も近いミップマップ LOD をサンプリングする (最近接ミップ フィルター)

これで、155 ページの仕様に示されている疑似コードを理解するための理論的基礎が得られます。

float ComputeAccessedLod(float computedLod)
{
    // Clamp the computed LOD according to the texture LOD clamps.
    if (computedLod < TEXTURE_MIN_LOD) computedLod = TEXTURE_MIN_LOD;
    if (computedLod > TEXTURE_MAX_LOD) computedLod = TEXTURE_MAX_LOD;
    // Clamp the computed LOD to the range of accessible levels.
    if (computedLod < 0.0)
        computedLod = 0.0;
    if (computedLod > (float)
        maxAccessibleLevel) computedLod = (float) maxAccessibleLevel;
    // Return a value according to the min filter.
    if (TEXTURE_MIN_FILTER is LINEAR or NEAREST) {
        return 0.0;
    } else if (TEXTURE_MIN_FILTER is NEAREST_MIPMAP_NEAREST
               or LINEAR_MIPMAP_NEAREST) {
        return ceil(computedLod + 0.5) - 1.0;
    } else {
        return computedLod;
    }
}

この疑似コードには 3 つの分岐があります。

  1. サンプラーがミップマッピングをまったく使用しない状況を処理します
    • アクセスされる LOD は常に 0.0 です
  2. サンプラーが最も近いミップ フィルターを使用する状況を処理します。
    • アクセスされた LOD は最も近い整数です
  3. サンプラーが線形ミップ フィルターを使用する状況を処理します
    • アクセスされた LOD は、最も近い 2 つの整数 LOD の間にあります
    • この場合、 2 つのLOD がサンプリングされ、返された 1 つのサンプルが、この値の小数部分に基づいて両方の間で補間されます。

によって返される 2 番目のコンポーネントtextureQueryLod (...)は、クランプされていない整数の LOD です。

于 2013-10-28T22:14:31.640 に答える