OpenGL讀取幀快取資料

2022-10-11 06:27:11 字數 1534 閱讀 3075

簡述有些時候我們可能需要獲取渲染後的影象資料,比較常用的函式是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.模板快取 可以將作圖限制在...