¿Cómo restaurar un GL_RENDERBUFFER?

Estoy trabajando para almacenar y restaurar el estado de mi aplicación basada en OpenGL ES.

Tengo una function para save el GL_RENDERBUFFER para volcar los datos con el siguiente código:

glBindFramebuffer(GL_FRAMEBUFFER, fboTextureBufferData.framebuffer); glBindRenderbuffer(GL_RENDERBUFFER, fboTextureBufferData.colorbuffer); GLint x = 0, y = 0, width2 = backingWidth, height2 = backingHeight; NSInteger dataLength = width * height * 4; GLubyte *data = (GLubyte*)malloc(dataLength * sizeof(GLubyte)); // Read pixel data from the framebuffer glPixelStorei(GL_PACK_ALIGNMENT, 4); glReadPixels(x, y, width, height, GL_RGBA, GL_UNSIGNED_BYTE, data); 

No veo una function glWritePixels. ¿Cuál es la mejor manera de repoblar el GL_RENDERBUFFER con los datos de GLubyte poblados arriba? Un ejemplo sería muy apreciado.

EDIT 3:

Aquí es cómo bash configurar el buffer de renderizado de textura y la function utilizada para dibujarlo. Como se indica en el código, si especifique GL_COLOR_ATTACHMENT1 para el parámetro glFramebufferTexture2D, se restaurarán los datos de píxeles almacenados, pero no puedo hacer que se realicen actualizaciones. Pero si uso GL_COLOR_ATTACHMENT0 en su lugar, obtengo las actualizaciones de dibujo pero no se restauran los datos de píxeles.

He intentado varias combinaciones (por ejemplo, también usando GL_COLOR_ATTACHMENT1 para el parámetro glFramebufferRenderbuffer), pero luego obtengo un error de búfer de ttwig inválido al intentar renderizar. Parece que estoy muy cerca, pero no puedo entender cómo lograr que ambos se restauren y funcionen trabajando juntos.

 - (bool)configureRenderTextureBuffer { [EAGLContext setCurrentContext:context]; glBindRenderbuffer(GL_RENDERBUFFER, viewRenderbuffer); [context renderbufferStorage:GL_RENDERBUFFER fromDrawable:(CAEAGLLayer*)self.layer]; glBindRenderbuffer(GL_RENDERBUFFER, viewRenderbuffer); [context renderbufferStorage:GL_RENDERBUFFER fromDrawable:(CAEAGLLayer*)self.layer]; glGenFramebuffers(1, &fboTextureBufferData.framebuffer); glBindFramebuffer(GL_FRAMEBUFFER, fboTextureBufferData.framebuffer); glGenRenderbuffers(1, &fboTextureBufferData.colorbuffer); glBindRenderbuffer(GL_RENDERBUFFER, fboTextureBufferData.colorbuffer); glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8, backingWidth, backingHeight); glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, fboTextureBufferData.colorbuffer); // Generate texture name, stores in .textureID glGenTextures(1, &fboTextureBufferData.textureID); glBindTexture(GL_TEXTURE_2D, fboTextureBufferData.textureID); ////////////////// Read Existing texture data ////////////////// NSString *dataPath = [TDTDeviceUtilitesLegacy documentDirectory]; //This just returns the app's document directory NSData *data = [NSData dataWithContentsOfFile:[NSString stringWithFormat:@"%@/buffer.data", dataPath]]; GLubyte *pixelData = (GLubyte*)[data bytes]; // If I use GL_COLOR_ATTACHMENT1 here, my existing pixel data is restnetworking // but no drawing occurs. If I use GL_COLOR_ATTACHMENT0, then data isn't // restnetworking but drawing updates work glFramebufferTexture2D ( GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1, GL_TEXTURE_2D, fboTextureBufferData.textureID, 0 ); // Populate with existing data glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, backingWidth, backingHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, &pixelData[0]); //&image[0] glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER) ; if(status != GL_FRAMEBUFFER_COMPLETE) { NSLog(@"failed to make complete render texture framebuffer object %x", status); return false; } return true; } 

Aquí está el código para renderizar. El viewFramebuffer está adjunto a GL_COLOR_ATTACHMENT0 y se utiliza para que el buffer de marco de textura se pueda ampliar y posicionar dentro de la vista.

 - (void)renderTextureBuffer { //Bind the texture frame buffer, if I don't use this, I can't get it to draw //glBindFramebuffer(GL_FRAMEBUFFER, fboTextureBufferData.framebuffer); //If I use this instead of binding the framebuffer above, I get no drawing and black background glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, fboTextureBufferData.textureID, 0); renderParticlesToTextureBuffer(); //Bind the view frame buffer. glBindFramebuffer(GL_FRAMEBUFFER, viewFramebuffer); glBindRenderbuffer(GL_RENDERBUFFER, viewRenderbuffer); drawFboTexture(); [context presentRenderbuffer:GL_RENDERBUFFER]; } 

Si necesita escribir datos directamente en un objective de renderizado, usar un renderbuffer no es una buena opción. En este caso, es mucho mejor usar una textura en su lugar.

Usar una textura como un file adjunto FBO funciona de manera muy similar al uso de un renderbuffer. Donde actualmente utiliza glRenderbufferStorage() para asignar un renderbuffer de las dimensiones necesarias, en su lugar crea una textura y asigna su almacenamiento con:

 GLuint texId = 0; glGenTextures(1, &texId); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_SHORT_5_6_5, 0); 

Luego lo adjuntas al framebuffer con:

 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texId, 0); 

Ahora, si luego quiere llenar su objective de procesamiento con datos, simplemente puede llamar a glTexImage2D() nuevamente, o incluso mejor a glTexSubImage2D() si el tamaño no cambia, para hacerlo.