0

私は CUDA にはかなり慣れていませんが、カーネルによって生成されたものを OpenGL を使用して画面に表示することができました。私はいくつかのアプローチを試しました:

  1. PBO と OpenGL テクスチャの使用 (古いスタイル);
  2. OpenGL テクスチャを CUDA サーフェスとして使用し、クワッドでレンダリングする (新しいスタイル)。
  3. renderbuffer を CUDA サーフェスとして使用し、glBlitFramebuffer を使用してレンダリングします。

それらはすべて機能しましたが、#2 を実装しているときに、誤ってヒントを cudaGraphicsRegisterFlagsWriteDiscard として設定しました。すべてのデータが CUDA によって生成されるため、これは正しいオプションだと思いました。しかし、後になって、OpenGL テクスチャに書き込むには CUDA サーフェスが必要であり、サーフェスを使用する場合は LoadStore フラグを使用するように要求されることに気付きました。

基本的に私の質問は次のとおりです。CUDA で OpenGL テクスチャに書き込むには CUDA サーフェスが絶対に必要なので、cudaGraphicsGLRegisterImage の cudaGraphicsRegisterFlagsWriteDiscard の使用例は何ですか?

4

1 に答える 1

1

ドキュメントの説明は非常に簡単に見えます。CUDA から OpenGL への一方向のデータ配信用です。

このオンライン ブックの抜粋は、同様の説明を提供します。

CUDA がプロデューサーで OpenGL がコンシューマーであるアプリケーションは、オブジェクトを write-discard フラグで登録する必要があります...

例を見たい場合は、postProcessGL cuda サンプルを見てください。その場合、OpenGL は画像をレンダリングしており、表示前に cuda によって後処理 (ぼかしが追加) されています。この場合、データ フローには 2 つの別々の経路があります。OpenGL->CUDA の場合、データはcreateTextureSrc関数によって処理され、指定されたフラグは読み取り専用です。CUDA->OpenGL の場合 (後処理されたフレームの配信) では、関数は で処理されます。このパスでは、CUDA が生成され、OpenGL が消費されるため、フラグを指定してcreateTextureDst呼び出しが行われます。cudaGraphicsGLRegisterImagecudaGraphicsMapFlagsWriteDiscard

テクスチャがどのように処理されるか ( を介して cuda 操作からのデータが読み込まれるcudaArray) を理解するには、おそらく で一連の操作を学習する必要がありますprocessImage()

于 2013-05-28T03:04:29.653 に答える