2

動的に生成されたテクスチャに対して実行したいレンダリング手順があります。

このアルゴリズムは、行を独立して並列に操作できます。行ごとに、アルゴリズムは左から右の順序で各ピクセルにアクセスし、その場で変更します (それが役立つ場合は、個別の出力バッファーは必要ありません)。各パスは、各行の先頭でリセットする必要がある状態変数を使用し、列をトラバースするときに保持する必要があります。

これを行うために、OpenGL シェーダーや OpenCL などをセットアップできますか? コード付きの最小限の例を提供してください。

4

2 に答える 2

2

EXT_shader_image_load_store または ARB_shader_image_load_store を実装する GL 4.x クラスのハードウェアにアクセスできる場合は、それをやってのけることができると思います。それ以外の場合、イメージのその場での読み取り/書き込みは通常不可能です (ただし、NV_texture_barrier を使用する方法はあります)。

そうは言っても、ピクセルに自分のやり方で状態を共有させたいと思うようになると、並列処理による潜在的な利益のほとんどが失われてしまいます。ピクセルに対して計算する値がその左側のピクセルの計算に依存している場合、実際には各ピクセルを並列に実行することはできません。これは、アルゴリズムが実際に持つ唯一の並列処理が行ごとであることを意味します。

それはあなたに多くを買うつもりはありません。

本当にこれをやりたい場合は、OpenCL を使用してください。この種のことにはずっと友好的です。

于 2012-02-02T16:05:11.733 に答える
0

はい、できます。いいえ、4.X ハードウェアは必要ありません。フラグメント シェーダー (フロー制御付き)、フレームバッファー オブジェクト、および浮動小数点テクスチャ サポートが必要です。

データを 2D テクスチャにエンコードする必要があります。

各行の最初のピクセルに「状態変数」を格納し、残りのデータを残りのピクセルにエンコードします。言うまでもなく、浮動小数点テクスチャ形式を使用することをお勧めします。

2 つのフレームバッファを使用し、最初の列で「状態変数」を更新するフラグメント シェーダを使用してループ内でそれらを互いにレンダリングし、「現在」の別の列で必要な操作を実行します。無駄なリソースの量を減らすために、処理したい列にレンダリングを制限できます。NVidia OpenGL SDK の例には、データをテクスチャにエンコードし、シェーダーを使用して更新するという同様の方法で動作する「ライフ ゲーム」、「GDGPU 流体」、「GPU パーティクル」のデモがありました。

ただし、できるからといって、必ずやればいいというわけではなく、高速であることが保証されているわけでもありません。一部の GPU は、メモリ テクスチャ メモリの読み取り速度が非常に高い場合がありますが、計算速度は比較的遅く (逆も同様)、すべての GPU に物事を並列処理するための多くのコンベヤーがあるわけではありません。

また、アプリによっては、CUDA または OpenCL の方が適している場合があります。

于 2012-02-02T17:26:27.823 に答える