opengles2 0 幀快取物件(FBO

2021-07-23 11:47:45 字數 2736 閱讀 9400

幀快取物件(fbo)主要是用於做渲染到紋理。

opengles2.0渲染到紋理的方法有三種:

第一,使用glcopyteximage2d或者glcopytexsubimage2d,這兩個函式,複製framebuffer中的

畫素到紋理快取裡面,但這兩個函式效能比較低下,並且要求紋理的尺寸必須小於等於

framebuffer的尺寸。

第二,使用乙個附加到紋理的pbuffer,來執行渲染到紋理的操作。我們知道,視窗系統為我們提供

的su***ce必須新增到乙個渲染環境裡面,但是,在某些平台上要求每個pbuffer和視窗系統提供

的su***ce都需要乙個單獨的context,所以如果要渲染到pbuffer裡面的話,就會發生context的切換,

這種切換操作時很耗時的。

第三,使用fbo,rbo等,這種是最高效的。

framebuffer和renderbuffer object(fbo和rbo):

rbo是一塊2d影象快取,能夠用於儲存color,depth,stencil值,也就是可以作為

fbo的color或depth或stencil attachment。但是這個rbo不能直接作為紋理使用。

fbo是乙個容器,他有三個attachment 點:顏色快取,深度快取,和模板快取的attachment 點。

還儲存著,新增到這些attachment點上的顏色快取,深度快取,模板快取的大小、格式等屬性,

以及新增進來的紋理和rbo的名字等等。

顏色快取attachment點,可以新增紋理或rbo。

深度快取attachment點,可以新增紋理或rbo。

模板快取attachment點,只能新增rbo。

gl_oes_texture_3d 這個擴充套件允許3d紋理的2d切新增到attachment點。

gl_oes_depth_texture 這個擴充套件允許2d深度紋理,和立方體深度紋理。

gl_oes_packed_depth_stencil 這個擴充套件允許packed depth stencil texture。

fbo還有乙個:framebuffer completeness status,這個狀態表明本fbo是否可以用來接受渲染結果。

注意:新增到乙個fbo中attachment點的各個rbo或紋理才尺寸必須一致。

rbo的建立:

glgenrenderbuffers    //得到一堆沒有使用的rbo的名字

gldeleterenderbuffers    //刪除rbo

glbindrenderbuffer    //生成rbo,可以不呼叫glgenrenderbuffers生成未使用的rbo名字,

//但不推薦這麼做。

glrenderbufferstorage(glenum target,glenum internalformat,

glsizei width, glsizei height)

//指定rbo的格式,申請儲存空間。

//可以在rbo新增到fbo的繫結點之前或者之後呼叫這個函式

//但必須在使用fbo接受渲染結果之前呼叫這個函式。

glint maxrenderbuffersize;

glgetintegerv(gl_max_renderbuffer_size, &maxrenderbuffersize);//得到可以的最大的rbo大小。

fbo建立:

glgenframebuffers

gldeleteframebuffers

glbindframebuffer     一繫結fbo,這個fbo就作為渲染環境的當前 fbo來使用了,也就是    

會渲染到這個fbo了。

glframebufferrenderbuffer();

glframebuffertexture2d();

如果一張紋理被新增到fbo,但在渲染的時候,這個紋理又被某個模型使用,

這樣是會導致gldrawelement,gldrawarray失敗。所以要注意避免這種情況。

檢測fbo的完整性:

glenum status = glcheckframebufferstatus(gl_framebuffer);

返回值:

gl_framebuffer_complete

gl_framebuffer_incomplete_attachment 某個必要的attachment點繫結了無效的紋理或rbo

gl_framebuffer_missing_attachment  所有的attachment point都是0

gl_framebuffer_incomplete_dimensions 各個attachment之間的尺寸不匹配

gl_framebuffer_incomplete_formats  某個attachment的internal format不能用於渲染。

gl_framebuffer_unsupported  三個attachment的組合的結果internal formats是不可渲染的。

視窗系統的su***ce可以支援多重取樣,可以有多重取樣快取。fbo不支援多重取樣快取attachment。

關於提公升渲染效能的建議:

頻繁的在自己建立的fbo和視窗系統建立的vbo之間切換,比較影響效能。

不要在每一幀都去建立,銷毀fbo,vbo物件。要一次建立多次使用。

如果乙個紋理attach到乙個fbo的attachment point,就要盡量避免呼叫glteximage2d或gltexsubimage2d

glcopyteximage2d等去修改紋理的值。

openGL ES 2 0開發流程

一 新增必須的framework 框架 opengles.frameworks和quartzcore.framework 二 修改openglview.h 引入opengl的header,建立一些後面會用到的例項變數 caeagllayer eagllayer eaglcontext context...

OpenGL ES 2 0基本概念

1.opengl es 2.0可程式設計管道 上圖黃色部分 vertex shader和fragment shader 為此管道的可程式設計部分。整個管道包含以下兩個規範 1 opengl es 2.0 api specification 2 opengl es shading language s...

OpenGL ES 2 0 學習筆記 四

從零開始學opengl,這裡對學習過程作記錄,包括學習資料,內容,基本知識。學習資料 opengl es 2.0 for android,網路 內容 1 基本概念 frustum 視錐體 focal point 視點或觀察者位置 field of vision 視野 目前看起來只能理解個大概,深入理...