FBO屏幕外渲染速度慢

时间:2011-12-26 10:39:24

标签: opengl-es glsl fbo

我想使用openGL es 2.0和GLSL着色器进行屏幕外渲染 我设置了FBO,看起来很有效,除了有两个问题

1)程序大约30 fps,但突然之间,它下降到20fps,然后再次回到30 fps,然后几秒后,再次下降到20fps然后再回到30fps等等......(继续这样下去)我不知道是什么导致这种随机暂停/延迟 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);

我的绘制功能:

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 个答案:

答案 0 :(得分:3)

以下是可能对性能有所帮助的一些事项:

  • glClearColor()只需要在init函数中调用一次。
  • 在init函数中只创建一次GLFloat数组,将它们存储在VBO中并使用它们进行渲染。这样就不必每帧都将所有顶点数据沿着总线发送到GPU。
  • glEnableVertexAttribArray()调用移至init,无需每帧重新启用它们。
  • 在这种情况下,您无需取消绑定帧缓冲区。这也是在绘制开始时摆脱glBindFramebuffer()调用。
  • 在init中生成VAO并使用它来替换大部分绘制方法的剩余部分。

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

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