openg離線包 OpenGL離線渲染和緩衝區物件

2021-10-16 19:27:07 字數 2561 閱讀 1606

理論

輸入:影象,點,線。。。

輸出:影象

實現方案

從一般到特殊:

1. 不支援fbo

主要介紹pc上,移動裝置如果不支援fbo要實現離線渲染那就實在沒轍了。

gldrawbuffer(gl_back); glreadbuffer(gl_back); 設定讀寫時後快取區。 一般pc都支援雙緩衝機制,如果沒有gl_back就沒轍了。

gldrawpixels 更新顏色緩衝區。

呼叫opengl繪製函式在gl_back繪製。

完成後glreadpixels將顏色緩衝區以從視訊記憶體調入記憶體。 該函式會導致gpu阻塞,效率不高。

2. pc支援fbo

opengl支援多種緩衝區物件:

緩衝區物件說白了就是 視訊記憶體中一塊快取區。opengl是業界渲染標準,具體介面功能由顯示卡驅動實現,opengl客戶端是使用opegl的應用程式,opengl伺服器可以理解成gpu,如果沒有gpu就是os核心中的乙個模組,緩衝區物件定義在伺服器端,減少客戶端每次渲染時資料傳輸開銷。每個緩衝區物件有唯一的id,類似handle概念,客戶端通過bufferid管理緩衝區物件。

1)紋理物件,最常見的從gl1.0就開始支援,基本操作指令:glgentextures, glbindtextures, gldeletetextures,後續有多重紋理增加新的指令。

伺服器端的紋理資料,客戶端只有寫許可權:gltexsubimage2d函式區域性或者全部更新紋理緩衝區內容。

2)vbo(vertex buffer object)和pbo(pixel buffer object) 原理完全一樣使用相同的gl指令:glgenbuffers,glbindbuffers,gldeletebuffers。。。

只不過buffer中存的資料內容不一致,前者存頂點後者存畫素。vbo的出現 頂點列表逐漸淡出了人們的視野。

伺服器端的vbo,pbo,客戶端有讀寫許可權:glmapbuffer 將伺服器端記憶體位址對映為客戶端位址,操作完成呼叫glunmapbuffer;或者直接通過glbuffersubdata 更新資料。

3)vbo後又出現vao(vertex array buffer),vao的是gl3.0出來的東東,有點高處不甚寒 考慮移動裝置 考慮android**木有研究。

4)rbo(render buffer object),rbo並不能單獨使用,必須配合fbo,與opengl緩衝區對應,rbo可以存放顏色、深度、模板資料。指令集合:glgenrenderbuffers,glbindrenderbuffer,gldeleterenderbuffers。

5)fbo(frame buffer object) 有一套專門的指令集合:glgenframebuffers, glbindframebuffer, gldeleteframebuffers.。

fbo建立以後必須繫結緩衝區:顏色、深度必須,模板緩衝區看需求而定。

緩衝區物件並不侷限於rbo,紋理物件也可以充當緩衝區物件:建立紋理是glteximage2d最後乙個引數為null,在視訊記憶體中只需要建立紋理物件,而並不需要傳紋理資料。

採用rbo的例子:

回到主題,通過fbo實現離線渲染流程如下:

主渲染流程,使用系統預設的緩衝區物件

儲存opengl現場

—————————>> bind fbo

a) glclear 清空fbo對應的各種緩衝區內容

b) 在離線渲染之前,往顏色緩衝區中新增內容,如背景

c) set projectionmatrix

d) set modelviewmatrix

e) all draw calls // draw some stuff

f) glreadpixels // 如果需要,渲染結果從視訊記憶體調入記憶體,在後續主渲染流程中建立紋理物件使用。

glcopyteximage2d使用幀緩衝區的資料定義紋理單元,畫素直接從顏色緩衝區讀取,功能類似glcopypixels

如果顏色緩衝區採用 紋理物件,後續在主渲染流程中 可以直接使用該紋理進行繪製

回到主渲染流程

3. mobile 上離線渲染

移動裝置,明顯特點是受限,gles是opengl的縮減版,gles沒有gldrawbuffer和glreadbuffer介面,沒法直接操縱前後緩衝區,所以方案1失效 只能轉向fbo。

gles1.1開始支援fbo,gl變數和指令加oes字尾。

手機上fbo離線渲染流程跟pc上基本類似,在此主要說兩點主要差別:

1)關於離線渲染的步驟b,pc上最常見的做法gldrawpixels直接往顏色緩衝區拷貝資料,但是gles不支援gldrawpixels。

想到的第一種替代方案:正交投影模式下直接drawtexturequad,走opengl標準流水線:紋理物件建立、資料傳輸,頂點傳輸、幾何變換流程,光柵化、紋理座標定址取紋理單元,最終通過緩衝區各種測試將結果寫到顏色緩衝區中。

優化後的方案:紋理物件作為fbo的顏色緩衝區,可以通過gltexsubimage2d函式直接將影象資料更新到顏色緩衝區中,全部或者區域性,功能跟gldrawpixels完全一致,避免走opengl流水線。

2)在手機上效率優先,建議不要直接使用glreadpixels函式,可以參考ogl_fbo_pbo_readback示例。

OpenGL學習筆記之一 什麼是OpenGL

opengl到底是什麼?制定並維護的規範 specification opengl規範嚴格規定了每個函式該如何執行,以及它們的輸出值。至於內部具體每個函式是如何實現 implement 的,將由opengl庫的開發者自行決定 譯註 這裡開發者是指編寫opengl庫的人 因為opengl規範並沒有規定...

python安裝離線包 python離線包

只是,乙份離線的文件畢竟能更讓人安心。接下來引導大家獲取乙個離線的gdal文件 python 開啟github02https github.compcjerickspy gdalogr cookbook.乙個有趣的靈魂w gdal的官網一搜就有了 www.gdal.org。裡面對gdal各種函式的描...

離線安裝python包

可以通過安裝預編譯檔案的方式安裝scipy,此法亦可安裝其他包,注意檔案版本對應即可。2 在cmd下輸入cd c python27 scripts定位到資料夾,依次輸入pip install numpy 1.11.1 mkl cp27 cp27m win32.whl和pip install nump...