fbo多個color buffer繪製

2021-06-21 11:24:31 字數 4036 閱讀 4210

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 模...