2011-12-26 47 views
1

我想離屏幕使用的OpenGL ES 2.0和GLSL着色器
我設置FBO渲染使用,它似乎工作,除了有兩個問題
FBO的屏幕外着色慢

1)程序的進展約30 fps的,但所有的突然,它下降到20fps,然後再回到30fps,然後幾秒鐘後,再次下降到20fps,然後回到30fps,等等......(繼續這樣下去),我不知道是什麼原因這個隨機暫停/延遲
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); 

回答

3

這裏有幾件事情,可能與性能幫助:

  • glClearColor()只需要在init函數中調用一次。
  • 在init函數中只創建一次GLFloat數組,將它們存儲在VBO中並使用它們進行渲染。這樣可以避免必須將所有頂點數據在總線上每幀發送到GPU。
  • glEnableVertexAttribArray()調用移動到init,無需繼續每幀重新啓用它們。
  • 在這種情況下,您不需要解除綁定幀緩衝區。這也可以在開始抽籤時擺脫glBindFramebuffer()的呼叫。
  • 在init中生成一個VAO並用它來替換大部分剩下的繪製方法。

如果我們可以看到着色器,它也會很好。很多嵌入式系統對片段着色器來說速度不是很快,因此着色器可能成爲問題。

哦,你什麼時候打電話glUseProgram()