panda3d game engine development python pyglet pyopengl

engine - python game development



PyOpenGl o pyglet? (9)

Estoy buscando hacer algunas modificaciones con OpenGL y Python y no he podido encontrar buenas razones para usar PyOpenGl versus pyglet

¿Cuál recomendarías y por qué?


Promovo Pyglet porque tiene la mejor API que he visto en cosas como esta.

Pyglet también tiene API OpenGL. Pero a menudo es mejor usar el soporte de la lista de vértices recientemente agregado.

pyglet.gl


pyglet tiene muchos extras agradables incluidos (como carga de imágenes y sonido). Si estás empezando, probaría pyglet primero, y luego cambiaría a PyOpenGL si crees que quieres acercarte al metal.

La pregunta más importante es: ¿qué estás tratando de lograr?


Recomendaría Pyglet porque es muy fácil comenzar y tener algo básico en funcionamiento, y luego puedes agregar técnicas más avanzadas a tu propio ritmo.


Diría que Pyglet es en realidad más evolucionado que PyOpenGL. Tiene una buena API propia, ¡y tiene un envoltorio completo para OpenGL a través del módulo pyglet.gl! PyOpenGL ni siquiera ajusta todas las funciones que OpenGL tiene. Pyglet también tiene una gran biblioteca para renderizar 2D con aceleración de hardware a través de OpenGL, y está muy bien hecho.

Si quieres un poderoso motor 3D listo para usar, tienes Ogre y tal


La API GL de pyglet no es tan buena como PyOpenGL''s - pyglet está en la capa de tipos crudos, lo que significa que necesitarás aprender ctypes también. Si planea hacer un montón de programación de OpenGL, querrá usar PyOpenGL.

Lo bueno es que puedes mezclar los dos bien. Use Pyglet para proporcionar el contexto GL, los sonidos, los eventos, la carga de imágenes y la gestión de texturas, la representación de texto, etc., etc. Utilice PyOpenGL para la programación real de OpenGL que necesita hacer.


Comience con pyglet. Contiene la mejor API de alto nivel, que contiene todo lo que necesitas para comenzar, desde abrir una ventana hasta sprites de dibujo y primitivas OpenGL usando sus clases de Sprite y Lote amigables y potentes.

Más tarde, es posible que también desee escribir su propio código de nivel inferior, que haga llamadas directamente a funciones OpenGL como glDrawArrays, etc. Puede hacerlo usando los enlaces OpenGL de pyglet o utilizando PyOpenGL. La buena noticia es que cualquiera que sea el que use, puede insertar esas llamadas directamente en el medio de su aplicación de pyglet existente, y ''simplemente funcionarán''. La transición de su código de Pyglet a PyOpenGL es bastante fácil, por lo que esta no es una decisión de la que deba preocuparse demasiado por adelantado. Los intercambios entre los dos son:

Las vinculaciones de PyOpenGL hacen que la interfaz de OpenGL sea más amigable y pionera. Por ejemplo, puede pasar matrices de vértices en muchas formas diferentes, matrices ctypes, matrices numpy, listas simples, etc., y PyOpenGL las convertirá en algo que OpenGL puede usar. Cosas como esta hacen que PyOpenGL sea realmente fácil y conveniente.

Los enlaces OpenGL de pyglet se generan automáticamente y no son tan amigables como PyOpenGL. Por ejemplo, a veces tendrá que crear manualmente objetos ctypes, para pasar tipos de argumentos ''C pointer'' a OpenGL. Esto puede ser complicado. Sin embargo, el lado positivo es que las vinculaciones del pigar tienden a ser significativamente más rápidas.

Esto implica que existe una base intermedia óptima: use pyglet para ventanas, eventos de mouse, sonido, etc. Luego, use la API amigable de PyOpenGL cuando desee realizar llamadas a funciones directas de OpenGL. Luego, al optimizar, reemplace solo el pequeño porcentaje de llamadas PyOpenGL críticas para el rendimiento que se encuentran dentro de su bucle de renderizado interno con los equivalentes de pyglet. Para mí, esto me da velocidades de cuadros de 2 a 4 veces más rápidas, con la conveniencia de PyOpenGL para el 90% de mi código.


Como dijo Tony, esto realmente va a depender de tus objetivos. Si está "retocando" para tratar de aprender sobre OpenGL o renderización en 3D, en general, me abstendré de todos los cumplidos y comenzaré a trabajar con PyOpenGL, que es lo más cercano a la programación 3D "en bruto" que usará Python. .

Por otro lado, si está "manipulando" a modo de burlarse de un juego o aplicación multimedia, o tratando de aprender acerca de las prácticas de programación en general, Pyglet le ahorrará mucho tiempo de desarrollo inicial proporcionando ganchos para eventos de entrada. , sonidos, texto / carteles publicitarios, etc. A menudo, esta inversión inicial es lo que impide que las personas completen sus proyectos, por lo tanto, hacer que se haga por usted no es algo que deba ignorarse. (También es muy pitónico evitar reinventar la rueda).

Si está buscando realizar algún tipo de levantamiento de servicio pesado (que normalmente queda fuera de mi definición de "retoques", pero tal vez no si está jugando con el diseño del motor 3D), entonces es posible que desee echar un vistazo a Python-Ogre , que envuelve el motor de gráficos OGRE 3D con todas las características y robustez.


Hmm, sugeriría pyglet, realmente proporciona todo lo que necesita un juego o aplicación.

Eso sí, puedes hacer muchas cosas que pyglet hace con PyOpenGL, por ejemplo, para crear una ventana, todo lo que necesitas hacer es:
glutInitWindow (título)

Aunque creo que glutInitDisplayMode tiene que ser llamado antes de eso.

Resumen simple: si no quiere codificar hasta que llore, elija Pyglet, pero si quiere ser maestro, elija PyOpenGL. Vaya a http://pyopengl.sourcefourge.net para leer los documentos en PyOpenGL y a http://pyglet.org para leer los documentos sobre pyglet. Espero que esto haya sido útil.


Prueba ModernGL .

pip install ModernGL

  • PyOpenGL es una versión autogenerada de la API original de OpenGL (generada con SWIG). La API original de OpenGL no es compatible con Python. Las vinculaciones de python generadas son difíciles de usar.

  • pyglet es principalmente para la creación de ventanas y el manejo de eventos; sin embargo, puedes usar una API tipo PyOpenGL (por ejemplo, pyglet.gl.glClearColor )

  • pygame proporciona una ventana donde puede usar PyOpenGL para hacer la representación.

  • ModernGL es una gran alternativa a PyOpenGL. Puede utilizar la API OpenGL moderna con menos código escrito. ModernGL no creará una ventana por sí mismo, pero puede integrarlo en pyglet , pygame , PyQt5 e incluso en GLUT .

En ModernGL puedes crear un sombreador de vértices simple con una sola llamada:

my_vertex_shader = ctx.vertex_shader('''''' #version 330 in vec2 vert; void main() { gl_Position = vec4(vert, 0.0, 1.0); } '''''')

Con ModernGL usted tiene control total sobre la API de OpenGL.