OpenGL ES 2.0 y FrameBuffer por defecto en iOS
opengl-es (1)
La especificación OpenGL ES proporciona dos tipos de framebuffers: objetos proporcionados por el sistema de ventanas y framebuffer. El framebuffer predeterminado sería el tipo proporcionado por el sistema de ventanas. Pero la especificación no requiere que existan framebuffers proporcionados por el sistema de ventanas o un framebuffer predeterminado.
En iOS, no hay framebuffers proporcionados por el sistema de ventanas, y ningún framebuffer predeterminado: todo el dibujo se hace con objetos framebuffer. Para renderizar en la pantalla, usted crea un buffer de reproducción cuyo almacenamiento proviene de un objeto CAEAGLLayer
(o usa uno creado en su nombre, como cuando se usa la clase GLKView
). Eso es exactamente lo que hace tu código.
Para realizar una representación fuera de pantalla, crea un buffer de representación y llama a glRenderbufferStorage
para asignarle almacenamiento. Dicho almacenamiento no está asociado con CAEAGLLayer
, por lo que el buffer de representación no puede presentarse (directamente) en la pantalla. (Tampoco es una textura: configurar una textura, ya que un objetivo de renderizado funciona de manera diferente), es solo un buffer fuera de pantalla.
Hay más información sobre todo esto y código de ejemplo para cada enfoque en la Guía de programación de OpenGL ES de Apple para iOS .
Estoy un poco confundido sobre FrameBuffers. Actualmente, para dibujar en la pantalla, genero un framebuffer con un Renderbuffer para el GL_COLOR_ATTACHMENT0
usando este código.
-(void)initializeBuffers{
//Build the main FrameBuffer
glGenFramebuffers(1, &frameBuffer);
glBindFramebuffer(GL_FRAMEBUFFER, frameBuffer);
//Build the color Buffer
glGenRenderbuffers(1, &colorBuffer);
glBindRenderbuffer(GL_RENDERBUFFER, colorBuffer);
//setup the color buffer with the EAGLLayer (it automatically defines width and height of the buffer)
[context renderbufferStorage:GL_RENDERBUFFER fromDrawable:EAGLLayer];
glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_WIDTH, &bufferWidth);
glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_HEIGHT, &bufferHeight);
//Attach the colorbuffer to the framebuffer
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, colorBuffer);
//Check the Framebuffer status
GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
NSAssert(status == GL_FRAMEBUFFER_COMPLETE, ERROR_FRAMEBUFFER_FAIL);
}
Y muestro el contenido del buffer usando
[context presentRenderbuffer:GL_RENDERBUFFER];
Al leer esta pregunta , vi el comentario de Arttu Peltonen, quien dice:
El framebuffer predeterminado es donde lo renderizas de forma predeterminada, no tienes que hacer nada para conseguirlo. Los objetos Framebuffer son lo que se puede renderizar en su lugar, y algunos lo llaman "representación fuera de pantalla". Si haces eso, terminas con tu imagen en una textura en lugar del framebuffer predeterminado (que se muestra en la pantalla). Puede copiar la imagen de esa textura al framebuffer predeterminado (en pantalla), que generalmente se realiza con blitting (pero solo está disponible en OpenGL ES 3.0). Pero si solo quería mostrar la imagen en pantalla, probablemente no usaría un FBO en primer lugar.
Entonces me pregunto si mi método es solo para ser utilizado fuera de la pantalla. Y en ese caso, ¿qué tengo que hacer para renderizar en el buffer por defecto? (Tenga en cuenta que no quiero usar GLKView ...)