1

計算量の多いプロジェクトをやっていて、GPUに作品を投げるというアイデアが浮かびましたが、GLSLから結果を取得できるかどうか、可能であればどうすればよいでしょうか。

4

2 に答える 2

4

GLSLは、フレームバッファに配置されたもの以外の出力を提供しません。

GPUをプログラムしてより便利に結果を得るには、CUDA(NVidiaのみ)またはOpenCL(クロスプラットフォーム)を使用します。

于 2012-06-19T03:28:58.537 に答える
3

一般的に、あなたがしたいのは、汎用GPUタスクにOpenCLを使用することです。ただし、OpenGLがレンダリングAPIではないふりをすることに固執している場合は...

フレームバッファオブジェクトを使用すると、複数の出力に比較的簡単にレンダリングできます。もちろん、これは、レンダリングされるものが必要なものと一致するように処理を構造化する必要があることを意味します。32ビット浮動小数点の「画像」にレンダリングできるため、十分な精度にアクセスできます。最大の難しさは、私が述べたことです。レンダリングに一致するようにタスクを構造化する方法を理解することです。

変換フィードバックを使用すると、少し簡単になります。これは、頂点(またはジオメトリ)シェーダー処理の出力をバッファーオブジェクトに書き込む機能です。これでも、タスクをレンダリングのようなものに構造化する必要がありますが、頂点シェーダーには厳密な1頂点から1頂点へのマッピングがあるため、より簡単です。入力頂点ごとに、出力は1つだけです。また、描画する場合GL_POINTS、属性を使用して変更されたデータを渡すことはそれほど難しくありません。

より簡単で難しいのは、shader_image_load_storeの使用です。これは事実上、「いつでも」任意の画像との間で読み取り/書き込みを行う機能です。データの競合状態に関する秘教的なルールがたくさんあるため、最後の部分を引用符で囲みます。別のシェーダー呼び出しによって書き込まれた値から読み取るなどです。これらに対処するのは簡単ではありません。同じシェーダーで同じ画像の場所に書き込まないことで、コードを構造化してそれらを回避することができます。しかし、多くの場合、それができれば、フレームバッファにレンダリングするだけで済みます。

最終的に、あなたが実際に何をしようとしているのかを正確に知らずに、一般的なケースでこの質問に答えることはほとんど不可能です。レンダリングAPIを介してGPGPUにアプローチする方法は、計算しようとしているものに大きく依存します。

于 2012-06-19T03:47:43.047 に答える