フラグメントシェーダーでいくつかの重い計算があり、これは複数のパスで行われます。ただし、一部のフラグメントでは、1 回のパスだけで結果が準備できます。また、別のフラグメントでは、さらに多くのパスが必要です。
このため、しばらくすると多くのフラグメントが破棄されますが、ご存知のように、これらはおそらく他のすべてのフラグメントが完了するまでスレッドが停止しています。
私は考えていた。一部のopenglバージョン以降、フラグメントシェーダからステンシルバッファへの書き込みが可能になりました。特定のフラグメントで別のパスが必要ないことがわかっている場合は、ステンシル バッファーに書き込むことができます。次のレンダリング パスでは、ステンシル テストをオンにして、これらのフラグメントが再度計算されないようにすることができます。
私の質問: これにより、失速の問題を防ぐことができますか? これらのスレッドは、まだ処理されていないフラグメントを実行するために利用可能になり、各パスが次のパスのフラグメントを除去するときに、各パスが前のパスよりも高速になりますか?
つまり、計算する必要がある 16x16 のテクスチャがあるとします。最初のパスでは、256 個のフラグメントを計算する必要があります (16 個のコアがあるとします。これは 16 サイクルを意味します)。たとえば、この最初のパスの後、128 個のフラグメントについてさらに計算する必要があることがわかっていて、ステンシル バッファーで実行されたフラグメントをマークした場合、この 2 番目のパスは 2 倍の速度で実行されます (つまり、16 で 128 個のフラグメント)。コア = 16 ではなく 8 サイクル)?