深度、normal.x、normal.y を持つ RGBA16F テクスチャがあります。r、g、b を読み取り、テクスチャの a に書き込みたいです。すべてのピクセルを 1 回だけヒットします。
この場合、同じテクスチャに対して読み取りと書き込みを行うと、パフォーマンスの問題は発生しますか?
パフォーマンスの問題はありません。機能上の問題が発生します。のように、それは動作しません。
FBO 経由で書き込んでいるイメージから読み取ることはできず、妥当な結果が得られるとは期待できません。それは未定義の動作をもたらします。
読み取り/書き込みを行うためにshader_image_load_storeを使用していた場合は、それを回避できる可能性があります。しかし、それでも、それは読み取り/変更/書き込み操作です。読んだアルファを書き戻す必要があります。
そうは言っても、「すべてのピクセルを1回だけヒットする」ことが確実な場合(強調を追加)、頼りになります。つまり、NV_texture_barrierです。この拡張機能の「NV」に惑わされないでください。AMD ハードウェア (すべての HD シリーズ カード) にも広く実装されています。この拡張機能を使用すると、「バリア」関数 (事実上、GPU にフレームバッファーとテクスチャ キャッシュをクリアするように指示する関数) を使用できます。この関数を呼び出した後、フラグメント シェーダーで読み取り/変更/書き込みのパスを1 つだけ実行できます。 . その 1 つのパスの後、それと 2 番目のパスの間に別のバリアが必要です。
この場合、同じテクスチャに対して読み取りと書き込みを行うと、パフォーマンスの問題は発生しますか?
テクスチャはデータ ソースまたはターゲットのいずれかであり、相互に排他的です。両方のテクスチャを同時に使用することはできません。
また、テクスチャ書き込み (画像書き込み) は OpenGL-4.2 でのみ導入されましたが、GPU はスキャッター書き込みではなくギャザー読み取り用に最適化されているため、あまりパフォーマンスが高くありません。
1 つのテクスチャから同時に読み取りと書き込みを行うことはできません。これを回避するには、通常、別のテクスチャを作成して、あるテクスチャから読み取り、別のテクスチャに書き込むようにします。これら 2 つのテクスチャは、シェーダーで一緒に、または個別に読み取ることができます。
これは、最初に書き込んでから結果をテクスチャにコピーできる場合に実行できます。この場合、最初にシェーダーを使用してレンダリングし、すべてのレンダリングが完了したら、結果を次のようにテクスチャにコピーします。
glTexImage2D(GL_TEXTURE_2D, 0,GL_RGB, windowWidth, windowHeight, 0,GL_RGB, GL_UNSIGNED_BYTE, 0);
また、このテクスチャをシェーダーの入力として使用します。