実際には、チェーン化シェーダは、単一のシェーダを使用して同じ作業を行う場合と比較して、どれだけのオーバーヘッドがかかりますか?チェインメタルシェーダとシングルシェーダのパフォーマンスはどちらですか?
つまり、シェーダをチェーン化して1つのモンスターシェイダーを開発する方がよいでしょうか?または、それらを連鎖させるオーバーヘッドは、可能な限り少ないシェーダを使用するように指示しますか?
例として、@ warrenmのサンプル「画像処理」projectを考えてみましょう。 gaussian_blur_2d
シェーダにはadjust_saturation
シェーダがチェーンされています。両方のシェーダを組み合わせて1つのシェーダにすると、パフォーマンスが大幅に向上するのでしょうか、それとも実質的に同じでしょうか?
私はそれを疑うことはありません。 GPUのテクスチャキャッシングとプリフェッチではサンプリングのレイテンシが大幅に削減され、ぼかしカーネル(特に非分割の2Dカーネル)と何かを組み合わせると、実際にはかなり多くの冗長な作業が行われます。彩度調整はおそらくrgbからhsvに変換され、1ピクセルあたり1回実行されればそれほど多くの指示はないが、小さな3x3 2Dぼかしカーネルのみを考慮すると、1ピクセルあたり9回、そのうち8回は完全に冗長です... –
ぼかしカーネルの出力ではなく、ぼかしカーネルの出力に対して彩度調整を行います。 – Columbo
少なくともモバイルデバイスの場合、私はColumboの答えに同意します。通常、単一のシェーダでパスを組み合わせる価値があります。 GPUだけでなくCPUの場合でも、例えばアンドロイド上で現在のレンダリングターゲットを切り替えてドローコールを実行すると、CPUコストは無視できないほどです...ドライバで何が起きているのかはっきりしませんが、レンダリングターゲットスイッチのコストは約0.2/0.3ms。 –