Domanda

Sto cercando di armeggiare con openGL e Python e non sono stato in grado di trovare buoni motivi per usare PyOpenGl contro pyglet

Quale consiglieresti e perché?

È stato utile?

Soluzione

Come ha detto Tony, questo dipenderà davvero dai tuoi obiettivi. Se stai "aggiustando" per provare a conoscere OpenGL o il rendering 3D in generale, vorrei rinunciare a tutti i convenevoli e iniziare a lavorare con PyOpenGL, che è il più vicino possibile per arrivare a "raw" Programmazione 3D con Python.

D'altra parte, se stai "armeggiando" deridendo un gioco o un'applicazione multimediale o provando a conoscere le pratiche di programmazione in generale di Pyglet ti farà risparmiare un sacco di tempo di sviluppo iniziale fornendo hook per eventi di input, suoni, testo / cartelloni pubblicitari, ecc. Spesso, questo l'investimento iniziale è ciò che impedisce alle persone di portare a termine i loro progetti, quindi averlo fatto per te non è qualcosa da ignorare. (È anche molto Pythonic per evitare di reinventare la ruota.)

Se stai cercando di eseguire qualsiasi tipo di sollevamento pesante (che normalmente non rientra nella mia definizione di "armeggiare", ma forse non se stai armeggiando con la progettazione di motori 3D), potresti dare un'occhiata a Python-Ogre, che racchiude il molto completo e robusto OGRE 3D motore grafico.

Altri suggerimenti

Inizia con pyglet. Contiene la migliore API di alto livello, che contiene tutto ciò di cui hai bisogno per iniziare, dall'apertura di una finestra al disegno di sprite e primitive OpenGL usando le loro classi di Sprite e Batch amichevoli e potenti.

In seguito, potresti anche voler scrivere il tuo codice di livello inferiore, che effettua chiamate direttamente a funzioni OpenGL come glDrawArrays, ecc. Puoi farlo usando i collegamenti OpenGL di pyglet o usando quelli di PyOpenGL. La buona notizia è che qualunque cosa tu usi, puoi inserire tali chiamate proprio nel mezzo della tua applicazione pyglet esistente, e "funzioneranno". La transizione del codice da Pyglet a PyOpenGL è abbastanza semplice, quindi non è una decisione di cui ti devi preoccupare troppo in anticipo. I trade-off tra i due sono:

I collegamenti di PyOpenGL rendono l'interfaccia OpenGL più amichevole e pitonica. Ad esempio, puoi passare array di vertici in molte forme diverse, array di tipi, array intorpiditi, elenchi semplici, ecc. E PyOpenGL li convertirà in qualcosa che OpenGL può usare. Cose come questa rendono PyOpenGL davvero semplice e conveniente.

I collegamenti OpenGL di pyglet vengono generati automaticamente e non sono facili da usare come PyOpenGL. Ad esempio, a volte dovrai creare manualmente oggetti ctypes, al fine di passare a OpenGL tipi di arg "puntatore C". Questo può essere complicato. Il lato positivo, tuttavia, è che gli attacchi di pyglet tendono ad essere significativamente più veloci.

Ciò implica che esiste una via di mezzo ottimale: utilizzare pyglet per finestre, eventi del mouse, audio, ecc. Quindi utilizzare l'API amichevole di PyOpenGL quando si desidera effettuare chiamate dirette alla funzione OpenGL. Quindi, durante l'ottimizzazione, sostituisci solo la piccola percentuale di chiamate PyOpenGL critiche per le prestazioni che si trovano all'interno del tuo ciclo di rendering interno con gli equivalenti pyglet. Per me, questo mi dà framerate da 2 a 4 volte più veloci, con la comodità di PyOpenGL per il 90% del mio codice.

Prova ModernGL .

pip install ModernGL
  • PyOpenGL è una versione generata automaticamente dell'API OpenGL originale (generata con SWIG). L'API OpenGL originale non è compatibile con Python. I binding generati in pitone sono difficili da usare.

  • pyglet è principalmente per la creazione di finestre e la gestione di eventi, tuttavia è possibile utilizzare un'API PyOpenGL (ad esempio pyglet.gl.glClearColor )

  • pygame fornisce una finestra in cui è possibile utilizzare PyOpenGL per eseguire il rendering.

  • ModernGL è un'ottima alternativa a PyOpenGL, puoi usare la moderna API OpenGL con meno codice scritto. ModernGL non creerà una finestra da sola, ma puoi integrarla in pyglet , pygame , < a href = "https://github.com/cprogrammer1994/ModernGL/blob/master/examples/PyQt5/01_hello_world.py" rel = "nofollow noreferrer"> PyQt5 e persino in GLUT .

In ModernGL puoi creare un semplice programma shader con una sola chiamata:

prog = ctx.program(
    vertex_shader='''
        #version 330
        in vec2 in_vert;
        void main() {
            gl_Position = vec4(in_vert, 0.0, 1.0);
        }
    ''',
    fragment_shader='''
        #version 330
        out vec4 f_color;
        void main() {
            f_color = vec4(0.3, 0.5, 1.0, 1.0);
        }
    ''',
)

Con ModernGL hai il pieno controllo dell'API OpenGL.

Direi che Pyglet è in realtà più evoluto di PyOpenGL. Ha una bella API propria e ha un wrapper completo attorno a OpenGL accessibile tramite il modulo pyglet.gl! PyOpenGL non racchiude nemmeno tutte le funzioni di OpenGL. Pyglet ha anche una grande libreria per il rendering 2D con accelerazione hardware tramite OpenGL, ed è davvero ben fatta.

Se vuoi un potente motore 3D già pronto hai Ogre e simili

pyglet ha molti altri extra inclusi (come il caricamento delle immagini e il suono). Se stai iniziando, proverei prima Pyglet, quindi passerò a PyOpenGL se senti di voler avvicinarti al metallo.

La vera domanda importante è: cosa stai cercando di realizzare?

Promuovo pyglet perché ha l'API più bella che abbia mai visto su cose come questa.

Pyglet ha anche API opengl. Ma è spesso preferibile utilizzare il supporto dell'elenco di vertici aggiunto di recente.

pyglet.gl

Hmm, suggerirei pyglet, fornisce davvero tutto il necessario per un gioco o un'applicazione.

Intendiamoci, puoi fare molte cose che pyglet fa con PyOpenGL, ad esempio per creare una finestra tutto ciò che devi fare è:
glutInitWindow (titolo)

Anche se penso che glutInitDisplayMode debba essere chiamato prima.

Riepilogo semplice: se non vuoi codificare fino a quando non piangi, scegli pyglet, ma se vuoi diventare un maestro, scegli PyOpenGL. Vai a http://pyopengl.sourcefourge.net per leggere i documenti su PyOpenGL e su http://pyglet.org per leggere i documenti su pyglet. Spero sia stato utile!

Vorrei raccomandare Pyglet perché è molto facile iniziare e avere una corsa base, quindi puoi aggiungere tecniche più avanzate al tuo ritmo.

L'API GL di pyglet non è affatto bella come quella di PyOpenGL - quella di pyglet è a livello di tipi di cripti grezzi, il che significa che dovrai imparare anche i ctype. Se hai intenzione di fare un sacco di programmazione OpenGL ti consigliamo di utilizzare PyOpenGL.

La cosa bella è che puoi mescolare i due bene. Usa pyglet per fornire il contesto GL, i suoni, gli eventi, il caricamento delle immagini e la gestione delle texture, il rendering del testo, ecc. Usa PyOpenGL per la vera programmazione OpenGL che devi fare.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top