幀快取物件(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 視野 目前看起來只能理解個大概,深入理...