fbo: frame buffer object主要用來render-to-texture,進行off-screen rendering.
以下是使用步驟:
1,初始化glewinit(),然後檢測 gpu是否支援gl_ext_framebuffer_object擴充套件
2,建立fbo ,
gluint fbo, color;
// create an fbo
glgenframebuffer***t(1, &fbo);
// create color texture
glgentextures(1, &color);
glbindtexture(gl_texture_2d, color);
glteximage2d(gl_texture_2d, 0, gl_rgba8, width, height, 0,
gl_rgba, gl_unsigned_byte, null);
glgeneratemipmapext(gl_texture_2d);//生成mipmap
// bind the fbo and attach color texture to it
glbindframebufferext(gl_framebuffer_ext, fbo);
glframebuffertexture2dext(gl_framebuffer_ext, gl_color_attachment0_ext, gl_texture_2d, color, 0);
對於乙個fbo,可以繫結多個gl_color_attachment(i)_ext,即可以有多個color
查詢當前裝置顏色繫結點的最大值:
gluint maxbuffers;
glgetintergeri(gl_max_color_attachments, &maxbuffers);
對於深度快取:使用32位float紋理
gluint depth,
glgentextures(1, &detph);
glbindtexture(gl_texture_rectangle_arb, depth);
gltexparameteri(gl_texture_rectangle_arb, gl_texture_wrap_s, gl_clamp);
gltexparameteri(gl_texture_rectangle_arb, gl_texture_wrap_t, gl_clamp);
gltexparameteri(gl_texture_rectangle_arb, gl_texture_min_filter, gl_nearest);
gltexparameteri(gl_texture_rectangle_arb, gl_texture_mag_filter, gl_nearest);
glteximage2d(gl_texture_rectangle_arb, 0, gl_depth_component32f_nv,
widht, height, 0, gl_depth_component, gl_float, null);
glframebuffertexture2dext(gl_framebuffer_ext, gl_stencil_attachment_ext, gl_texture_rectangle_ext,depth, 0);
對於stencil buffer,目前是和depth buffer繫結在一起的,需要支援gl_ext_packed_depth_stencil extension擴充套件。
其定義方式如下:
gluint depthstencil;
glgentextures(1, &detphstencil);
glbindtexture(gl_texture_2d, depthstencil);
gltexparameteri(gl_texture_2d, gl_texture_min_filter, gl_linear);
glteximage2d(gl_texture_2d, 0, gl_depth24_stencil8_ext, widht, height, 0,
gl_depth_stencil_ext, gl_unsigned_int_24_8_ext, null);
glframebuffertexture2dext(gl_framebuffer_ext, gl_depth_attachment_ext,
gl_texture_2d, depthstencil,0);
glframebuffertexture2dext(gl_framebuffer_ext, gl_stencil_attachment_ext,
gl_texture_2d, depthstencil,0);
對於depth, stencil buffer繫結的紋理,不支援mipmap.
另外也可以使用renderbuffer與fbo繫結。
注意:fbo裡如果不指定要寫depth buffer,stencil buffer,僅僅enable depth test, 並不會寫depth buffer!
3,使用fbo ,使用前一定要 glclear(gl_color_buffer_bit | gl_depth_buffer_bit);glbindframebufferext(gl_framebuffer_ext, fbo);
返回到主frambebuffer只需要
glbindframebufferext(gl_framebuffer_ext, 0);
4,對於繫結多個color buffer,如果指定渲染到其中某乙個buffer,則用gldrawbuffer
// render to color0
glbindframebufferext(gl_framebuffer_ext, fbo);
gldrawbuffer(gl_ color_attachment0_ext);
// render to color1
gldrawbuffer(gl_ color_attachment1_ext);
5, 如果一次渲染多個color buffer,則是mulitple rendering target (mrt)。如果要指定渲染的起始buffer,則用gldrawbuffers
glbindframebufferext(gl_framebuffer_ext, fbo);
gldrawbuffers(gl_ color_attachment(i)_ext);
查詢可以一次同時寫入緩衝區的個數:
gluint maxbuffers;
glgetintergeri(gl_max_draw_buffers, &maxbuffers);
因而,如果我們已經把兩個紋理分別繫結到繫結點0和1,現在我們想同時渲染輸出到這兩個紋理上,我們就可以按以下**來寫:
glenum buffers = ;
gldrawbuffers(2, buffers);
當上面的函式正確執行之後,opengl 便建立了乙個雙顏色緩衝渲染輸出的環境
6,讀取fbo渲染的內容,有兩種辦法
定義輸出影象:
unsigned char output_image = new unsigned char[ width*height];
a, 直接讀buffer,
glreadbuffer(gl_ color_attachment(i)_ext)
glreadpixels( 0, 0,width,height, gl_rgb, gl_float,output_image);
b, 讀繫結的texture ,color是繫結的紋理
glbindtexture(gl_texture_rectangle_arb,color);
glgetteximage(gl_texture_rectangle_arb,0,gl_depth_component,gl_unsigned_byte,output_image);
7,delete fbo
gldeleteframebuffer***t(1,&fbo);
rbo和fbo to texture區別:
FBO 渲染到紋理
這是書中第八章的最後一節內容,在我機制的簡化問題後,寫出了想要的效果.應用fbo渲染到紋理,可以直接用.這個用來實現鏡面效果什麼的,好啊.再乙個,貌似我現在已經可以去寫延遲渲染流水線了,那個用到多渲染目標,之後再處理.呼,繼續學習吧,這些東西還真得實踐才行啊.rendertotexture.cpp ...
OpenGLES實戰應用FBO
opengles實戰應用fbo opengl流水線上顯示階段畫素所在處,稱為幀快取。它包括了 顏色快取 深度快取 模板快取和累積快取。fbo也有一組相應儲存顏色 深度和模板資料的快取區域,沒有累積快取。快取關聯影象分為兩類 紋理快取和渲染快取。如果紋理物件的影象資料關聯到幀快取,opengl執行的將...
Opengl中的FBO物件
文章 概要 在opengl的渲染管線中,幾何資料和紋理通過一系列變換和測試,最終被渲染成螢幕上的二維畫素。那些用於儲存顏色值和測試結果的二維陣列的幾何被稱為幀緩衝區 frame buffer 這些二維陣列按用途劃分,可分為顏色緩衝區 color buffer 深度緩衝區 depth buffer 模...