Получить пустой буфер, используя glReadPixels с GLKit

В приложении OpenGL ES, над которым я работаю, я использую glReadPixels для получения пикселя, но получил пустой буфер. Теперь я не знаю, что не так в моем коде. Спасибо за любую помощь.

      - (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;
}

приведенный выше пример кода - это только часть отображаемой текстуры, и он отлично работает. RenderBuffer и framebuffer являются собственностью моего класса. пример получения кода пикселя здесь, буфер пуст после использования glReadPixels? Я что-то пропустил для настройки?

          glBindRenderbuffer(GL_RENDERBUFFER, renderBuffer);
    // I'm try to use one or both of the bind method but not worked
    //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);

1 ответ

Я нашел решение. Когда вы устанавливаете drawableProperties CAEAGLLayer следующим образом:

          layer.drawableProperties = @{
        kEAGLDrawablePropertyRetainedBacking: @(YES),
        kEAGLDrawablePropertyColorFormat: kEAGLColorFormatRGBA8
    };

kEAGLDrawablePropertyRetainedBacking = YESделает так, чтобы вы могли получить буфер после завершения рендеринга.

Другие вопросы по тегам