Taller OpenGL
-
Author
agbo-training -
Category
Technology
-
view
242 -
download
1
Embed Size (px)
description
Transcript of Taller OpenGL

Copyright © 2012 AGBO Business Architecture S.L. Todos los derechos reservados. www.agbo.biz
Intro a OpenGL ES 2.0para iOS

Copyright © 2012 AGBO Business Architecture S.L. Todos los derechos reservados. www.agbo.biz
¿Qué necesito saber?
• C / Objective C
• Concepto de Vista y ViewController

Copyright © 2012 AGBO Business Architecture S.L. Todos los derechos reservados. www.agbo.biz
¿Qué es OpenGL?
• API de C para producir gráficos 3D
• Multiplataforma
• Antiguo: 1992
• Parte en la GPU, parte en la CPU

Copyright © 2012 AGBO Business Architecture S.L. Todos los derechos reservados. www.agbo.biz
Conceptos Fundamentales

Copyright © 2012 AGBO Business Architecture S.L. Todos los derechos reservados. www.agbo.biz
Un poco de Historia
• Creado por SGI en 1992
• MS intentó acabar con él en 1997...
• ...pero los “developers, developers, developers!” ganaron la batalla.
Developers, developers, developers!

Copyright © 2012 AGBO Business Architecture S.L. Todos los derechos reservados. www.agbo.biz
...y la Historia sigue
• Mantenido por el Khronos Group
• Nuevas versiones: OpenGL 2.0 y ES
• Sigue siendo el estandar de facto para gráficos 3D.
• Lo seguirá siendo por bastante tiempo

Copyright © 2012 AGBO Business Architecture S.L. Todos los derechos reservados. www.agbo.biz
Con el tiempo...
• Complejo
• Anticuado
• Había que poner orden

Copyright © 2012 AGBO Business Architecture S.L. Todos los derechos reservados. www.agbo.biz
OpenGL 2.0
• Elimina todo lo antiguo y sub-óptimo
• Adaptado a las nuevas GPUs
• Más “programable”: shaders

Copyright © 2012 AGBO Business Architecture S.L. Todos los derechos reservados. www.agbo.biz
OpenGL ES
• Embedded Systems
• Subconjunto de OpenGL

Copyright © 2012 AGBO Business Architecture S.L. Todos los derechos reservados. www.agbo.biz
OpenCL• ¿Tiene algo que ver?
• Sólo para Mac
• Todavía no utilizable en iOS
• La esperanza es lo último que se pierde
• Hay chapuzas para ir consolándose (shaders).

Copyright © 2012 AGBO Business Architecture S.L. Todos los derechos reservados. www.agbo.biz
GLKit
Y dijo Jobs a sus discípulos: “Que lo común sea trivial y lo difícil sea factible”

Copyright © 2012 AGBO Business Architecture S.L. Todos los derechos reservados. www.agbo.biz
Renderizado
Crear una imagen a partir de una descripción geométrica y de algunos datos más necesarios para crear la ilusión de 3 dimensiones.

Copyright © 2012 AGBO Business Architecture S.L. Todos los derechos reservados. www.agbo.biz
GPU vs CPU
• Procesa vectores de números de coma flotante en paralelo
• A toda ostia
• Es programable (OpenCL & Shaders)
• Nadie mejor que NVidia y los Myth Busters para explicarlo. ;-)

Copyright © 2012 AGBO Business Architecture S.L. Todos los derechos reservados. www.agbo.biz
Cuellos de Botella
• CPU: Mil millones de operaciones por segundo.
• GPU: Decenas de miles de millones de operaciones por segundo.
• Memoria: 200 millones de accesos por segundo.

Copyright © 2012 AGBO Business Architecture S.L. Todos los derechos reservados. www.agbo.biz
Buffers
• Forma Óptima de Proporcionar Datos
• Área continua de memoria bajo control de la GPU, que se utiliza para la entrada y salida de datos de la forma más eficiente posible.

Copyright © 2012 AGBO Business Architecture S.L. Todos los derechos reservados. www.agbo.biz
El Noble Octuple Sendero hacia el Nirvana del Buffer
1 Crear
2 Enlazar
3 Inicializar
4 Activar
5 Asignar Tipo
5 Asignar tipo
6 Dibujar
7 Desactivar
8 eliminar

