CPU和GPU互動的初理解

2021-10-07 11:24:57 字數 4393 閱讀 8456

gpu和cpu互動的那部分可以看成乙個全域性表gpu_table,

這個表裡的一級下表為array_buffer,element_array_buffer等各種buffer

單看這個一級表可以把他們理解為各種緩衝區

這個表裡的二級下表為各種glid緩衝物件

這個表裡的**下表為實實在在的data

特別注意:gpu操作渲染資料都是依靠指定緩衝區和緩衝物件繫結的,所以緩衝物件和緩衝區必須事先繫結

##頂點緩衝區操作如下:

this._glid = gl.createbuffer()

gl.bindbuffer(gl.array_buffer, this._glid);將緩衝區和緩衝物件繫結(類似gpu_table[buffer][glid]);

gl.bufferdata(gl.array_buffer, data, glusage);將頂點資料傳送到視訊記憶體(類似gpu_table[buffer][glid]=data);

gl.buffersubdata(gl.array_buffer, byteoffset, data);這個也是操作gl.bufferdata,只是存放的時候按照偏移存放的;

gl.bindbuffer(gl.array_buffer, null);gpu_table[buffer][null];解除鎖定

gl.deletebuffer(this._glid);刪除緩衝物件及其繫結的緩衝資料gpu_table[buffer][glid] = null;

##索引緩衝區操作如下:

this._glid = gl.createbuffer()

gl.bindbuffer(gl.element_array_buffer, this._glid);將緩衝區和緩衝物件繫結(類似gpu_table[buffer][glid]);

gl.bufferdata(gl.element_array_buffer, data, glusage);將索引資料傳送到視訊記憶體(類似gpu_table[buffer][glid]=data);

gl.buffersubdata(gl.element_array_buffer, byteoffset, data);這個也是操作gl.bufferdata,只是存放的時候按照偏移存放的;

gl.bindbuffer(gl.element_array_buffer, null);gpu_table[buffer][null];解除鎖定

gl.deletebuffer(this._glid);刪除緩衝物件及其繫結的緩衝資料gpu_table[buffer][glid] = null;

##紋理緩衝區繫結

this._glid = gl.createtexture();

gl.activetexture(gl.texture0);啟用第0塊紋理單元,關於這個紋理單元至少有八塊

gl.bindtexture(gl.texture_2d, this._glid);將緩衝區和緩衝物件繫結(類似gpu_table[gl.texture+「i」][buffer][glid]);

下面這四個函式可以理解為都是將紋理相關資料發往視訊記憶體的 類似gpu_table[gl.texture+「i」][buffer][glid][type] = data;

圖象從紋理圖象空間對映到幀緩衝圖象空間(對映需要重新構造紋理影象,這樣就會造成應用到多邊形上的影象失真),這時就可用gltexparmeteri()函式來確定如何把紋理象素對映成畫素

gl.texparameteri(gl.texture_2d, gl.texture_min_filter, glfilter(gl, this._minfilter, mipfilter));

gl.texparameteri(gl.texture_2d, gl.texture_mag_filter, glfilter(gl, this._magfilter, -1));

gl.texparameteri(gl.texture_2d, gl.texture_wrap_s, this._wraps);

gl.texparameteri(gl.texture_2d, gl.texture_wrap_t, this._wrapt);

gltexparameteri(gl_texture_2d, gl_texture_wrap_s, gl_clamp);

#一些引數解釋

gl_texture_2d: 操作2d紋理.

gl_texture_wrap_s: s方向上的貼圖模式.

gl_clamp: 將紋理座標限制在0.0,1.0的範圍之內.如果超出了會如何呢.不會錯誤,只是會邊緣拉伸填充.

gltexparameteri(gl_texture_2d, gl_texture_wrap_t, gl_clamp);這裡同上,只是它是t方向

gltexparameteri(gl_texture_2d, gl_texture_mag_filter, gl_linear);這是紋理過濾

gl_texture_mag_filter: 放大過濾

gl_linear: 線性過濾, 使用距離當前渲染畫素中心最近的4個紋素加權平均值

gltexparameteri(gl_texture_2d, gl_texture_min_filter, gl_linear_mipmap_nearest);

gl_texture_min_filter: 縮小過濾

gl_linear_mipmap_nearest: 使用gl_nearest對最接近當前多邊形的解析度的兩個層級貼圖進行取樣,然後用這兩個值進行線性插值.

gl_linear 使用了線性濾波的紋理貼圖。這需要機器有相當高的處理能力,但它們看起來很不錯。

gl_nearest從原理上講,這種方式沒有真正進行濾波。它只占用很小的處理能力,看起來也很差。唯一的好處是這樣我們的工程在很快和很慢的機器上都可以正常執行。

我們在 gl_texture_min_filter和 gl_texture_mag_filter時你可以混合使用 gl_nearest 和 gl_linear。紋理看起來效果會好些,如果我們更關心速度,可以全採用低質量貼圖。

gl_texture_min_filter在影象繪製時小於貼圖的原始尺寸時採用。gl_texture_mag_filter在影象繪製時大於貼圖的原始尺寸時採用

// 線形濾波

gltexparameteri(gl_texture_2d,gl_texture_mag_filter,gl_linear);           

gltexparameteri(gl_texture_2d,gl_texture_min_filter,gl_linear);

// 接近濾波

gltexparameteri(gl_texture_2d,gl_texture_mag_filter,gl_nearest);          

gltexparameteri(gl_texture_2d,gl_texture_min_filter,gl_nearest);

//這個函式是載入乙個沒有被壓縮的紋理

void glteximage2d(glenum target,

glint level,

glint internalformat,

glsizei width,

glsizei height,

glint border,

glenum format,

glenum type,

const glvoid * data);

用法舉例:

這個函式是載入沒有被壓縮的

glteximage2d(gl_texture_2d,   //此紋理是乙個2d紋理

0,          //代表影象的詳細程度, 預設為0即可

3,          //顏色成分r(紅色分量)、g(綠色分量)、b(藍色分量)三部分,若為4則是r(紅色分量)、g(綠色分量)、b(藍色分量)、alpha

textureimage[0]->sizex,  //紋理的寬度

textureimage[0]->sizey,  //紋理的高度

0,           //邊框的值

gl_rgb,       //告訴opengl影象資料由紅、綠、藍三色資料組成

gl_unsigned_byte,  //組成影象的資料是無符號位元組型別

textureimage[0]->data);  //告訴opengl紋理資料的**,此例中指向存放在textureimage[0]記錄中的資料

使用glteximage2d()時所採用的位**件解析度必須為:64×64、128×128、256×256三種格式,如果其他大小則會出現繪製不正常。

//這個函式是載入乙個被壓縮的紋理

gl.compressedteximage2d(

gl.texture_2d,

options.level,

glfmt.internalformat,

options.width,

options.height,

0,img

);

CPU和GPU的區別

cpu 即 處理器,解釋計算機指令以及處理計算機軟體中的資料 gpu即圖形處理器,專門處理和繪製圖形相關的硬體。gpu時專為執行複雜的數學和 集合計算而設計的,有了它,cpu就從圖形處理的任務中解放出來,可以執行其他更多的 系統任務。硬體加速 在計算機中把計算量非常大的工作非陪給專門的硬體處理,減輕...

CPU和GPU的區別

個人認為cpu和gpu各有自己的適應領域。cpu central processing unit 計算核心較少,通常是雙核 四核 八核,但是擁有大量的共享快取 亂序執行等優化,可以做邏輯非常複雜的計算任務。這一點就當前的gpu來說,仍然難以做到。會犧牲大量的效能 造成大量的能耗開銷,而且增加了程式設...

CPU和GPU之間的通訊

渲染流水線的起點是cpu,即應用階段。大致可分為下面三個階段 1.把資料載入到視訊記憶體 2.設定渲染狀態 3.呼叫drawcall 1.把資料載入到視訊記憶體 所有渲染所需要的資料都需要從硬碟 hard disk drive,hdd 中載入到系統記憶體 random access memory,r...