es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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);

Tags:  , , ,

Answer

  1. Avatar for 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:

    // Crear búfer de profundidad
    glGenRenderbuffers(1, &depthRenderBuffer);
    glBindRenderbuffer(GL_RENDERBUFFER, depthRenderBuffer);
    glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, self.drawableWidth, self.drawableHeight);
    
    // Adjuntar búfer de profundidad al framebuffer
    glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depthRenderBuffer);
    

    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.

Comments are closed.