Copyright © 2012 AGBO Business Architecture S.L. Todos los derechos reservados. www.agbo.biz
1 Crear
• Generate
• OpenGL crea un ID único para identificar el buffer.
• A este ID numérico a menudo se le llama "name".
• Si, ya lo sé... ;-)

Copyright © 2012 AGBO Business Architecture S.L. Todos los derechos reservados. www.agbo.biz
2 Enlazar
• Bind
• Asignamos el buffer a OpenGL para que pueda usarlo.
• Sigue sin haber datos.

Copyright © 2012 AGBO Business Architecture S.L. Todos los derechos reservados. www.agbo.biz
3 Inicializar
• Init buffer data
• El buffer no tiene estructura
• Paso costoso

Copyright © 2012 AGBO Business Architecture S.L. Todos los derechos reservados. www.agbo.biz
4 Activar
• Enable
• Indica a OpenGL que pase a usar un buffer para un renderizado.

Copyright © 2012 AGBO Business Architecture S.L. Todos los derechos reservados. www.agbo.biz
5 Asignar Tipo
• Set Pointers
• Indica a OpenGL el tipo de los datos en el buffer y los offsets para acceder a los datos.
• Fácil cagarla.

Copyright © 2012 AGBO Business Architecture S.L. Todos los derechos reservados. www.agbo.biz
6 Dibujar
• Draw o Render
• Indica a OpenGL que renderice todo o parte de una escena usando los buffers enlazados y activos.

Copyright © 2012 AGBO Business Architecture S.L. Todos los derechos reservados. www.agbo.biz
7 Desactivar
• Disable
• Indica a OpenGL que se olvide de un buffer.

Copyright © 2012 AGBO Business Architecture S.L. Todos los derechos reservados. www.agbo.biz
8 Eliminar
• Delete
• Eliminamos un buffer y liberamos su memoria.
• Potencialmente problemático por sincronización entre CPU y GPU

Copyright © 2012 AGBO Business Architecture S.L. Todos los derechos reservados. www.agbo.biz
Recomendaciones
• Una vez creado un buffer, reaprovéchalo.
• Inicializar es caro.
• Destruir también, pero por otras razones.

Copyright © 2012 AGBO Business Architecture S.L. Todos los derechos reservados. www.agbo.biz
Frame Buffers
• Son los buffers de salida.
• Reciben la imagen.
• Front Frame Buffer.
• Back Frame Buffer.

Copyright © 2012 AGBO Business Architecture S.L. Todos los derechos reservados. www.agbo.biz
Contexto de OpenGL
• Contiene toda la configuración necesaria para renderizar.
• Frame buffer, buffers de entrada, texturas y demás.
• Similar al contexto de Core Graphics

Copyright © 2012 AGBO Business Architecture S.L. Todos los derechos reservados. www.agbo.biz
Sistema de Coordenadas & Vectores
• Usamos el cartesiano
• Todo punto se representa como un vector.
• La principal entrada de un programa OpenGL será una serie de vectores que definen los vértices (puntos) de una escena.

Copyright © 2012 AGBO Business Architecture S.L. Todos los derechos reservados. www.agbo.biz
Vértices, puntos, segmentos y triángulos
• OpenGL usa vértices para renderizar puntos, segmentos y triángulos:
• Punto: 1 vértice
• Segmentos: 2 vértices
• Triángulo: 3 vértices

Copyright © 2012 AGBO Business Architecture S.L. Todos los derechos reservados. www.agbo.biz
Tipos
• OpenGL es multiplataforma, así que define sus propios tipos mediante enums.
• Todos empiezan con GL (se han partío el coco)
• GLFloat, GLDouble, GLBoolean, etc...
• GLclampf: GLFloat entre 0.0 1.0
• Ojo, ¡especifica siempre float!

Copyright © 2012 AGBO Business Architecture S.L. Todos los derechos reservados. www.agbo.biz
Funciones
Crea un color RGB

