2015-11-30 106 views
0

從gpu獲取數據似乎是一個非常緩慢的任務,如果你想讀取它與你的應用程序同步。一種可能是在像素緩衝區對象的幫助下異步讀取。不幸的是,我無法看到這是如何完成的。使用像素緩衝區對象異步讀取數據gpu

首先我創建了一個像素緩衝區對象:

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); 

這是怎麼回事異步? glReadPixels或glMapBufferRange會阻止應用程序,直到gpu「準備就緒」?

回答

3

glReadPixels調用應該開始複製到一個cpu可見緩衝區。 (無論何時提交給GPU,都可以用glFlush強制提交)。您正在異步開始讀取。

glMapBufferRange將強制glReadPixels調用完成,如果它不是(因爲你現在正在訪問CPU上的指針,有沒有辦法)。

所以......不要做2個背靠背,而是稍後顯着。

+0

是否有可能確定讀取是否完成? – testman

+1

@testman:[GL_ARB_sync](https://www.opengl.org/registry/specs/ARB/sync.txt) – derhass

+0

謝謝,所以我可以使用glClientWaitSync或glWaitSync指令。我的應用程序客戶端或服務器是GL嗎?我將使用什麼作爲同步參數? – testman