0

アプリケーションと同期してデータを読み取りたい場合、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 はアプリケーションをブロックしていますか?

4

2 に答える 2

3

このglReadPixels呼び出しは、CPU から見えるバッファへのコピーを開始する必要があります。(GPU に送信されるたびに。 で送信を強制できますglFlush)。非同期で読み取りを開始しています。

glMapBufferRangeそうでない場合は、呼び出しを強制的glReadPixelsに終了させます (現在、CPU 上のポインターにアクセスしているため、それを回避する方法はありません)。

だから... 2つ連続して行うのではなく、かなり後で行います。

于 2015-11-30T21:17:51.323 に答える