在opengl中,实现FBO的创建和删除需要用到这两个函数
glGenFramebuffersEXT(1, &fbo);
glDeleteFramebuffersEXT(1, &fbo);
然而在Qt中却找不到glDeleteFramebuffersEXT这个函数,而可以找到这个函数
glDeleteFramebuffers(1,&fbo);
//inline void QOpenGLFunctions::glDeleteFramebuffers(GLsizei n, const GLuint* framebuffers)
具体函数参数实现如上,具体函数参考OenglAPI的文档
Name
glDeleteFramebuffers — delete framebuffer objects
C Specification
void glDeleteFramebuffers(
GLsizei n, GLuint *framebuffers )
;Parameters
n
Specifies the number of framebuffer objects to be deleted. 指定要删除的帧缓冲区对象的数量。
framebuffers
A pointer to an array containing
n
framebuffer objects to be deleted. 指向包含要删除的n个帧缓冲区对象的数组的指针。Description
glDeleteFramebuffers
deletes then
framebuffer objects whose names are stored in the array addressed byframebuffers
. Unused names inframebuffers
that have been marked as used for the purposes of glGenFramebuffers are marked as unused again. The name zero is reserved by the GL and is silently ignored, should it occur inframebuffers
, as are other unused names. Once a framebuffer object is deleted, its name is again unused and it has no attachments. If a framebuffer that is currently bound to one or more of the targetsGL_DRAW_FRAMEBUFFER
orGL_READ_FRAMEBUFFER
is deleted, it is as though glBindFramebuffer had been executed with the correspondingtarget
andframebuffer
zero.glDeleteFramebuffers删除其名称存储在由framebuffer寻址的数组中的n个framebuffer对象。
帧缓冲区中未使用的名称已被标记为用于glGenFramebuffer的用途再次被标记为未使用。
GL保留了名称零,如果它出现在帧缓冲区中,则它会被静默忽略,就像其他未使用的名称一样。
删除帧缓冲区对象后,其名称将再次未使用且没有附件。
如果当前绑定到一个或多个目标GL_DRAW_FRAMEBUFFER或GL_READ_FRAMEBUFFER的一个帧缓冲区被删除,则好像已经用相应的目标和帧缓冲区零执行了glBindFramebuffer。Errors
GL_INVALID_VALUE
is generated ifn
is negative.
在Qt的具体实现中,我们可以这么操作,
QOpenglFrameObject *FBO = new QOPenglFrameObject(QSzie(size,size));
GLuint fbo = FBO->handle();//返回此帧缓冲对象的OpenGL帧缓冲对象句柄
glDeleteFramebuffers(1,&fbo);
delete FBO;
FBO= null;
如此便可以实现对帧对象的清理。