簡述有些時候我們可能需要獲取渲染後的影象資料,比較常用的函式是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);
OpenGL的幀快取
本文參考的是 opengl程式設計權威指南 也就是傳說中的 紅寶書 一 快取的分類 1.顏色快取 指程式設計師繪圖所用的快取,分為 左 右快取 用於立體感檢視 必須要有左快取 前 後快取 用於雙快取 必須要有前快取 4個輔助快取 可選擇的 不可顯示 程式設計師可以自己定義和使用它們 2.深度快取 用...
OpenGL幀快取和動畫
17.1 幀快取 螢幕上所繪的圖形都是由象素組成的,每個象素都有乙個固定的顏色或帶有相應點的其它資訊,如深度等。因此在繪製圖形時,記憶體中必須為每個象素均勻地儲存資料,這塊為所有象素儲存資料的記憶體區就叫緩衝區,又叫快取 buffer 不同的快取可能包含每個象素的不等數字的資料,但在給定的乙個快取中...
OpenGL中的幀快取
一 快取的分類 1.顏色快取 指程式設計師繪圖所用的快取,分為 左 右快取 用於立體感檢視 必須要有左快取 前 後快取 用於雙快取 必須要有前快取 4個輔助快取 可選擇的 不可顯示 程式設計師可以自己定義和使用它們 2.深度快取 用來儲存每個象素的深度值,也稱為z快取。3.模板快取 可以將作圖限制在...