Importa se imparo OpenGL o Direct3D?


11

Le differenze tra queste due API sono dettagli di implementazione minori che significano che una volta che ne ho appreso uno posso usarlo per tutto? Oppure ci sono ragioni per imparare l'uno piuttosto che l'altro se voglio essere in grado di usarlo in generale senza dover riapprendere un'altra API in futuro? Uno o l'altro è più generale?

In particolare, vorrei poter scrivere per qualsiasi scheda grafica, quindi il codice non è limitato alla sola esecuzione su schede di un determinato produttore o su un modello specifico. Mi piacerebbe anche essere in grado di scrivere codice che funziona ancora in assenza di una scheda grafica (anche se più lenta).

C'è una differenza nel modo in cui il codice portatile sarà su piattaforme diverse (sistemi operativi / architetture)? Sono interessato alla disponibilità di altre librerie che funzionano con queste e se l'una o l'altra porta a meno restrizioni di licenza nel suo ambiente più ampio. Qualunque cosa misurabile che farebbe la differenza se uno di questi potrebbe essere l'unico che imparo senza limitarmi.


2
la risposta di Freak Cricchetto è buona. Se vuoi imparare Direct3D puoi leggere il mio libro gratuito "La pipeline grafica di Direct3D" . I dettagli dell'API sono per lo più Direct3D9, ma i concetti sono gli stessi. Il fatto è che i concetti per la programmazione della grafica 3D non sono cambiati affatto dalla fine degli anni '60. Le API per esprimere questi concetti sono diventate molto più intelligenti.
legalizzare il

Risposte:


9

Non penso che importi molto, quale API vuoi usare quando ti appoggia alla "grafica del programma". Le cose più importanti da imparare sono i concetti tipici che usi quando lavori con scene 3D. Ad esempio, vuoi imparare a scrivere un semplice (e successivamente più sofisticato) grafico della scena. Questi concetti sono molto più importanti dei nomi specifici dei metodi API che devi chiamare.

Confrontalo quando impari a scrivere programmi. Se sei abbastanza bravo a scrivere programmi in es. Java, non avrai così tanti problemi ad imparare C ++, Objective-C, Swift o qualche altro linguaggio orientato agli oggetti. Perché sono i concetti e il pensiero che impari.

La scelta tra OpenGL, Direct3D e Metal è principalmente la scelta, quale sistema operativo target. Direct3D è disponibile principalmente su Windows, Metal su OS X e iOS e OpenGL è supportato sulla maggior parte dei sistemi tra cui OS X, iOS, Windows e Linux.

La scheda grafica probabilmente non ha alcuna influenza su questa decisione poiché non conosco una scheda che ne supporta solo una o due. Se non si dispone di una scheda grafica dedicata, il rendering in tempo reale sarà presto un problema. Sebbene una Intel HD Graphics e il compagno AMD possano già fare abbastanza.

Quindi, scegli la tua piattaforma.


Disclaimer: Finora non ho usato né Direct3D né Metal.


2
> "Se sei abbastanza bravo a scrivere programmi in eg Java, non avrai così tanti problemi ad imparare C ++" - questo non è vero. Tutti avranno enormi quantità di problemi nell'apprendimento e nell'uso del C ++. Il confronto con Java o qualsiasi altro linguaggio sicuro è del tutto inappropriato. Per altre lingue che hai elencato (Objective-C, Swift o qualche altro linguaggio orientato agli oggetti), tuttavia, tale affermazione è per lo più vera.
Visualizza nome

9

Attualmente siamo in una transizione di paradigmi API.

