#ios #opengl-es #glkit #caeagllayer
#iOS #opengl-es #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 lt;EAGLDrawablegt; *)layer { glGenRenderbuffers(1, amp;renderBuffer); glBindRenderbuffer(GL_RENDERBUFFER, renderBuffer); [self.context renderbufferStorage:GL_RENDERBUFFER fromDrawable:layer]; glGenFramebuffers(1, amp;frameBuffer); glBindFramebuffer(GL_FRAMEBUFFER, frameBuffer); glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, renderBuffer);}- (GLint)drawableWidth { GLint backingWidth; glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_WIDTH, amp;backingWidth); return backingWidth;}- (GLint)drawableHeight { GLint backingHeight; glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_HEIGHT, amp;backingHeight); return backingHeight;}
приведенный выше пример кода является лишь частью текстуры дисплея, и он отлично работает. Буфер визуализации и буфер кадров являются собственностью моего класса.пример кода пикселя здесь, буфер пуст после использования 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:
Я нашел решение. Когда вы устанавливаете рисоваемые свойства CAEAGLLayer, как это:
layer.drawableProperties = @{ kEAGLDrawablePropertyRetainedBacking: @(YES), kEAGLDrawablePropertyColorFormat: kEAGLColorFormatRGBA8 };
kEAGLDrawablePropertyRetainedBacking = YES
делает это так, чтобы вы могли получить буфер при завершении рендеринга.