1

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 とは何の関係もないはずです。

4

0 に答える 0