2008-11-11 10 views
24

Ich suche, etwas mit openGL und Python zu basteln und konnte keine guten Gründe finden, PyOpenGl gegen pyglet zu verwendenPyOpenGl oder Pyglet?

Welches würden Sie empfehlen und warum?

Antwort

28

Wie Tony sagte, hängt das wirklich von Ihren Zielen ab. Wenn Sie "basteln", um etwas über OpenGL oder 3D-Rendering im Allgemeinen zu lernen, würde ich auf alle Höflichkeiten verzichten und anfangen, mit PyOpenGL zu arbeiten, was der "rohen" 3D-Programmierung mit Python so nahe kommt .

Auf der anderen Seite, wenn Sie "basteln" über ein Spiel oder eine Multimedia-Anwendung zu verspotten, oder versuchen, über Programmierpraktiken im Allgemeinen zu lernen, als Pyglet sparen Sie viel Vorlaufzeit durch Bereitstellung Hooks für Eingangsereignisse, Sounds, Text/Billboarding usw. Oft verhindert diese Vorabinvestition, dass Menschen ihre Projekte abschließen können, also ist es nicht etwas, das ignoriert werden muss. (Es ist auch sehr Pythonic zu vermeiden, das Rad neu zu erfinden.)

Wenn Sie irgendeine Art von Heavy-Duty-Hebe (was normalerweise fällt außerhalb meiner Definition von "Basteln", aber vielleicht nicht, wenn Sie basteln mit 3D-Engine-Design) dann möchten Sie vielleicht einen Blick auf Python-Ogre werfen, die die sehr voll ausgestattete und robuste OGRE 3D Grafik-Engine umschließt.

+8

Weiß jemand, ob dies noch im Februar 2013 wahr ist? – abelito

3

pyglet hat viele schöne Extras enthalten (wie Bild laden und Sound). Wenn du am Anfang stehst, würde ich zuerst pyglet versuchen und dann zu PyOpenGL wechseln, wenn du das Gefühl hast, näher am Metal zu sein.

Die wirklich wichtige Frage ist jedoch: Was versuchst du zu erreichen?

+1

Hey. Kleinere Verfeinerung: Ich denke, es ist möglicherweise irreführend, PyOpenGL als "näher am Metall" zu beschreiben. Es ist richtig, dass PyOpenGL nicht die gleichen High-Level-Sachen wie Pyglet bietet, aber andererseits sind die OpenGL-Bindungen von PyOpenGL freundlicher, pythonischer und langsamer als die OpenGL-Bindungen in Pyglet. –

3

Ich fördere Pyglet, weil es die schönste API hat, die ich bisher auf solchen Sachen gesehen habe.

Pyglet hat OpenGL API auch. Aber es ist oft schöner, die kürzlich hinzugefügte Stützpunktliste zu verwenden.

pyglet.gl

2

Ich würde Pyglet empfehlen, weil es sehr einfach ist und etwas Grundsätzliches laufen haben, um zu beginnen, und dann können Sie fortgeschrittene Techniken in Ihrem eigenen Tempo hinzuzufügen.

5

Ich würde sagen, dass Pyglet tatsächlich mehr entwickelt ist als PyOpenGL. Es hat eine eigene nette API und es hat einen vollständigen Wrapper um OpenGL, auf den über das pyglet.gl-Modul zugegriffen wird! PyOpenGL schließt nicht einmal alle Funktionen von OpenGL ein. Pyglet hat auch eine großartige Bibliothek zum Rendern von 2D mit Hardwarebeschleunigung durch OpenGL, und es ist wirklich gut gemacht.

Wenn Sie ein leistungsfähiges fertige 3D-Engine wollen Sie Ogre und solche

2

Pyglet GL API ist nirgendwo in der Nähe von so schön wie PyOpenGL die haben - Pyglet das ist an der rohen ctypes Schicht, die bedeutet, dass Sie lernen müssen ctypes auch. Wenn Sie eine Reihe von OpenGL-Programmierung planen, sollten Sie PyOpenGL verwenden.

Das Schöne ist, dass Sie die beiden gut mischen können. Verwenden Sie pyglet, um den GL-Kontext, Sounds, Ereignisse, Laden von Bildern und Texturverwaltung, Text-Rendering usw. bereitzustellen. Verwenden Sie PyOpenGL für die eigentliche OpenGL-Programmierung, die Sie ausführen müssen.

27

Beginnen Sie mit Pyglet.Es enthält die beste High-Level-API, die alles enthält, was Sie benötigen, um ein Fenster zu öffnen und Sprites und OpenGL-Primitive mithilfe ihrer freundlichen und leistungsstarken Sprite- und Batch-Klassen zu zeichnen.

