Я хочу использовать внеэкранный рендеринг с использованием openGL es 2.0 и GLSL shader
Я установил FBO, и, кажется, работает, за исключением двух проблем
1) Программа работает со скоростью 30 кадров в секунду, но внезапно она падает до 20 кадров в секунду, а затем снова возвращается к 30 кадрам в секунду, затем через несколько секунд снова падает до 20 кадров в секунду, затем возвращается к 30 кадрам в секунду и так далее ... ( так продолжается) и я не знаю, что вызвало эту случайную паузу / задержку
2) Когда я закрываю приложение, оно не отвечает некоторое время. Другими словами, кажется, что есть некоторые данные для очистки или некоторая задержка ... Так что, когда я закрываю программу, это происходит только через несколько секунд.
Я что-то не так делаю? Есть ли в любом случае, я могу это исправить?
Вот мой код:
My 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);
Функция my 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);