2009-07-24 20 views
40

Sto lavorando su un framework di gioco di sorta e sono un nuovo arrivato in OpenGL. La maggior parte dei libri sembra non dare una risposta molto chiara a questa domanda, e voglio svilupparla sul mio desktop usando OpenGL, ma eseguo il codice in un ambiente OpenGL ES 2.0. Quindi la mia domanda è duplice:OpenGL vs OpenGL ES 2.0 - È possibile eseguire facilmente un'installazione OpenGL?

  1. Se obiettivo il mio framework per OpenGL sul desktop, verrà eseguito senza modifiche in un ambiente OpenGL ES 2.0?
  2. In caso contrario, c'è un buon emulatore là fuori, PC o Mac; c'è uno script che posso eseguire che convertirà il mio codice OpenGL in codice OpenGL ES o contrassegnerà cose che non funzioneranno?

risposta

38

Sono passati circa tre anni da quando ero ultimo a fare qualsiasi lavoro ES, così che io possa non essere aggiornati o semplicemente ricordare alcune cose in modo non corretto.

  1. No, non mira OpenGL per il tavolo è uguale mira OpenGL ES, ES, perché è un sottoinsieme. ES non implementa le funzioni della modalità immediata (glBegin()/glEnd(), glVertex*(), ...) Gli array di vertici sono il modo principale di inviare roba nella pipeline.

    Inoltre, dipende da quale profilo si sta mirando: almeno nel profilo Lite, ES non ha bisogno di implementare le funzioni in virgola mobile. Invece ottieni funzioni a punti fissi; pensate a numeri interi a 32 bit dove i primi 16 bit significano cifre prima del punto decimale, e i seguenti 16 bit significano cifre dopo il punto decimale.

    In altre parole, anche semplice codice potrebbe non essere portabile se utilizza galleggianti (che avrebbe dovuto sostituire le chiamate a funzioni gl*f() con chiamate a gl*x() funzioni.

    Vedere come si potrebbe risolvere questo problema in Trolltech's example (in particolare il file qtwidget.cpp: è ad esempio Qt, ma ancora ...) vedrete che fanno questa chiamata:

    q_glClearColor(f2vt(0.1f), f2vt(0.1f), f2vt(0.2f), f2vt(1.0f));

    questa è destinata a sostituire chiamata a glClearColo. RF(). Inoltre, usano la macro f2vt() - ovvero float al tipo di vertice - che converte automaticamente l'argomento da float al tipo di dati corretto.

  2. Mentre stavo sviluppando alcune piccole demo tre anni fa per un'azienda, ho avuto successo lavorando con PowerVR's SDK. È per Visual C++ sotto Windows; Non l'ho provato sotto Linux (non c'è bisogno dato che stavo lavorando su PC aziendale).


un piccolo aggiornamento per riflettere le mie recenti esperienze con ES. (7 ° giugno 2011)

  • piattaforme di oggi probabilmente non utilizzare il profilo Lite, quindi probabilmente non c'è bisogno di preoccuparsi di punto fisso decimali
  • Quando il porting del codice desktop per cellulari (ad esempio iOS) , molto probabilmente si dovrà fare in primo luogo questi, e non molto altro:
    • sostituire glBegin()/glEnd() con array di vertice
    • sostituire alcune chiamate a funzioni come glClearColor() con chiamate quali glClearColorf()
    • 012.
    • riscrivere il finestre e sistema di input
    • se il targeting OpenGL ES 2.0 per ottenere la funzionalità Shader, sarà ora necessario di sostituire completamente pipeline a funzione fissa costruita nel comportamento con shader - almeno quelli di base che reimplementare fisso funzione pipeline
  • Davvero importante: a meno che il tuo sistema mobile non sia vincolato dalla memoria, vuoi veramente usare la compressione della trama per il tuo chip grafico; per esempio, su dispositivi iOS, sarete caricando i dati PVRTC compressi al chip
+0

2/http: //www.imgtec.com/PowerVR/insider/sdkdownloads/ quale archivio per la piattaforma linux? Sono sicuro che possiamo emulare glBegin in cima all'implementazione di GLES – RzR

+0

@rzr: emulare glBegin() è certamente possibile, ma potrebbe essere una cattiva idea. Puoi invece decidere di ristrutturare il codice. Su quel sito, ti consigliamo di scaricare l'archivio "PC Emulation" per OpenGL ES 1.1 o OpenGL ES 2.0. –

+0

l'obiettivo è garantire innanzitutto la compatibilità con la fonte, non preoccuparti delle prestazioni, solo creare app legacy ... - http://rzr.online.fr/q/opengl – RzR

2

Dalla mia comprensione OpenGL ES è un sottoinsieme di OpenGL. Penso che se ti astieniti dall'usare cose in modalità immediata, come glBegin() e glEnd(), dovresti stare bene. Non ho lavorato molto con OpenGL negli ultimi due mesi, ma quando lavoravo con ES 1.0, purché non usassi glBegin/glEnd tutto il codice che avevo imparato dallo standard OpenGL funzionava.

So che il simulatore iPhone esegue il codice OpenGL ES. Non sono sicuro di quello Android.

Ecco Windows emulator.

+0

I simulatori Android SDK eseguiranno sicuramente il codice OpenGL ES, a seconda della versione dell'API supportata dal dispositivo virtuale. Tuttavia molto più lento del dispositivo reale. – davenpcj

+0

Inoltre, l'emulatore Android può gestire solo OpenGL ES 1.x. Genera un'eccezione se alimentato con il codice OpenGL ES 2.0. Questo deve essere testato su un dispositivo che supporta 2.0. Questo potrebbe cambiare in un paio di settimane con Ice Cream Sandwich, ma non ci conterei: l'atteggiamento degli sviluppatori è che è più semplice provare su un dispositivo, quindi aggiornare l'emulatore non è così importante. –

4

In OpenGL ES 2.0, che è quello che usano nuovi gadget, si hanno anche per fornire il proprio vertex e fragment shader perché il la vecchia pipeline a funzione fissa è sparita. Ciò significa dover eseguire autonomamente calcoli di ombreggiatura, ecc., Cose che sarebbero piuttosto complesse, ma è possibile trovare le implementazioni esistenti sui tutorial GLSL.

Tuttavia, poiché GLES è un sottoinsieme di desktop OpenGL, è possibile eseguire lo stesso programma su entrambe le piattaforme.

+3

+1 Questo è un ottimo rispondere che probabilmente porterà all'approccio più produttivo (evita il refactoring, scrivi codice programmabile con VBO fin dall'inizio). –

+1

ES2 non è un sottoinsieme rigido di desktop GL, ES3. –

3

So di due progetti per fornire la traduzione GL tra il desktop e ES:

  • glshim: Sostanziale gasdotto fisso 1.x supporto, base ES 2.x supporto.

  • Regal: Qualsiasi cosa per ES 2.x.

+0

Recentemente ho trovato Regal, sembra molto carino. –

+0

Ho trovato Regal doloroso da usare, tuttavia :( – lunixbochs

0

opzione 3) Si potrebbe usare una libreria come Qt per gestire il codice OpenGL utilizzando il loro costruito nel funzioni wrapper. Questo ti dà la possibilità di usare una base di codice (o basi di codice minimamente diverse) per OpenGL e costruire per la maggior parte delle piattaforme che desideri. Non avresti bisogno di portarlo per ogni diversa piattaforma che volevi supportare. Qt può anche scegliere il contesto OpenGL in base alle funzioni che usi.