FBO закадровый рендеринг медленный - PullRequest
1 голос
/ 26 декабря 2011

Я хочу использовать внеэкранный рендеринг с использованием 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);

1 Ответ

3 голосов
/ 30 декабря 2011

Вот несколько вещей, которые могут помочь с производительностью:

  • glClearColor() нужно вызывать только один раз в функции init.
  • Создавать массивы GLFloat только один раз вФункция init, сохраняйте их в VBO и используйте их для рендеринга.Это избавляет от необходимости посылать все ваши данные вершин по шине в графический процессор каждый кадр.
  • Перемещать вызовы glEnableVertexAttribArray() в init, не нужно повторно включать их каждый кадр.
  • В этом случае вам не нужно когда-либо снимать привязку с кадрового буфера.Это также избавляет от вызова glBindFramebuffer() в начале отрисовки.
  • Создайте VAO в init и используйте его для замены большей части того, что осталось от метода отрисовки.

Также было бы хорошо, если бы мы могли видеть ваши шейдеры.Многие встроенные системы не очень быстро работают с фрагментными шейдерами, здесь могут быть ваши шейдеры.

О, а когда вы звоните glUseProgram()?

...