Copyright © 2012 AGBO Business Architecture S.L. Todos los derechos reservados. www.agbo.biz

Copyright © 2012 AGBO Business Architecture S.L. Todos los derechos reservados. www.agbo.biz
OpenGL ES en iOS

Copyright © 2012 AGBO Business Architecture S.L. Todos los derechos reservados. www.agbo.biz
Limitaciones en iOS
• No asignas los front y back buffers. Lo hace iOS por ti.
• El frame buffer está conectado a una CALayer y comparten el bitmap.

Copyright © 2012 AGBO Business Architecture S.L. Todos los derechos reservados. www.agbo.biz
GLKViewController & GLKView
• GLKView: tiene su rootlayer conectada a un frame buffer y cambia del front al back.
• El controlador es el delegado de la vista y se encarga del dibuja y adaptar a la orientación.
-(void) glkView:(GLKView *)view drawInRect:(CGRect)rect

Copyright © 2012 AGBO Business Architecture S.L. Todos los derechos reservados. www.agbo.biz
GLKBaseEffect
• Proporciona un entorno por defecto
• luces
• texturas
• “niebla”
• Shaders por defecto
• Abstrae las diferencias entre OpenGL 1.0 y 2.0

Copyright © 2012 AGBO Business Architecture S.L. Todos los derechos reservados. www.agbo.biz
Llegados a este punto...
Suele pasar esto

Copyright © 2012 AGBO Business Architecture S.L. Todos los derechos reservados. www.agbo.biz
Mejor será que vayamos a Xcode
• Un proyecto de una sola vista (GLKView, GLKViewController).
• Un GLKBaseEffect
• 3 vértices (un triángulo)

Copyright © 2012 AGBO Business Architecture S.L. Todos los derechos reservados. www.agbo.biz

Copyright © 2012 AGBO Business Architecture S.L. Todos los derechos reservados. www.agbo.biz

Copyright © 2012 AGBO Business Architecture S.L. Todos los derechos reservados. www.agbo.biz
Abstraer C
• ATGLKContext
• ATVertexArrayBuffer

Copyright © 2012 AGBO Business Architecture S.L. Todos los derechos reservados. www.agbo.biz
Animaciones
• Periódicamente cambiaremos la posición de los vértices y le pediremos a OpenGL ES que dibuje de nuevo.
• GLKViewController nos facilita enormemente la labor.

Copyright © 2012 AGBO Business Architecture S.L. Todos los derechos reservados. www.agbo.biz
GLKViewController al rescate
• preferedFramesPerSecond
• framesPerSecond
• -(void) update

Copyright © 2012 AGBO Business Architecture S.L. Todos los derechos reservados. www.agbo.biz
Volvamos a Xcode
• Añadimos nuestras dos clases.
• Asignamos un preferedFramesPerSecond de 60.
• Recalculamos los vértices y los dibujamos en update

Copyright © 2012 AGBO Business Architecture S.L. Todos los derechos reservados. www.agbo.biz

Copyright © 2012 AGBO Business Architecture S.L. Todos los derechos reservados. www.agbo.biz

Copyright © 2012 AGBO Business Architecture S.L. Todos los derechos reservados. www.agbo.biz
Texturas
• Forma sencilla de asignar un color a cada pixel.
• Otro buffer de OpenGL con un mapa de bits.
• Mapeamos puntos del buffer de vértices al de textura.

Copyright © 2012 AGBO Business Architecture S.L. Todos los derechos reservados. www.agbo.biz
Tamaño de la Textura
• Lo menor posible.
• En sistemas empotrados, suele estar limitado.
• Si las dimensiones son potencias de 2, la GPU lo agradece.

Copyright © 2012 AGBO Business Architecture S.L. Todos los derechos reservados. www.agbo.biz
Texels
{0,0}
{0,1} {1,1}
{1,0}
T
SIndependientemente de las proporciones de la imagen, la textura tendra 1x1.

Copyright © 2012 AGBO Business Architecture S.L. Todos los derechos reservados. www.agbo.biz
Tipos de texturas
• 1D: 1 pixel por n
• 2D: n x m pixels (las más comunes)
• 3D: una pila de 2D

