Tengo problemas para crear un FBO y luego usarlo como textura en mi aplicación iOS. He subido una versión reducida de mi aplicación en github, que muestra el problema. Solo tengo una pantalla en blanco con un color extraño que nunca configuré. El estado de comprobación muestra que el FBO se creó con éxito.Ejemplo mínimo para crear FBO usando OpenGL ES 2.0 en iOS
https://github.com/glman74/simpleFBO
ya he mirado preguntas relacionadas stackoverflow, y específicamente el siguiente enlace de datenwolf que muestra cómo configurar una OBF utilizando GLUT, pero no utiliza shaders. Todavía no estoy seguro de lo que estoy haciendo mal.
https://github.com/datenwolf/codesamples/blob/master/samples/OpenGL/minimalfbo/
También estoy aquí anexar partes pertinentes del Código. En el método renderFBO, solo estoy haciendo un claro. Hubiera esperado que esta textura de color sólido (verde) se usara cuando renderizo el polígono en el render principal.
OBF configuración:
// intialize FBO
- (void)setupFBO
{
fbo_width = 512;
fbo_height = 512;
glGenFramebuffers(1, &fboHandle);
glGenTextures(1, &fboTex);
glGenRenderbuffers(1, &depthBuffer);
glBindFramebuffer(GL_FRAMEBUFFER, fboHandle);
glBindTexture(GL_TEXTURE_2D, fboTex);
glTexImage2D(GL_TEXTURE_2D,
0,
GL_RGBA,
fbo_width, fbo_height,
0,
GL_RGBA,
GL_UNSIGNED_BYTE,
NULL);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER_APPLE, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, fboTex, 0);
glBindRenderbuffer(GL_RENDERBUFFER, depthBuffer);
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT24_OES, fbo_width, fbo_height);
glFramebufferRenderbuffer(GL_DRAW_FRAMEBUFFER_APPLE, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depthBuffer);
// FBO status check
GLenum status;
status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
switch(status) {
case GL_FRAMEBUFFER_COMPLETE:
NSLog(@"fbo complete");
break;
case GL_FRAMEBUFFER_UNSUPPORTED:
NSLog(@"fbo unsupported");
break;
default:
/* programming error; will fail on all hardware */
NSLog(@"Framebuffer Error");
break;
}
glBindFramebuffer(GL_FRAMEBUFFER, 0);
}
OBF imagen:
// render FBO
- (void)renderFBO
{
glBindTexture(GL_TEXTURE_2D, 0);
glEnable(GL_TEXTURE_2D);
glBindFramebuffer(GL_FRAMEBUFFER, fboHandle);
glViewport(0,0, fbo_width, fbo_height);
glClearColor(0.0f, 1.0f, 0.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glBindFramebuffer(GL_FRAMEBUFFER, 0);
}
principal Render:
- (void)glkView:(GLKView *)view drawInRect:(CGRect)rect
{
// render FBO tex
[self renderFBO];
glViewport(0, 0, self.view.bounds.size.width, self.view.bounds.size.height);
// render main
glClearColor(0.65f, 0.65f, 0.65f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glEnable(GL_TEXTURE_2D);
glActiveTexture(GL_TEXTURE0);
glUniform1i(uSamplerLoc, 0);
// Render
glUseProgram(_program);
glUniformMatrix4fv(uniforms[UNIFORM_MODELVIEWPROJECTION_MATRIX], 1, 0, _modelViewProjectionMatrix.m);
glUniformMatrix3fv(uniforms[UNIFORM_NORMAL_MATRIX], 1, 0, _normalMatrix.m);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
glDisable(GL_TEXTURE_2D);
}
Una idea sobre lo que podría estar haciendo mal?
Edición # 1:
he hecho algunos pequeños cambios a mi código en GitHub. Intenté usar GL_FRAMEBUFFER en lugar de GL_DRAW_FRAMEBUFFER_APPLE arriba. También se agregó una llamada de textura de enlace, que faltaba. Aún no funciona.
Edit # 2:
Encontré una solución. Necesitaba llamar al render principal:
// reset to main framebuffer
[((GLKView *) self.view) bindDrawable];
Gracias, su ejemplo realmente me ayudó. Si alguien tiene un error de compilación con GL_DEPTH_COMPONENT24_OES reemplácelo con GL_DEPTH_COMPONENT16 – LightMan