L'apprendimento di OpenGL 2.1 è inutile oggi?


44

Sono nuovo nel mondo 3D OpenGL / DirectX e ho scoperto che le specifiche OpenGL 4.1 e GLSL sono state appena rilasciate oggi.

Un mio amico mi ha dato il libro rosso per OGL v2.1 ma, per quanto ho letto, 3.xe 4.x differiscono molto da 2.x e molte cose sono ormai deprecate.

Posso usare il libro per iniziare ad apprendere le basi del 3D e del CG o è meglio trovare una copia più recente?


10
Non so molto su OpenGL / DirectX, ma mi diverto a giocare su una macchina che ha più di un anno. Immagino che il tuo sapere 3.GL OpenGL sarebbe utile per le mie abitudini di gioco. Solo un pensiero.
Simurr,

Non mi piace il modo in cui questa domanda è formulata. Puoi creare un gioco in OpenGL 2.1 ? La risposta: un definitivo . Cosa intendi per inutile allora? Puoi imparare le basi del 3D da un libro più vecchio o da un'API obsoleta? Ancora una volta un definitivo . È il modo migliore-migliore-bessssssst per farlo? Probabilmente no .
Bobobobo,

Risposte:


18

In tempi come questo mi rivolgo sempre al Steam Hardware Survey: http://store.steampowered.com/hwsurvey/ - vedrai che la penetrazione sul mercato dei sistemi di classe DX10 / 11 è quasi all'80%; essendo sostanzialmente equivalente a GL3.3 o versioni successive. Questo 80% è limitato agli utenti di Vista / 7: aggiungi una GPU DX10 / 11 con XP e aumenti a poco più del 90%.

Tenendo presente che qui stiamo parlando di giocatori un po 'più hardcore, devi iniziare a pensare al tuo pubblico di destinazione. Sono queste le persone che vuoi prendere di mira? Stai invece puntando a quelli con più hardware di livello inferiore? Che dire della grafica Intel? Che dire degli utenti Mac e Linux? Queste sono tutte domande a cui devi rispondere da solo, quindi le linee guida generali sono le migliori che otterrai.

In aggiunta a ciò, devi tenere conto del fatto che se stai iniziando a imparare oggi con l'intenzione di spedire qualcosa, stai guardando un periodo di almeno un anno prima di arrivarci (a meno che non stiamo parlando su casi davvero banali / semplici). Con la tendenza al rialzo delle capacità di gfx che continua, stiamo cercando di essere molto vicini al 100% di assorbimento dell'hardware GL3.3 + da allora.

Quindi considera che con GL2.1 o versioni precedenti imparerai e userai un sacco di vecchie sciocchezze rozze, anche se ti limiti ai sottogruppi di shader e VBOs di GL2.1 (le versioni GLSL di livello inferiore sono brutte da usare e i VBO in streaming sono quasi inutilizzabili senza GL_ARB_map_buffer_range) - GL3.3 + ha introdotto modi molto più piacevoli (e più performanti) di gestire molte cose, farai un uso migliore dell'hardware del giocatore (e ti saranno grati per questo) e passerai più tempo a scrivere codice produttivo piuttosto che a combattere un'API che non vuole davvero collaborare con te.

E poi ovviamente c'è la temuta situazione del guidatore. Il fatto duro ma vero è che i driver GL su Windows sono in uno stato spiacevole: NV supporta le cose che non dovrebbero, AMD non supporta le cose che dovrebbero e con Intel è necessario limitarsi alla funzionalità GL per la quale esiste un equivalente in D3D. Più è recente la GL_VERSION, più è probabile che si verifichino bug del driver, ma per GL3.3 le cose sono ragionevolmente stabili ora.

Quindi il riassunto è che, in assenza di altre informazioni (pubblico di destinazione, ecc.), Sceglierei GL3.3 come base (eventualmente estraendo funzionalità da GL_VERSION superiori dove è disponibile e dove non interrompe la base di codice troppo) a meno che non ci fosse una ragione molto specifica e definitivamente identificata per scendere di livello (e vorrei esserne assolutamente sicuro al 100% piuttosto che usare una vaga nozione di " ma che dire di quelli con hardware più vecchio "). In quest'ultimo caso non andrei al di sotto di GL2.1, e cercherei di sfruttare la funzionalità 3.x possibile anche allora.


Ottimo punto su GL3.3 ~ = DX10 / 11 e statistiche hardware Steam.
Nate,

Solo per aggiornare queste statistiche - DX10 / 11 GPU + Vista / 7 sono ora al ~ 88%, aggiungi un altro 4,38% per DX10 / 11 GPU + XP e stai osservando una penetrazione abbastanza comoda di oltre il 90%. L'assorbimento sta aumentando molto più velocemente di quanto mi aspettassi quando ho pubblicato quel post originale.
Maximus Minimus,

"GL3.3 + ha introdotto modi molto più belli (e più performanti) di gestire molte cose" - In che modo la tariffa 3.2 in confronto? Gli utenti Mac non ottengono ancora 3.3. Presumo sia quasi lo stesso, ma non voglio assumerne troppo.
michael.bartnett,