Später möchten Sie vielleicht auch Ihren eigenen Code niedrigerer Ebene schreiben, der direkt zu OpenGL-Funktionen wie glDrawArrays usw. aufruft. Sie können dies mit den OpenGL-Bindungen von pyglet oder mit PyOpenGLs tun. Die gute Nachricht ist, dass Sie diese Anrufe genau in die Mitte Ihrer bestehenden Pyglet-Anwendung einfügen können, und sie werden "einfach funktionieren". Die Umstellung Ihres Codes von Pyglet auf PyOpenGL ist relativ einfach, Sie müssen sich also nicht zu sehr im Voraus darum kümmern. Die Trades zwischen den beiden sind:

PyOpenGL Bindungen machen die OpenGL-Schnittstelle freundlicher und Pythonic. Zum Beispiel können Sie Vertex-Arrays in vielen verschiedenen Formen, Ctypes-Arrays, numpy Arrays, einfachen Listen usw. übergeben, und PyOpenGL konvertiert sie in etwas, das OpenGL verwenden kann. Dinge wie diese machen PyOpenGL wirklich einfach und bequem.

Die OpenGL-Bindungen von pyglet werden automatisch generiert und sind nicht so benutzerfreundlich wie PyOpenGL. Zum Beispiel müssen Sie manchmal Ctypes-Objekte manuell erstellen, um "C-Pointer" -Arten an OpenGL zu übergeben. Das kann fummelig sein. Die Plus-Seite ist jedoch, dass Pyglets Bindungen tendenziell deutlich schneller sind.

Dies bedeutet, dass es einen optimalen Mittelweg gibt: Verwenden Sie Pyglet für Windowing, Mausereignisse, Sound usw. Verwenden Sie dann die freundliche API von PyOpenGL, wenn Sie direkte OpenGL-Funktionsaufrufe machen wollen. Ersetzen Sie dann beim Optimieren nur den kleinen Prozentsatz an leistungskritischen PyOpenGL-Aufrufen, die innerhalb Ihrer inneren Renderschleife liegen, durch die Pyglet-Entsprechungen. Das bedeutet für mich, dass die Framerate zwei- bis viermal schneller ist, mit PyOpenGL für 90% meines Codes.

+0

Die neuesten Versionen von Pyglet (1.3, derzeit in der Betaversion) bieten mehr Unterstützung für direkte OpenGL-Aufrufe und die Angabe von OpenGL-Scheitelpunkten für die Übergabe an Pyglets Stapel. –

3

Hmm, ich würde Pyglet vorschlagen, es bietet wirklich alles, was ein Spiel oder eine Anwendung benötigt.

Wohlgemerkt, können Sie eine Menge Dinge tun Pyglet mit PyOpenGL tut, zum Beispiel ein Fenster müssen alles, was Sie erstellen zu tun ist:
glutInitWindow (Titel)

Obwohl ich denke, glutInitDisplayMode werden muss genannt davor.

Einfache Zusammenfassung: Wenn Sie nicht bis zum Weinen programmieren wollen, wählen Sie pyglet, aber wenn Sie ein Master sein möchten, wählen Sie PyOpenGL. Gehe zu http://pyopengl.sourcefourge.net, um die Dokumente auf PyOpenGL und http://pyglet.org zu lesen, um die Dokumente auf Pyglet zu lesen. Hoffe das war hilfreich!

3

Versuchen Sie ModernGL.

pip install ModernGL 
  • PyOpenGL ist eine automatisch generierte Version des ursprünglichen OpenGL API (mit SWIG generiert). Die ursprüngliche OpenGL-API ist nicht python-freundlich. Generierte Python-Bindungen sind schwer zu verwenden.

  • Pyglet ist vor allem für die Fenstererstellung und Event-Handling, aber Sie können Sie eine PyOpenGL wie API (zB pyglet.gl.glClearColor)

  • pygame ein Fenster bietet, wo Sie PyOpenGL verwenden können das Rendering zu tun .

  • ModernGL ist eine großartige Alternative zu PyOpenGL, Sie können die moderne OpenGL-API mit weniger Code geschrieben. ModernGL wird kein eigenes Fenster erstellen, aber Sie können es in pyglet, pygame, PyQt5 und sogar in GLUT integrieren.

In ModernGL können Sie einen einfachen Vertex-Shader mit einem einzigen Aufruf erstellen:

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

Mit ModernGL Sie volle Kontrolle über die OpenGL-API haben.

Verwandte Themen