Grupo de Usuarios de Python/pyopengl/Deprecaciones de OpenGL 3
De Proyecto Ciencia
Deprecaciones de OpenGL 3.1
Descripción de aquello que OpenGL 3.1 impondrá deprecar. Si usted tiene cualquier código PyOpenGL que no se pueda describir como que usa solo Búfers, Texturas y sombreadores es posible que necesite leer esto.
Este documento describe el modelo para el deprecado en OpenGL 3.x (y superior) e intenta especificar como migar su código (PyOpenGL) para que sea compatible con OpenGL 3.1, o a escribir código que sea "libre de legado" o "compatible hacia delante".
Antecedentes
La especificación de OpenGL 3.0 introdujo por primera vez el concepto de deprecación al API de OpenGL. Antes de esto, en OpenGL nunca se habían deprecado ningún punto de entrada por mas de 17 años de desarrollo.
La intención original era que OpenGL 3.0 rompería el molde de las otras versiones de OpenGL ya que permitiría generar una API elegante y sencilla para los desarrolladores, sacrificando "lo amistoso para novatos" de la API vieja para imitar mejor el comportamiento de los nuevos hardware de las GPUs (esta fue la proposición de "picos largos", que era muy esperada por los pocos desarrolladores de juegos en OpenGL).
Sin embargo el ARB, no implemento la propuesta de "picos largos" en OpenGL 3.0, en vez de esto introdujo solo un conjunto de deprecaciones donde se incluye casi todo el API original, incluyendo la mayoría de los puntos de entrada que los usuarios de OpenGL ven como "característicos" del API como aquellas relacionadas con los vértices individuales y el comportamiento de la lista de muestra. Para OpenGL 3.0, estas API siguen disponibles, pero la intención es que con OpenGL 3.1 las API no sigan disponibles en lo mas minimo.
Las APIs deprecadas se les conoce también como "APIs legado", mientras que "compatible hacia delante" o "libre de legado" se usa para describir al API que es parte del subconjunto OpenGL 3.1. Durante el periodo OpenGL 3.0 al 3.1 puede que necesite convertir su código PyOpenGL para usar el API compatible hacia delante mientras provee soporte de "legado" usando el API deprecado.
Actualmente (Marzo, 2009) casi todo el código PyOpenGL usa el API legado, y como tal si tiene código basado en PyOpenGL necesitara reescribir su codigo usando puntos de entrada compatibles hacia delante.
Para mas información, puede visitar el tópico Presentación PyCon 2009
Cambios Requeridos
El mayor cambio que necesite realizar para lograr la compatibilidad con OpenGL 3.1 es:
- Si tiene código de rendrerizado pre-vertice, necesitara convertirlo a renderizado basado en arreglos. Puede hacer esto de forma segura para todas las tarjetas de vídeo actuales, ya que el renderizado basado en arreglos ha sido un estándar desde OpenGL 1.1
- Una vez que haga esto, es un cambio trivial cambiar para empezar a usar los Objetos Búfer de Vértices (VBOs), cuyo uso es requerido por OpenGL 3.1 y provee mejoras significantes de rendimiento para la mayoría de los usos de arreglos sin flujo (non-sreaming).
- Si usa listas de visualización, deje de usarlas y conviertalas en geometría basada en arreglos.
- Si usa el antipatrón cuádruple individual para fuentes/sprites, deberá recodificar, como arreglos/sombreadores.
- Necesitará calcular sus transformaciones matriciales. Es posible que en un futuro exista una extensión de C que haga esto mas eficiente para el código en PyOpenGL.
- Necesitará empezar a usar sombreadores, y eventualmente convertir solo con sombreadores (en lugar de sombreado/texturizado OpenGL de legado).
Herramientas
PyOpenGL incluye una bandera OpenGL.FORWARD_COMPATIBE_ONLY, cuando esta como verdadera antes de importar OpenGL.GL entonces los puntos de entrada de OpenGL.GL que no sean compatibles hacia delante seran deshabilitados y levantaran una excepción OpenGL.error.NullFunctionError en cualquier intento de llamarlos.
import OpenGL OpenGL.FORWARD_COMPATIBLE_ONLY = True from OpenGL.GL import * from OpenGL.GLU import * ...
Normalmente solo activara la bandera una vez que halla finalizado toda la conversión que crea necesaria, para verificar que todos los puntos de entrada están limpios.
Note que esta bandera no intenta deshabilitar las funciones GLU, GLUT, GLE o GLX que están deprecadas, ya que no se conoce cual de estos puntos de entrada serán deprecados y cuales serán re-implementados como código compatible con OpenGL 3.1