38

Suggerirei di attenersi all'intersezione di 2.1 e 3. Esistono ancora molti hardware e driver che supportano solo OpenGL 2.1, ma le pratiche incoraggiate dal core OpenGL 3 sono migliori. Questo tutorial è un buon punto di partenza (insegna OpenGL 2.0 senza funzionalità che sono state deprecate in 3).


3
+1 per il tutorial di Joe Groff. Ti guida attraverso l'intera pipeline nel Capitolo 2. E qualsiasi codice di "utilità" che aggiunge è solo due funzioni: una da leggere in un file (per GLSL) e una per leggere immagini TGA (e puoi anche usarne un'altra libreria di immagini o scrivi il tuo caricatore di immagini una volta ottenuto l'esempio funzionante). Tutto il resto è spiegato e parte del tutorial.
michael.bartnett,

18

Direi che non è inutile.

Perché? Bene, mentre il resto del mondo supporta OpenGL 3.xe 4.0, Mac OS X supporta ancora solo OpenGL 2.1. Inoltre, OpenGL ES, che viene utilizzato sulla maggior parte, se non su tutte le piattaforme portatili, è ancora ampiamente supportato in tutte le versioni: 1.0, 1.1 e 2.0; che sono approssimativamente paragonabili a OpenGL 1.4, 1.5 e 2.1, rispettivamente.

Quindi fino a quando OpenGL ES 1.0 non scompare completamente dalla faccia della Terra, sapere OpenGL 2.x non sarà uno spreco.

Questo non vuol dire che non c'è valore nell'usare OpenGL 3.xo 4.0 su piattaforme che lo supportano, ovviamente.

Aggiornamento: a partire dalla versione di Mac OS X Lion (10.7), il profilo Core OpenGL 3.2 è ora supportato su Mac. Questa versione depreca gran parte di OpenGL 1.x per semplificare l'API. Gli utenti delle versioni precedenti di OS X (e della grafica Intel di fascia bassa) sono ancora limitati a OpenGL 2.0 e 2.1. Conoscere OpenGL 2.x è comunque utile e lo rimarrà per un bel po 'di tempo.


Snow Leopard supporta la maggior parte delle estensioni di OpenGL 3, persino shader di geometria.
Axel Gneiting, il

@Alex Supportare "la maggior parte" delle estensioni non significa che il core GL3 è supportato. E stiamo solo parlando di 3.x
Matias Valdenegro,

@Axel Gneiting: non è più lo stesso. La maggior parte delle interessanti funzionalità di OpenGL 3.0+ non sono disponibili come estensioni. Ci sono un gran numero di cambiamenti fondamentali.
Greyfade,

12

La risposta di mh01 ha coperto molte delle basi, quindi aggiungerò alcuni supplenti.

OpenGL ES

Parliamo di ES 2.0 rispetto al desktop GL 2.1 rispetto al desktop GL 3.3. Ai fini di questa discussione, il termine "GL XY" farà riferimento alla versione desktop OpenGL XY, mentre "ES XY" farà riferimento a OpenGL ES XY

Strutturalmente , ES 2.0 ha più cose in comune con il core GL 3.3 che con GL 2.1. GL 3.3 ed ES 2.0 sono entrambi a base di shader puro. Sono entrambi basati su oggetti buffer puri. Ecc. GL 2.1 ha molte trappole di prestazioni e codifica che semplificherebbero la scrittura di un'app GL 2.1 che non sarebbe facilmente trasportabile su ES 2.0.

Tuttavia, in termini di sintassi del linguaggio di shading , GLSL ES 1.00 (mappatura su ES 2.0) assomiglia molto più a GLSL di GL 2.1 che a GL 3.3. Le parole chiave attributee varyingnon esistono in 3.3 core; utilizza ine out, che è molto più coerente e ragionevole quando si ha a che fare con più di 2 livelli di shader (motivo per cui ES 3.0 ha adottato la sintassi GL 3.3).

È facile mappare i concetti appresi in GL 3.3 a ES 2.0. Quindi, se impari GL 3.3 per uno dei vari strumenti per farlo, capirai come lavorare nel mondo ES 2.0. Dovrai capire dov'è il sottoinsieme, ovviamente (cioè: le cose che GL 3.3 può fare che ES 2.0 non può), ma i concetti sono gli stessi.

Mappare la sintassi di GLSL, in modo da poter copiare shader dall'uno all'altro, è un po 'più difficile. Ma davvero, tutto ciò che serve è qualche #define nei posti giusti. Inoltre, GLSL 3.30 ha alcune funzionalità di compatibilità ES, come highpe così via (che non fanno nulla in GLSL desktop).

Quindi ottieni qualcosa per ES 2.0 imparando da GL 3.3 invece di GL 2.1.


8

Per i giochi che non richiedono le modifiche più grandi a OpenGL esposti solo nelle versioni più recenti, l'utilizzo di solo 3.x + ti limita a una serie nvidia 8 e successive (non sono sicuro sugli altri fornitori di grafica che vorresti cercare). Quindi, se non stai usando le funzionalità 3.x +, stai solo creando un limite artificiale, impedendo alle persone con schede grafiche più vecchie, ma molto potenti, di giocare.

