私はこれを達成しようとしています:いくつかのジオメトリをレンダリングするカスタムフレームバッファがあります。FBOにはその時点でカラーアタッチメントテクスチャがあります。次にそれをPBOにコピーします。その後、PBOからピクセルをコピーして戻します。そのテクスチャに追加し、カスタムFBOをデフォルトのフレームバッファにブリットします。これは機能しません。
私がしていることに関してより理解しやすいようにコードを更新しました:
// Here I init the PBO :
void Init(const int bufferWidth,const int bufferHeight){
glGenBuffers(1,&_imagePBO);
glBindBuffer(GL_PIXEL_PACK_BUFFER, _imagePBO);
glBufferData(GL_PIXEL_PACK_BUFFER, bufferWidth * bufferHeight * 4,0, GL_DYNAMIC_COPY);
glBindBuffer(GL_PIXEL_PACK_BUFFER, 0);
}
//Inside Render loop:
_fboA.BindForWrite();
glClear(GL_COLOR_BUFFER_BIT);
glViewport(0,0, _viewportWidth,_viewportHeight);
//================== RENDER SOME GEOMETRY =======================//
..............
.........................
//===============READ from texture into PBO=======================//
_fboA.BindForRead();
glBindBuffer(GL_PIXEL_PACK_BUFFER, *_exporter->GetPBOID());
glReadPixels(400,400,_viewportWidth ,_viewportHeight,GL_RGBA,GL_UNSIGNED_BYTE,NULL);
glBindBuffer(GL_PIXEL_PACK_BUFFER, 0);
//=============== CLEAR TEXTURE IN FBO to GREEN ===============//
_fboA.BindForWrite();
glClearColor(0,1,0,1);
glClear(GL_COLOR_BUFFER_BIT);//|GL_DEPTH_BUFFER_BIT
_fboA.Unbind();
//==================Read from PBO back into texture ===========//
_texA->Bind();
glBindBuffer(GL_PIXEL_UNPACK_BUFFER, *_exporter->GetPBOID());
glTexSubImage2D(GL_TEXTURE_2D,100,100,0,_viewportWidth,_viewportHeight,
GL_RGBA,GL_UNSIGNED_BYTE ,NULL);
glBindBuffer(GL_PIXEL_UNPACK_BUFFER,0);
_texA->Unbind();
//======================== BLIT ===============================//
_fboA.BindForRead();
glBindFramebuffer(GL_DRAW_FRAMEBUFFER , 0);
glBlitFramebuffer(0,0,_viewportWidth,_viewportHeight,0,0,
_viewportWidth,_viewportHeight,GL_COLOR_BUFFER_BIT,GL_LINEAR);
画面に表示されるのは緑色であり、_fboAからPBOにコピーしたと思われるレンダリングされたコンテンツではありません。
_fboAテクスチャがPBOからピクセルを取得しないか、PBOが_texAからピクセルを読み取らないようです。
さて、ここで指摘したように、このアプローチはOpenGLの観点からはおそらく最適ではありませんが、CUDAカーネルのリソースとしてPBOを共有するアプリケーションのCUDA部分には、この種のピンポンが必要です。
アップデート:
興味のある方のために、CUDA SDKのOpenGL相互運用機能のデモでは、テクスチャがCPUからPBOに入り、ターゲットテクスチャ2Dにコピーされる場合を示しています。私の場合、画像をFBOからPBOに取り込み、CUDAカーネルでの画像処理を介して渡し、PBOからターゲットテクスチャに戻します。これにより、画面に再度レンダリングされます。