Lo so. Sono discorsi pro-flame che hanno stancato tutti. Anche me. Ma a quanto pare qualcuno non ha capito a fondo la differenza fra le due librerie e crede che OpenGL sia il solito fratello sfigato delle DirectX che mamma microsoft ci offre con tanto spirito di carità.
Non starò a tediarvi con “è meglio X perché” o “quanto fa schifo Y”. Vi sparerò di seguito qualche dato preso da libri attendibili e non trarrò conclusioni. Queste spettano a voi.
Per prima cosa va puntualizzato che comparare OpenGL con le DirectX è come comparare KDE con OpenSolaris. Le OpenGL infatti sono puramente librerie 3D mentre le DirectX offrono anche funzionalità collegate al mondo dei videogame quali
DirectDraw – Libreria per la grafica 2D
Direct3D – Libreria per la grafica 3D
DirectSound – Libreria per la riproduzione e la manipolazione di effetti sonori
DirectInput– Libreria per la gestione dell’Input (tastiera, mouse, joystick etc.)
DirectShow – Libreria per la riproduzione di file video
DirectPlay – Libreria per il networking
Per OpenGL invece dobbiamo accoppiare librerie specifiche separate e librerie ausiliarie come GLUT e simili. Le comparazioni fra OpenGL e DirectX, quindi, le farò solamente rispetto a Direct3D.
Iniziamo con una tabella che comparativa delle features
Feature: | OpenGL | Direct3D |
Vertex Blending | N/A | Yes |
Multiple Operating Systems | Yes | No |
Extension Mechanism | Yes | Yes |
Development | Multiple member Board | Microsoft |
Thorough Specification | Yes | No |
Two-sided lighting | Yes | No |
Volume Textures | Yes | No |
Hardware independent Z-buffers | Yes | No |
Accumulation buffers | Yes | No |
Full-screen Antialiasing | Yes | Yes |
Motion Blur | Yes | Yes |
Depth of field | Yes | Yes |
Stereo Rendering | Yes | No |
Point-size/line-width attributes | Yes | No |
Picking | Yes | No |
Parametric curves and surfaces | Yes | No |
Cache geometry | Display Lists | Vertex Buffers |
System emulation | Hardware not present | Let app determine |
Interface | Procedure calls | COM |
Updates | Yearly | Yearly |
Source Code | Sample | SDK Implementation |
Da notare il supporto allo Stereo Rendering che serve a creare video 3D compatibili con gli occhialetti tanto di moda nell’ultimo periodo. 😀 Ora non so se questa tabella è aggiornatissima ma è comunque indicativa.
Altra questione. Le DirectX hanno un accesso diretto all’hardware su Windows mentre le OpenGL si devono arrangiare con le WGL. Questo influisce negativamente sulle OpenGL su Windows ed è uno dei motivi per cui per i giochi windows si preferiscono le DirectX. Il motivo di questa discriminazione è nella chiusura del codice di Windows, ovviamente. Inoltre, astutamente, le funzionalità di accesso all’hardware (driver) e quelle di API sono inseparabili. Ciò significa che un programma che sfrutta OpenGL non può appoggiarsi a DirectX per avere una via preferenziale verso la scheda video, infatti tale via è utilizzabile solamente se il canale viene aperto dalle API Direct3D.
Inoltre le prestazioni fra Direct3D e OpenGL sono del tutto comparabili. A seconda dei test prevale una o prevale l’altra. Quindi siamo in totale parità.
Infine la semplicità di programmazione pende a favore delle OpenGL. Per prima cosa perché sono scelte universalmente come libreria didattica e in secondo luogo perché sfrutta la semplice interfaccia a “chiamata di funzione” a differenza dell’uso di COM per DirectX.
Non dico che la tecnologia COM sia peggio della chiamata di funzione. Ma sicuramente richiede un approccio diverso e quindi una curva di apprendimento più ripida rispetto al sistema “standard” usato da C/C++ e che quindi tutti conoscono già.
Quasi dimenticavo di aggiungere che le OpenGL sono disponibili ovunque, per qualunque architettura e dispositivo, mentre le DirectX sono vincolate a Microsoft.
Ci sarebbe altro da dire ma poi diventerei noiso. Penso che queste cose servano a fare un po di chiarezza.
Bella spiegazione, complimenti! Ho letto ieri sera il post di Guiodic sull’argomento, e per un non tecnico come me non bastava a farmi un’idea chiara. Ora ce l’ho… 🙂
Guido ci mette più sentimento. xD Io cerco di mantenere il faro della “operazione divulgativa”. 😀
che dirti… Grazie 🙂
“Ci sarebbe altro da dire ma poi diventerei noiso. Penso che queste cose servano a fare un po di chiarezza”
continua pure, se ti va
Non mi piace fare le cose per “sentito dire”. Quindi magari approfondisco appena recupero tutte le fonti necessarie. 🙂