窗口系统提供的帧缓存是唯一可以被图形服务器的显示系统所识别的帧缓存。
也就是说,我们要想在屏幕上看到东西,就必须把它画在这个窗口系统提供的帧缓存中。
自己可以创建帧缓存,帧缓存有多个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级别
);