miércoles, 2 de marzo de 2011

OpenGL basics: el comienzo de todo (II)

El modelo de ejecución de OpenGL es Cliente-Servidor. Una aplicación (el cliente) manda comandos que son interpretados y procesados por OpenGL (el servidor local o remoto). Este servidor puede tener varios contextos (Gl contexts).
A continuación vamos a ver como trabaja el servidor de OpenGL y como este proceso es realizado por una pipeline gráfica o máquina de estados.
Pipeline en OpenGL
En este diagrama se puede ver el pipeline. Los comandos entrarían por la izquierda.
  1. En primer lugar en vez de lanzar todos los comandos por el pipeline se pueden acumular en el display list para procesarlos más tarde y de manera transaccional.
  2. La fase del evaluator permite la evaluación de curvas y superficies. Esto permite crear superficies solo usando puntos de control.
  3. Durante la fase per-vetex operations and primitive assembly, OpenGL procesa todas las primitivas que son transformadas y alumbradas. Además las primitivas son “clipeadas” por el viewport (esto no es mas que la geometría que quede oculta será filtrada y no se enviará a renderizar).
  4. La rasterización es el proceso que permite mostrar gráficos con formas 3D en la pantalla.
  5. Después de todo esto en la última fase per-fragment operations que se realizan las últimas operaciones en los datos antes de ser enviados al “frame buffer”. Estas operaciones incluyen actualizaciones condicionales del “frame buffer” basadas en valores para realizar z-buffering, blending o enmascaramiento entre otras operaciones lógicas sobre pixels.
En este punto conviene remarcar que los comandos aplicados sobre el “frame buffer” son controlados por el sistema de ventanas que es el que asigna los recursos del “frame buffer”. No hay comandos de OpenGL para configurar el “frame buffer”. Esta configuración se realiza fuera de OpenGL, de hecho la propia inicialización de OpenGL se realiza cuando el sistema de ventanas asigna una ventana para que OpenGL pueda renderizar. Existe una extensión de OpenGL llamada GLX, que proporciona una interfaz para comunicarse con las X. Yo personalmente utilizo GLUT que permite crear callbacks para manejar ventanas y los eventos de input del usuario (esto lo veremos más adelante).

* Por último, comentar que los datos de entrada pueden venir en forma de pixeles en vez de vértices, como por ejemplo una imagen para mapear una textura, se saltan la primera fase del procesado. El resultado en este caso es guardado en la “memory texture” para usarse en la fase de la rasterización, o rasterizarse y los fragmentos resultantes mezclarse en el “frame buffer” si son generados desde datos geométricos.  

No hay comentarios: