2

関数を使用してテクスチャを割り当てる場合、ここで説明するように、適切な値glTexImage*に設定し、その値までのすべてのレベルを指定する必要があることを知っています。glTexParameteri(GL_TEXTURE_MAX_LEVEL)

関数の場合もこれが必要になるとは思っていませんでした。glTexStorage*関数はレイヤーの数をパラメーターとして受け入れ、その数のレイヤーに事前にメモリを割り当てるためです。それでも、この方法で定義された不変のテクスチャをサンプリングできないことに気付きました - を呼び出すglGenerateMipmapか指定GL_TEXTURE_MAX_LEVELするまではlevels-1

なぜそれが必要なのかという公式の理由は見つかりませんでした。不変のテクスチャのパラメーターは、まあ、不変である (そして適切に初期化されている) と予想していました。この動作が正しいかどうか (およびその理由) を誰かが確認できますか? それともAMDドライバーのバグですか?

4

2 に答える 2

2

OK、私はそれを得たと思います:

のパラメータlevelsglTexStorage確かにテクスチャ オブジェクトに格納されていますが、思うように asGL_TEXTURE_IMMUTABLE_LEVELSではなく asGL_TEXTURE_MAX_LEVELです。

したがって、パラメータGL_TEXTURE_MAX_LEVELはデフォルトの大きな値のままです。(手動で変更することもできます。テクスチャ オブジェクトの不変フラグは、テクスチャ バッファとそのフォーマットにのみ関連し、バッファ データやパラメータには関連しません)。

テクスチャの不変性は、仕様に従って次のように LOD 計算に影響を与える必要があります。

TEXTURE_IMMUTABLE_FORMAT が TRUE の場合、レベルベースは範囲 [0; にクランプされます。レベル不変- 1]

したがってGL_TEXTURE_MAX_LEVEL、不変のテクスチャをそのまま (= 1000) にすると、 に設定した場合と同じ効果が得られますlevels-1

評決: ドライバーのバグ。ドライバーは明らかにこのクランプ手順を省略しています。

于 2012-12-13T12:47:27.210 に答える
1

ここで説明されているように、glTexParameteri(GL_TEXTURE_MAX_LEVEL) を適切な値に設定し、その値までのすべてのレベルを指定する必要があることはわかっています。

まあ、あなたはする必要はありません。GL_TEXTURE_MAX_LEVEL のデフォルト値は 1000 であるため、合理的に使用する画像ピラミッドよりも大きくなります。

それでも、glGenerateMipmap を呼び出すか、GL_TEXTURE_MAX_LEVEL をレベル 1 に指定するまで、この方法で定義された不変のテクスチャをサンプリングできないことに気付きました。

はい、それは画像ストレージが画像サンプリングとは無関係だからです。GL_TEXTURE_MAX_LEVEL の値は、実際のテクスチャ イメージ ストレージとは独立した、サンプリング時のイメージ アクセスに影響を与えるパラメータです (サンプラ オブジェクトにも設定できます)。レンダリング中に使用される画像の部分範囲のみを選択する場合、または割り当てられた画像ピラミッドのサブセットにのみ画像をアップロードする場合は、画像の指定に使用される画像ピラミッド レベルの範囲を変更することもできます。

明確にするために編集を言い換えました

于 2012-12-13T12:09:34.407 に答える