次のシナリオがあります。
カラーアタッチメントとしてテクスチャを使用したカスタムFBOがあります。そのFBOにコンテンツをレンダリングします。次のステップでは、そのテクスチャをCUDAと共有し、後処理カーネルで実行する必要があります。その後、テクスチャをフルスクリーンにバインドする必要があります。クワッドで、デフォルトのフレームバッファにレンダリングされます。私はいくつかのOpenGL/CUDA相互運用チュートリアルを読みましたが、これを行うためのいくつかのステップは私には完全には明確ではありません。
まず、彼らが通常行うことは、GLテクスチャXからデータを読み取り、それをCUDAで処理してから、PBO塗りつぶしテクスチャYを使用して結果のデータを取得することです。
私が気付いたもう1つのこと(間違っている場合は訂正してください)は、これらのデモのOpenGLがデフォルトでバインドされたPBOを使用していることです。つまり、最初のパスのレンダリング結果がそこに保存されますか?これらのデモはすべて固定のOpenGLを使用しており、最初のジオメトリパスがレンダリングされたときにPBOがバインドされる場所がないため、私はそれについて本当に確信が持てません。
さて、私の場合に戻りましょう。最後の質問は、PBOを使用せずにCUDAのOpenGLテクスチャを直接操作して、CUDAカーネルで変更できるようにすることはできますか?いいえの場合、それはCUDAステージに渡す前にFBOテクスチャをPBOにパックする必要があることを意味しますか?
アップデート:
フレームバッファからのPBOの入力は、通常glReadPixels()を使用して実行されます。これは、CPUにダウンロードされることを意味します。これは防止したいことです。-それは間違った仮定でした。それで、テクスチャからのピクセルでPBOを埋めることができるという事実に基づいて、次の方法がありますか?:PBOにテクスチャからのデータを入力します。
それをCUDAバッファーリソースにマップします。
カーネルを使用してデータに変更を加えます。
変更されたPBOからターゲットテクスチャを更新します。
OpenGLで更新されたテクスチャを使用します。