- Framebuffer Object 其自身並沒有實際的內存,它可以理解爲內存管理者(manager)。其管理的內存是和Framebuffer Object綁定的附件(color attachments,depth attachment,stencil attachment),如紋理(texture,renderbufer object),其綁定附件才擁有實際的內存。
- OpenGL ES 的默認Framebuffer Object(ID 爲0 ),其color attachments,depth attachment,stencil attachment是由openg es自己創建的,(其color attachments很有可能就是Android 的GraphicBuffer, 待驗證!!),其大小是和EGLSurface的尺寸相等的。
- 在自己創建的FrameBuffer Object時,其綁定的附件的大小是任意的,甚至可以比EGLSurface的尺寸大,可以調整glViewport大小來調整渲染繪製的範圍。opengl es 渲染操作會直接作用到其綁定的附件上。
opengl es渲染繪製的區域是由glViewport來指定的
void glViewport(GLint x, GLint y, GLsizei w, GLsizei h)
座標(x,y)對應NDC座標的(-1,-1)
座標(x+w,y+h)對應NDC座標的(1,1)。
glViewport設置的範圍是任意的,甚至可以比FrameBuffer Object綁定附件的尺寸還要大(在綁定默認的FrameBuffer Object時,可以比EGLSurface還要大;在綁定子定義的FrameBuffer Object時,可以綁定的attachments尺寸還要大,如在color attachments爲texture時,可以比texture的尺寸還要大),但是隻有其有效範圍(FrameBuffer Object 綁定附件重合的部分)才能渲染出圖來。
一篇比較好的學習資料
Android openglES Framebuffer是什麼buffer及其大小?
OpenGL 圖形庫的使用(二十五)—— 高級OpenGL之幀緩衝Framebuffers