2009-06-28 21 views
19

私はコンピュータグラフィックスの論文を読んできましたが、シェイダーコードのテクスチャをクエリするコンテキストでは、「依存テクスチャの読み込み」または「依存テクスチャフェッチ」という用語がよく使われます。従属テクスチャの読み込みと、これと「通常の」テクスチャの読み込みの違いは何ですか?依存テクスチャとは何ですか?

答えて

23

「依存テクスチャ読み取り」は、1つのテクスチャルックアップ(または他のシェーダ内計算)の戻り値を使用して、2番目のテクスチャからルックアップする場所を決定するときです。重要なことは、シェーダの実行途中までテクスチャ座標(あなたが参照する場所)は決まっていないことです。シェーダで行うことのできる静的解析はありません(すべてのパラメータの値を知っていても)それは、座標が前倒しであることを教えてくれるでしょう。また厳密にはは、2つのテクスチャ読み取りを命令し、ドライバなどの最適化によって実行順序をどれだけ変更できるかを制限します。

古いグラフィックカードでは、この種のものにかなりの制限がありました。たとえば、あるポイント(IIRC)では、複数のテクスチャからルックアップできますが、少数の異なるテクスチャ座標でしかルックアップできません。ハードウェアは、特定の種類の依存テクスチャの読み込みが不可能であるか非常に非効率的であったかのように実際に実装されました。

最新の世代または2枚のカードでは、これについて心配する必要はありません。しかし、あなたは実際にそのようなことに細心の注意を払わなければならなかった数年前から本や記事を読んでいるかもしれません。

+8

実際、PowerVRによれば、かなり最近のハードウェアに注意を払う必要があります:-) http://bit.ly/yvSnM – Justicle

+0

私のGTX 570では、フラグメントシェーダの依存テクスチャルックアップは、独立したテクスチャルックアップよりも優れています。 (これは、私が作業していたエンジンをゼロから/ FPSを20 FPSに詰め込んだものです)幾何学シェーダの依存する「定数配列検索」を削除することで、ややスピードアップをやや少なくしました。 (プリミティブカウントはこの値に依存していました。)コンテキストはすべてです! – Philip

+0

これは間違っています。私の答えを見てください。 – benthehutt

10

通常のテクスチャの読み取りは、シェーダに渡されるテクスチャ座標を使用します。従属テクスチャの読み込みは、シェーダで以前にアクセスした別のテクスチャからフェッチされた値を使用して部分的に計算されたテクスチャ座標で行われます。したがって、第2のテクスチャアクセスは、第1のテクスチャアクセスからフェッチされた値に「依存する」。

21

受け入れられた回答(およびその下の回答)は、別のテクスチャの出力を使用して従属テクスチャの読み込みを誤って制限します。それは間違っている。

依存テクスチャは、シェーダプログラムに渡された正確な座標ではない座標で読み取られたテクスチャです。スウィズルしても、依存テクスチャが読み込まれます。

これはApple's OpenGL ES programming guideから直接取得したものです。

+0

ありがとう、@ benthehutt、私は私の答えで明らかにした。 –

関連する問題