Copyright © 2012 AGBO Business Architecture S.L. Todos los derechos reservados. www.agbo.biz
Mapeados
• Transformar un espacio vectorial en otro
• Del espacio del frame buffer al de pantalla (viewport)
• Del de vértices al de textura

Copyright © 2012 AGBO Business Architecture S.L. Todos los derechos reservados. www.agbo.biz
Mapear Vértices a Texels
• Cada vértice tendrá:
• Posición: Vector 3D
• Coordenadas de textura: Vector 2D

Copyright © 2012 AGBO Business Architecture S.L. Todos los derechos reservados. www.agbo.biz
Mapear Vértices a Texels
x,y,zPosición
Coloruv
VérticeTextura
T
S

Copyright © 2012 AGBO Business Architecture S.L. Todos los derechos reservados. www.agbo.biz
Mapear Vértices a Texels
• Cada vértice coloreado se llama Fragment

Copyright © 2012 AGBO Business Architecture S.L. Todos los derechos reservados. www.agbo.biz
Mapear Vértices a Texels
• Una vez hecha la transformación, la GPU asigna color a cada pixel.
• A este proceso, de pasar de datos geométricos a pixeles, se le llama rasterizar.
• A cada pixel coloreado, se le llama fragment.

Calma que ya falta poco...
• One more thing!
• Si vértices y texels coinciden, el mapeado es de uno a uno.
• Pero... ¿y si no coinciden, qué coño hacemos?

Copyright © 2012 AGBO Business Architecture S.L. Todos los derechos reservados. www.agbo.biz
Funciones de Mapeado “Sampling Modes”
• Dos funciones
• Nearest
• Interpolate
• glTexParameteri al rescate

Copyright © 2012 AGBO Business Architecture S.L. Todos los derechos reservados. www.agbo.biz
Funciones de Mapeado “Sampling Modes”
• Nearest: Aspecto pixelado
• Interpolated: Aspecto suave pero es costoso.

Copyright © 2012 AGBO Business Architecture S.L. Todos los derechos reservados. www.agbo.biz
MIP Mapping: La Trampa
“El Golpe” consiste en crear varias versiones de la textura en distintas resoluciones.

Copyright © 2012 AGBO Business Architecture S.L. Todos los derechos reservados. www.agbo.biz
Cargar un textura en GLKBaseEffects
Usamos GLKTextureLoader para darnos un GLKTextureInfo a partir de una CGImage.
// Setup texture UIImage *texture = [UIImage imageNamed:@"GrungePaint.jpg"]; NSError *err = nil; GLKTextureInfo *textureInfo = [GLKTextureLoadertextureWithCGImage:[texture CGImage] options:nil error:&err]; if (!textureInfo) { NSLog(@"Error while loading texture: %@", [err localizedDescription]); } self.baseEffect.texture2d0.name = textureInfo.name; self.baseEffect.texture2d0.target = textureInfo.target;

Copyright © 2012 AGBO Business Architecture S.L. Todos los derechos reservados. www.agbo.biz
Volvamos a Xcode
• Aplicaremos una textura al triángulo.

Copyright © 2012 AGBO Business Architecture S.L. Todos los derechos reservados. www.agbo.biz

Copyright © 2012 AGBO Business Architecture S.L. Todos los derechos reservados. www.agbo.biz

Copyright © 2012 AGBO Business Architecture S.L. Todos los derechos reservados. www.agbo.biz
Aquí hay gato encerrado...
• Lo normal no es tener 1 triángulo, sino miles o millones...
• ¿Los escribo a mano?
• Blender, obj & Cia

Copyright © 2012 AGBO Business Architecture S.L. Todos los derechos reservados. www.agbo.biz
Mucho por verEsto no es una foto...

Copyright © 2012 AGBO Business Architecture S.L. Todos los derechos reservados. www.agbo.biz
Libros
• The OpenGL SuperBible, 4th Edition
• Learning OpenGL ES

Copyright © 2012 AGBO Business Architecture S.L. Todos los derechos reservados. www.agbo.biz
Contacto
• Fernando Rodríguez
• @frr149
• www.agbo.biz