Il metodo di vecchia scuola di associazione di buffer, uniformi, attributi, layout e programmi come stato globale (implicito) e disegni di dispacciamento con quello stato è comune tra D3D11 e OpenGL. Tuttavia ha un grande sovraccarico (in fase di verifica e non sapendo cosa il programma vuole fare fino all'ultimo minuto). Inoltre, non sono thread-safe (per la maggior parte).

Questo è il motivo per cui sono emerse nuove API (o stanno arrivando presto) D3D12, vulkan e Metal sono le più importanti. Queste API danno un maggiore controllo al programma e gli consentono di dichiarare in anticipo cosa vuole fare usando i buffer di comando. Ti consentono anche di gestire le tue risorse (dati di vertici, trame, ...) molto più direttamente. Usarli con più è molto più semplice.

La scelta tra vecchio e nuovo si basa sul modo in cui è possibile gestire la memoria video allocata e creare il buffer dei comandi.

  • Se vuoi qualcosa che "funzioni" anche su hardware più vecchio, le API della vecchia scuola sono migliori; sono anche più conosciuti e riceverai più aiuto su di loro online.

  • D'altra parte, se riesci a gestire la natura asincrona dei comandi di invio e non ti dispiace dover tenere traccia di tutti i buffer allocati. Quindi le nuove API potrebbero fare al caso tuo.


6
Le nuove API grafiche esplicite non sono realmente progettate per essere consumate dal programmatore grafico medio, sono più per le persone che lavorano nelle infrastrutture nei motori o per coloro che hanno davvero bisogno delle prestazioni. Ti danno una pistola molto più grande e la puntano proprio al tuo piede.
porglezomp,

3

Personalmente non penso che importi molto. Basta sceglierne uno adatto al tuo progetto. Ho usato sia D3D che OpenGL in passato. Sono i concetti che contano. Qualunque cosa tu afferri, devi capire (per esempio):

  • Che cosa sono le trame e come vengono utilizzate dalla GPU.
  • Concetti di base sullo sviluppo della grafica (vertici, primitivi, frammenti, ecc.)
  • Come funziona il sistema di telecamere (ad esempio matrici MVP in OpenGL).
  • Cosa sono gli shader e come usarli correttamente.
  • Come funziona una GPU diversa rispetto alla CPU della tua macchina.
  • Quali sono le differenze tra il modello di memoria della GPU e il modello di memoria della CPU.
  • Cosa dovrebbe essere fatto sulla CPU e cosa dovrebbe essere scaricato sulla GPU per l'elaborazione.

Come altri menzionati qui, siamo nel mezzo di una transizione a un nuovo set di API (Vulkan, Metal, ecc.), Quindi a questo punto se sei completamente nuovo nello sviluppo della grafica, probabilmente concentrarti su GLSL è una buona idea da Vulkan trarrà vantaggio anche da questo.

Per quanto riguarda la portabilità, D3D è solo Windows (si dice che il progetto Wine stia cercando di far funzionare D3D su Linux, ma finora nulla di fattibile). OpenGL è multipiattaforma. Se vuoi diventare mobile, OpenGL ES è un'opzione disponibile. Ovviamente sia OpenGL che OpenGL ES hanno versioni diverse che non sono supportate da tutte le piattaforme.

Alla fine della giornata, tutte le API accedono allo stesso hardware sul tuo computer, è solo una questione di "come" accedervi.


Direct3D è anche quello che useresti se stai programmando per una delle console Xbox.
legalizzare il

Cosa intendi con "nulla di fattibile"? Wine gestisce senza problemi centinaia di programmi basati su D3D e lo fa da anni. Naturalmente ci sono bug e parti non implementate, ma ciò non rende inutilizzabile l'intera API.
Ruslan,

0

Dirò alcune parole sul rendering senza schede grafiche.

Niether OpenGL e DirectX necessitano davvero di una scheda grafica. Un'implementazione può essere completamente accelerata dal software.

Per OpenGL in Linux esiste il rasterizzatore software Mesa. Nella mia esperienza funziona bene finché non lo spingi troppo forte combinando strane funzionalità (elenco di visualizzazione + array di vertici indicizzati). Immagino che il loro elenco di bug reali sia alto un miglio. Assicurati di fare test continui!

Ho meno esperienza con OpenGL in Windows. Modifica risposta se sai qualcosa!

DirectX SDK viene fornito con un rasterizzatore software chiamato "rasterizzatore di riferimento". Secondo me è principalmente per il debug, ma conosco almeno un amico che usa il rasterizer di riferimento quando sviluppa DX11 su un laptop compatibile solo con DX10. Come menzionato in altre risposte, DirectX è solo Microsoft.


Nella mia esperienza l'uso di una scheda grafica integrata dovrebbe essere abbastanza buono per la maggior parte dello sviluppo OpenGL su Windows, assicurati solo che supporti una versione OpenGL recente.
Akaltar
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.