Per questo motivo consiglio vivamente di imparare il sottoinsieme compatibile con le versioni successive e le versioni più recenti, quindi scegliere la versione più bassa in cui è possibile inserire il gioco in modo efficace. Puoi

Noterò anche in risposta a un'altra domanda che OpenGL: ES 2.0 rimuove la pipeline con funzioni fisse, quindi è più equivalente a 3.0 rispetto a 2.1. Inoltre supporta sempre funzionalità diverse per la versione gl supportata in fase di runtime.


4

Direi che è salvo imparare OpenGL usando il tuo Red Book, semplicemente ignora quelle cose che sono deprecate nelle versioni più recenti (come glBegin (), glEnd () - usa invece i VBO). La maggior parte delle funzionalità nelle versioni più recenti era già disponibile in precedenza tramite le estensioni.


4

Sono principalmente d'accordo con Thbusch. Ma non ignorerei completamente le API deprecate: c'è ancora troppo codice là fuori che le utilizza. Tuttavia presterei loro molta meno attenzione. Inutile, ad esempio, apprendere glBegin (), glEnd () in modo sufficientemente approfondito da scrivere il proprio codice utilizzandoli. Ma dovresti riconoscerli quando li vedi e avere un'idea di quello che stanno facendo.

Vale comunque la pena di leggere l'intero Red Book almeno una volta, anche se non si crea il codice di esempio e si fanno esercizi che coprono le funzionalità interrotte in OpenGL 3.x.


3

La breve risposta:

No. Imparare OpenGL 2.1 è una buona idea, anche oggi, fintanto che impari le "parti buone".

La lunga risposta:

OpenGL può essenzialmente essere diviso in due parti: "Le parti buone" e "Funzioni legacy".

Onestamente, non vedo molti benefici nell'apprendimento delle funzioni legacy (la "funzione fissa"). Tuttavia, una parte sostanziale di OpenGL 2.1 (le parti buone) sono ancora disponibili oggi con modifiche relativamente minori.

Pertanto, l'apprendimento di alcune parti di OpenGL 2.1 può essere utile. In particolare, OpenGL ES 2 è molto popolare in questi giorni ed ES 2 è principalmente (ma non esattamente) un sottoinsieme di OpenGL 2.1. Per la programmazione 3D negli smartphone, OpenGL ES 2 è un must.

Allora, cos'è "buono"? Sostanzialmente tutto ciò che si trova nel "profilo principale" di OpenGL 3.x (anziché nel "profilo di compatibilità") e / o in OpenGL ES 2.

  • Shader di vertici e frammenti: imparali
  • Trame: ancora buono.
  • Matrici: sapere come funzionano è utile, ma glLoadIdentitye quel tipo di funzioni sono obsolete e dovrebbero essere evitate
  • Luce: è utile sapere come simulare la luce nella computer grafica, ma è glLightfvnecessario evitare altre funzioni di illuminazione a funzione fissa.
  • Buffer di array: buono
  • glBegin, glVertex, glColor, glEnd: Li evitare. Potrebbe essere utile per una rapida sperimentazione, ma ci sono altri modi migliori per fare lo stesso.
  • Elenchi di visualizzazione: evitare

La domanda in cui avevo originariamente pubblicato questa risposta si è rivelata duplicata, quindi la ripubblico qui.


1

Non credo sia una cattiva idea. Molti concetti GL si estendono su tutte le versioni di OpenGL e alla fine ti aiuteranno comunque. Ho una serie di libri OpenGL di 10 anni fa che ancora aiutano oggi. Direi che se sei nuovo su OpenGL e ci sono alcuni libri migliori che sono più vecchi, imparerai molto e il codice dovrebbe ancora funzionare. Gran parte di OpenGL è retrocompatibile (credo).


1

Vi consiglio di imparare prima le cose moderne e di far finta che le cose legacy non esistano fino a quando non ne avrete bisogno.

Le cose obsolete possono essere utili in alcuni casi, ad esempio se stai cercando di programmare qualcosa che supporta solo OpenGL 1.5 o precedente (puoi trovarlo su vecchi netbook scadenti e vecchi sistemi MacOS), OpenGL ES 1.x (i vecchi iPhone e Android prima della 1.6) o OpenGL SC (il sottoinsieme Saftey Critical se si sta programmando un display su jet da combattimento). Minecraft, ad esempio, è basato su OpenGL 1.3 in modo da supportare hardware molto vecchio (ma anche quello ha un'opzione 'avanzata').

Può anche essere utile se vuoi solo ottenere pixel sullo schermo e non ti interessa farlo nel modo "giusto".

È utile fare affidamento su alcune delle funzionalità offerte da OpenGL per impostazione predefinita durante l'apprendimento, come l'impostazione di un viewport da -1,0 a 1,0 e il rendering senza shader. Ciò ti consente di imparare senza dover fare tutto in una volta sola.

Ma a parte questo dovrebbe essere saltato, se possibile.

Ti suggerisco di controllare la mia risposta qui e qui per informazioni più approfondite.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.