Opengl es FBO屏幕外渲染速度慢

Opengl es FBO屏幕外渲染速度慢,opengl-es,glsl,fbo,Opengl Es,Glsl,Fbo,我想使用openGL es 2.0和GLSL着色器进行屏幕外渲染 我设置了FBO,除了有两个问题外,它似乎工作正常 1) 程序以30 fps的速度运行,但突然间,它下降到20 fps,然后又恢复到30 fps,几秒钟后,又下降到20 fps,然后又恢复到30 fps,以此类推……(继续这样进行),我不知道是什么原因导致了这种随机暂停/延迟 2) 当我关闭应用程序时,它暂时没有响应。换句话说,似乎有一些数据需要清理或延迟…所以当我关闭程序时,它直到几秒钟后才会这样做。 我做错什么了吗?还有什么我可

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

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

我做错什么了吗?还有什么我可以修的吗
这是我的代码:

我的初始化函数:

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);

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

  • glClearColor()
    只需在init函数中调用一次
  • 在init函数中仅创建一次GLFloat数组,将它们存储在VBOs中并使用它们进行渲染。这避免了每帧都必须将所有顶点数据通过总线发送到GPU
  • GlenableVertexAttributeArray()
    调用移动到init,无需在每一帧继续重新启用它们
  • 在这种情况下,不需要解除帧缓冲区的绑定。这也消除了绘图开始时的
    glBindFramebuffer()
    调用
  • 在init中生成一个VAO,并使用它替换draw方法剩下的大部分内容
如果我们能看到你的着色器也会很好。很多嵌入式系统使用片段着色器的速度不是很快,您的着色器可能是这里的问题

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