OpenGLl離線渲染

2021-06-18 02:26:53 字數 3521 閱讀 4033

opengll離線渲染就是通過opengl將繪製結果渲染到視訊記憶體中的一張上,通過gl介面函式可以從視訊記憶體讀取到記憶體中。基於opengl的離線渲染機制,可以快速實現乙個渲染器:

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

輸出:影象

從一般到特殊:

主要介紹pc上,

移動裝置如果不支援fbo要實現離線渲染那就實在沒轍了

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

如果沒有gl_back就沒轍了

gldrawpixels 更新顏色緩衝區。

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

完成後glreadpixels將顏色緩衝區以從視訊記憶體調入記憶體。  

該函式會導致gpu阻塞,效率不高。

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,客戶端有讀寫許可權

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

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

<<—————————  unbind fbo

回到主渲染流程

移動裝置,明顯特點是受限,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示例。

else

glbindbuffer( gl_pixel_pack_buffer, g_pixelbufferobjectids[g_asyncreadingindex] );

glreadpixels( 0, 0, ogl.width, ogl.height, gl_rgba, gl_unsigned_byte, 0 );

glbindbuffer( gl_pixel_pack_buffer, g_pixelbufferobjectids[g_asynchcopyingindex] );

glmapbufferrange( gl_pixel_pack_buffer, 0, g_datasize,gl_map_read_bit);

glubyte* bufferdata =*null;

glgetbufferpointerv( gl_pixel_unpack_buffer, gl_buffer_map_pointer, (glvoid **)&ptr );

if( bufferdata != null )

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

理論 輸入 影象,點,線。輸出 影象 實現方案 從一般到特殊 1.不支援fbo 主要介紹pc上,移動裝置如果不支援fbo要實現離線渲染那就實在沒轍了。gldrawbuffer gl back glreadbuffer gl back 設定讀寫時後快取區。一般pc都支援雙緩衝機制,如果沒有gl bac...

OpenGlL 球形的繪製

glcleardepth 深度函式,用於實現實心物體的遮擋。glshademodel 為上色模式。是使用 gl flat 還是gl smooth glenable 啟用了光照功能 gllightfv 建立光源函式 這裡使用了多個光源 glortho 螢幕擷取函式.只是負責使用什麼樣的視景體來擷取影象...

OpenGLL 座標空間整合

1 物體定點轉化為螢幕座標經過的座標系統。1 區域性空間 local space 或物體空間 object space 2 世界空間 world space 3 觀察空間 view space 或視覺空間 eye space 4 裁剪空間 clip space 5 螢幕空間 screen space...