アプリケーションと同期してデータを読み取りたい場合、gpu からデータを取得するのは非常に遅いタスクのようです。1 つの可能性は、Pixel Buffer オブジェクトを使用して非同期的に読み取ることです。残念ながら、これがどのように行われるかを見ることができません。
まず、ピクセル バッファー オブジェクトを作成します。
glGenBuffers(1, &pbo);
glBindBuffer(GL_PIXEL_PACK_BUFFER, pbo);
glBufferData(GL_PIXEL_PACK_BUFFER, pbo_size, 0, GL_DYNAMIC_READ);
glBindBuffer(GL_PIXEL_PACK_BUFFER, 0);
次に、フレーム バッファ オブジェクトからピクセルを読み取りたい:
glReadBuffer(GL_COLOR_ATTACHMENT0);
glBindBuffer(GL_PIXEL_PACK_BUFFER, pbo);
glReadPixels(0, 0, w, h, GL_RGBA, GL_FLOAT, 0);
GLfloat *ptr = glMapBufferRange(GL_PIXEL_PACK_BUFFER, 0, pbo_size, GL_MAP_READ_BIT);
memcpy(pixels, ptr, pbo_size);
glUnmapBuffer(GL_PIXEL_PACK_BUFFER);
glBindBuffer(GL_PIXEL_PACK_BUFFER, 0);
しかし、これはどのように非同期なのでしょうか? gpu が「準備完了」になるまで、glReadPixels または glMapBufferRange はアプリケーションをブロックしていますか?