頂点シェーダーとフラグメントシェーダーの速度を個別にプロファイルするにはどうすればよいですか?


11

頂点またはフラグメントシェーダーがレンダリングパイプラインのボトルネックになっているかどうかを確認する方法を知りたいのですが。

OpenGLコマンド間のクロックチェックポイントを取得するためにターゲットを使用glQueryCounterすることについて読みましたGL_TIMESTAMPが、これらは異なるタイプのシェーダーを区別しません。

たとえば、GPUの1つのフレームのレンダリングに8ミリ秒かかった場合、頂点シェーダーに7ミリ秒かかり、フラグメントシェーダーに1ミリ秒かかったと言えますか?

回答:


12

頂点シェーダーとフラグメントシェーダーは順次ではなく同時に実行され、GPUはそれらの間で自動的に負荷を分散するため、一方に7ミリ秒、もう一方に1ミリ秒のような特定のタイミングを割り当てることはできません。

ただし、ボトルネックのある場所を測定する簡単な実験を行うことができます。すべての描画呼び出しについて、ビュー投影行列をすべてゼロに設定します。これにより、すべての頂点の位置がゼロになり、すべての三角形が縮退します。したがって、すべての頂点シェーダーの動作を維持しながら、すべてのラスタライゼーションとフラグメントシェーディングを短絡させます(実行時にマトリックスがゼロに設定されることを知らないため、シェーダーコンパイラーは何も最適化できません)。

行列をゼロにしてパフォーマンスを測定すると、GPUでの同時ラスター化やフラグメントシェーディングの作業なしに、頂点シェーダーだけを実行するのに必要な時間がわかります。次に、これを各パスの通常のレンダリングに必要な時間と比較できます。2つの時間が似ている場合、パスはおそらく頂点に強く拘束されています。ゼロ化されたマトリックスのレンダリングが大幅に高速である場合、それはおそらくピクセル境界です。中間結果を取得することもできます。これは、作業が2つにほぼ均等に分割されていることを示します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.