FBO 离屏渲染慢

Posted

技术标签:

【中文标题】FBO 离屏渲染慢【英文标题】:FBO offscreen rendering slow 【发布时间】:2011-12-26 10:39:24 【问题描述】:

我想使用 openGL es 2.0 和 GLSL 着色器进行离屏渲染 我设置了 FBO,它似乎可以工作,除了有两个问题

1) 程序运行大约 30 fps,但突然间,它下降到 20 fps,然后又回到 30 fps,几秒钟后,又下降到 20 fps,然后又回到 30 fps,依此类推...(一直这样),我不知道是什么原因导致这种随机暂停/延迟 2)当我关闭应用程序时,它暂时没有响应。换句话说,似乎有一些数据需要清理或一些延迟......所以当我关闭程序时,它直到几秒钟后才会这样做。

我做错了吗?无论如何我可以解决这些问题吗? 这是我的代码:

我的init函数:

glGenFramebuffers(1,&frameBuf);
glGenRenderbuffers(1,&renderBuf);
glBindRenderbuffer(GL_RENDERBUFFER,renderBuf);
glRenderbufferStorage(GL_RENDERBUFFER,GL_RGBA4,640,480);
glBindRenderbuffer(GL_RENDERBUFFER,0);
glBindFramebuffer(GL_FRAMEBUFFER,frameBuf);
glFramebufferRenderbuffer(GL_FRAMEBUFFER,GL_COLOR_ATTACHMENT0,GL_RENDERBUFFER,renderBuf);
GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
if(status != GL_FRAMEBUFFER_COMPLETE)
    printf("GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT\n");
else
    printf("COMPLETE\n");

glBindFramebuffer(GL_FRAMEBUFFER,0);

我的 draw 函数:

glBindFramebuffer(GL_FRAMEBUFFER, frameBuf);
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

GLfloat vertices1[] = 
    -1.0,-1.0,-1.0, 1.0,-1.0,-1.0, -1.0,1.0,-1.0,
    1.0, 1.0,-1.0, -1.0,1.0,-1.0, 1.0,-1.0,-1.0
;
glVertexAttribPointer(vertexAttr1, 3, GL_FLOAT, GL_FALSE, 0, vertices1);
glEnableVertexAttribArray(vertexAttr1);
GLfloat texCoord[] = 
    0.0f,0.0f, 1.0f,0.0f, 0.0f,1.0f,
    1.0f,1.0f, 0.0f,1.0f, 1.0f,0.0f
;

glVertexAttribPointer(texCoordAttr1, 2, GL_FLOAT, GL_FALSE, 0, texCoord);
glEnableVertexAttribArray(texCoordAttr1);

glDrawArrays(GL_TRIANGLES, 0, 6);
glBindFramebuffer(GL_FRAMEBUFFER, 0);

【问题讨论】:

【参考方案1】:

以下几点可能有助于提高性能:

glClearColor()只需要在init函数中调用一次。 在 init 函数中只创建一次 GLFloat 数组,将它们存储在 VBO 中并使用它们进行渲染。这样可以避免每帧都必须将所有顶点数据通过总线发送到 GPU。 将 glEnableVertexAttribArray() 调用移至 init,无需在每一帧都重新启用它们。 在这种情况下,您不需要解绑帧缓冲区。这也消除了在绘图开始时的glBindFramebuffer() 调用。 在 init 中生成一个 VAO 并使用它来替换 draw 方法的大部分剩余部分。

如果我们能看到你的着色器,那就太好了。许多嵌入式系统在使用片段着色器时速度不是很快,您的着色器可能是这里的问题。

哦,你什么时候打电话给glUseProgram()

【讨论】:

以上是关于FBO 离屏渲染慢的主要内容,如果未能解决你的问题,请参考以下文章

egl离屏渲染中的pbuffer vs fbo

WebGL—实现使用FBO离屏渲染(亦同拷贝纹理)off-screen rendering的两种方式

WebGL—实现使用FBO离屏渲染(亦同拷贝纹理)off-screen rendering的两种方式

我的OpenGL学习进阶之旅解决使用Assimp和OpenGL进行在屏渲染和离屏渲染FBO时绘制3D模型出现各种诡异的模型渲染画面问题,都是血和泪的教训啊!!!

离屏渲染,OpenGL的三种渲染方式

离屏渲染