Obtener un búfer vacío usando glReadPixels con GLKit.
En una aplicación de OpenGL ES en la que estoy trabajando, cuando uso glReadPixels para obtener píxeles obtengo un búfer vacío. Ahora no sé qué está mal en mi código. Gracias por cualquier ayuda.
- (void)setTextureImage:(UIImage *)image {
self.textureID = [self createTextureWithImage:image];
}
CAEAGLLayer *layer = [[CAEAGLLayer alloc] init];
layer.frame = CGRectMake(0, 0, self.frame.size.width, self.frame.size.height);
layer.contentsScale = [[UIScreen mainScreen] scale];
layer.opaque = NO;
[self.layer addSublayer:layer];
[self bindRenderLayer:layer];
}
- (void)bindRenderLayer:(CALayer<eagldrawable> *)layer {
glGenRenderbuffers(1, &renderBuffer);
glBindRenderbuffer(GL_RENDERBUFFER, renderBuffer);
[self.context renderbufferStorage:GL_RENDERBUFFER fromDrawable:layer];
glGenFramebuffers(1, &frameBuffer);
glBindFramebuffer(GL_FRAMEBUFFER, frameBuffer);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, renderBuffer);
}
- (GLint)drawableWidth {
GLint backingWidth;
glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_WIDTH, &backingWidth);
return backingWidth;
}
- (GLint)drawableHeight {
GLint backingHeight;
glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_HEIGHT, &backingHeight);
return backingHeight;
}
// El código de muestra anterior es solo una parte de la textura de visualización y funciona bien. El renderBuffer y frameBuffer son propiedades de mi clase.
// Código de muestra para obtener un píxel aquí, ¿por qué el búfer está vacío después de usar glReadPixels? ¿Me he perdido algo en la configuración?
glBindRenderbuffer(GL_RENDERBUFFER, renderBuffer);
// He intentado usar uno o ambos métodos de enlace pero no funciona
//glBindFramebuffer(GL_FRAMEBUFFER, frameBuffer);
NSInteger dataLength = self.drawableWidth * self.drawableHeight * 4;
GLubyte *buffer = (GLubyte *)malloc(dataLength * sizeof(GLubyte));
glReadPixels(0, 0, self.drawableWidth, self.drawableHeight, GL_RGBA, GL_UNSIGNED_BYTE, buffer);
davy.ai
Parece que te falta configurar un búfer de profundidad, lo cual podría resultar en un búfer vacío al usar glReadPixels. Intenta agregar el siguiente código en tu método bindRenderLayer:
Esto creará un búfer de profundidad y lo adjuntará a tu framebuffer, lo cual podría solucionar el problema de obtener un búfer vacío al usar glReadPixels.