imageStore 関数を使用して uimage のテクセル (常に同じもの) に書き込む #version 420 GLSL 頂点シェーダーがあります。(実際のリリース バージョンでは、複数のテクセルを使用するため、このセットアップはパフォーマンス測定の極端なテスト ケースにすぎません。)
私は2つの異なる方法を試しました:
「layout(r32ui) coherent uniform uimage2D」への書き込み、つまり、GL_TEXTURE_2D を画像ユニットにバインドしました
'layout(r32ui) coherent uniform uimageBuffer' への書き込み、つまり、GL_TEXTURE_BUFFER をイメージ ユニットにバインドし、それ自体が GL_STATIC_DRAW がバインドされた VBO を持っています)
360K の頂点を持つテスト シーンで、両方の代替案について異なるパフォーマンスを測定しました (頂点は単純に GL_POINTS としてラスタライズされるため、フラグメント シェーダーの労力は無視できます)。
- imageStore なしのシェーダー: 2.1 ミリ秒
- const-coord imageStore から uimage2D へ: 2.1 ms
- const-coord imageStore から uimageBuffer へ: 3.2 ms
そのため、imageStore から imageBuffer への変換は、image2D への変換よりも遅いようです。しかし、それは悪化します。上記のように一定の座標を持つ固定テクセルに imageStore せず、動的に決定されたオフセットを使用すると、次のパフォーマンスが得られます。
- 動的座標 imageStore から uimage2D へ: 2.1 ミリ秒
- imageStore から uimageBuffer への動的座標: 7.2 ミリ秒
誰でもこのパフォーマンスの違いを確認できますか、または uimageBuffer への書き込みが uimage2D への書き込みよりもはるかに遅い理由を説明できますか? Buffer-Texture にバインドされた VBO が原因ですか? それとも私は何か間違ったことをしたようですか?
また、頂点シェーダーはアトミック カウント用に 2 番目の uimage2D も使用しますが、これはどのケースでも同じであり、imageStore とは何の関係もないはずです。