opengl es - FBO offscreen rendering lento
opengl-es glsl (1)
Aquí hay algunas cosas que pueden ayudar con el rendimiento:
-
glClearColor()
solo necesita ser llamado una vez en la función init. - Crea las matrices GLFloat solo una vez en la función init, guárdalas en VBO y úsalas para renderizarlas. Esto evita tener que enviar todos sus datos de vértice por el bus a la GPU en cada cuadro.
- Mueva las llamadas
glEnableVertexAttribArray()
a init, sin necesidad de volver a habilitarlas en cada fotograma. - En este caso, no necesita desvincular nunca el framebuffer. Eso también elimina la llamada
glBindFramebuffer()
al comienzo del sorteo. - Genere un VAO en init y úselo para reemplazar la mayoría de lo que queda del método de sorteo.
También sería bueno si pudiéramos ver tus sombreadores. Muchos sistemas integrados no son muy rápidos con sombreadores de fragmentos, sus sombreadores podrían ser el problema aquí.
Ah, ¿y cuándo llamas a glUseProgram()
?
Quiero usar renderización fuera de pantalla usando OpenGL es 2.0 y sombreador GLSL
Configuro FBO y parece funcionar, excepto que hay dos problemas
1) El programa va a unos 30 fps pero, de repente, baja a 20 fps y vuelve a 30 fps nuevamente, luego unos segundos más tarde, cae a 20 fps nuevamente y vuelve a los 30 fps, y así sucesivamente ... (continúa) así) y no sé qué causa esta pausa / demora aleatoria
2) Cuando cierro la aplicación, no responde por un tiempo. En otras palabras, parece que hay algunos datos para limpiar o algo de retraso ... Entonces, cuando cierro el programa, no lo hago hasta unos segundos más tarde.
¿Estoy haciendo algo mal? ¿Hay alguna forma en que pueda arreglar esto?
Aquí está mi código:
Mi función 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);
La función de mi dibujo :
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);