1. 程式人生 > >OpenGL讀取幀快取資料

OpenGL讀取幀快取資料

簡述
有些時候我們可能需要獲取渲染後的影象資料,比較常用的函式是glReadPixels,它可以直接把視訊記憶體中的資料拷貝到記憶體中glReadPixels讀取幀快取資料

void glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels)

功  能:讀取幀快取資料

參  數:

x,y幀快取左下角的座標

width, height讀取幀快取的款和高

format讀取的資料格式

type 讀取的資料型別

pixels儲存讀取到資料的記憶體空間

使用方法
float* data = (float*)malloc(mWidth * mHeight * sizeof(float)* 3);
glReadPixels(0, 0, mWidth, mHeight, GL_RGB, GL_FLOAT, data);
這種方式比較簡單,只需要分配好記憶體空間,然後呼叫glReadPixels,
把資料讀取到記憶體空間就可以了,但這種讀取方式效率太低,
當我們需要每幀實時讀取時,畫面就會出現卡頓,我們需要使用更快的讀取方式,比如通過記憶體對映記憶體對映方式讀取幀快取資料

直接呼叫glMapBuffer從幀快取中對映時,發現對映失敗,這是因為glMapBuffer只能從glGenBuffers建立的快取中讀取資料,我們從幀快取(由glGenFramebuffers建立)中對映自然失敗,所以必須先從幀快取中把資料讀取到頂點快取中,然後再通過使用方法
(1)建立頂點快取,glGenBuffers(1, &readBuffer);
glBindBuffer(GL_ARRAY_BUFFER, readBuffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(float) * FRAME_WIDTH * FRAME_HEIGHT * 3, NULL, GL_DYNAMIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, 0);(2)把幀快取資料讀取到頂點緩衝readBuffer
//快取繫結
glBindBuffer(GL_PIXEL_PACK_BUFFER, readBuffer);
//輸出到readBuffer上
glReadPixels(0, 0, FRAME_WIDTH, FRAME_HEIGHT, GL_RGB, GL_FLOAT, NULL);(3)把readBuffer中的資料對映到記憶體中
//對映
float *data = (float *)glMapBuffer(GL_PIXEL_PACK_BUFFER, GL_READ_ONLY);
//完成後解除對映
glUnmapBuffer(GL_PIXEL_PACK_BUFFER);