1. 程式人生 > >OpenGL渲染到幀快取物件(FBO)

OpenGL渲染到幀快取物件(FBO)

視窗系統提供的幀快取是唯一可以被圖形伺服器的顯示系統所識別的幀快取。
也就是說,我們要想在螢幕上看到東西,就必須把它畫在這個視窗系統提供的幀快取中。

自己可以建立幀快取,幀快取有多個attachment,對應shader的輸出
例如
layout (location = 0) out vec4 color0; 對應的是GL_COLOR_ATTACHMENT0
layout (location = 1) out vec4 color1; 對應的是GL_COLOR_ATTACHMENT1
也有深度的attachment和模板的attachment
我們若想要獲取幀快取中的東西,可以用渲染快取(renderbuffer)或者紋理(texture)去接它
一個renderbuffer對應一個attachment
可以用glReadBuffer獲取renderbuffer中的東西
同樣,一張2D紋理對應一個attachment(如果有mipmap則是一張紋理的一個級別對應一個attachment)

1. 建立n個幀快取物件id

void glGenFramebuffers(GLsizei n,GLuint* ids);

2.建立幀快取物件並切換到當前幀快取

void glBindFramebuffer(GLenum target, GLuint framebuffer);

target可以是GL_DRAW_FRAMEBUFFER / GL_READ_FRAMEBUFFER / GL_FRAMEBUFFER
預設情況下(或 framebuffer = 0 )繫結的是視窗系統的幀快取

3.建立n個渲染快取物件id

void glGenRenderbuffers(GLsizei n, GLuint* ids);

4.繫結渲染快取

void glBindRenderbuffer(
GLenum target, //必須是GL_RENDERBUFFER
GLuint renderbuffer_id
);

5.為渲染快取分配空間

void glRenderbufferStorage(
GLenum target, //必須是GL_RENDERBUFFER
GLenum internalformat, 
GLsizei width, GLsizei height
);

6.將渲染快取關聯到幀快取的某一個附件上

void glFramebufferRenderbuffer(
GLenum target,     //GL_DRAW_FRAMEBUFFER / GL_READ_FRAMEBUFFER / GL_FRAMEBUFFER
GLenum attachment, //GL_COLOR_ATTACHMENTi / GL_DEPTH_ATTACHMENT /GL_STENCIL_ATTACHMENT
GLenum renderbuffertarget  //必須是GL_RENDERBUFFER, 
GLuint renderbuffer_id);

一個幀快取有多個附件
一個渲染快取與一個附件關聯

7.將紋理關聯到幀快取的某一個附件上

void glFramebufferTexture2D(
GLenum target,   //GL_DRAW_FRAMEBUFFER / GL_READ_FRAMEBUFFER / GL_FRAMEBUFFER
GLenum attachment,  //GL_COLOR_ATTACHMENTi / GL_DEPTH_ATTACHMENT /GL_STENCIL_ATTACHMENT
GLenum texturetarget,  //GL_TEXTURE_2D...
GLuint texture, //紋理物件的id
GLint level  //紋理的mipmap級別
);