Tempo fa ho riassunto gli eventi che ci hanno portato oggi al dominio di DirectX come standard per i giochi rispetto ad OpenGL..

si tratta di storia: storia dell’informatica ma sempre storia!

E un testo un po’ lungo ma molto istruttivo; è diviso per eventi descritti senza commenti di parte.

la mia fonte è un libro stampato:

OpenGL® SuperBible, Third Edition
By Richard S. Wright Jr., Benjamin Lipchak

che consiglio a chi vuole studiarsi la grafica 3D imparando con l’OpenGL

Io sono evidentemente di parte (OpenGL): nonostante questo i fatti descritti non lo sono. Potete trovarne riscontro e conferme facilmente.

Questo che racconto è un esempio utile per capire come si fa strada Microsoft nel mercato e il perché certa gente, me compreso, ha poca fiducia in questa compagnia e sostiene con forza le alternative.

Oggi lo standard per i giochi potrebbe essere OpenGL: anche Linux e Mac avrebbero gli ultimi giochi per computer! Se vuoi capire perché questo non è successo prosegui nella lettura degli avvenimenti che ci hanno portato al “dominio” di DirectX

Nota: DirectX non è solo grafica 3D: si occupa di Audio, Input vari, ecc… Insomma: tutto quanto c’è di multimediale. OpenGL invece è solo il 3D: che è comunque la parte più importante e complessa di un sistema multimediale. Il confronto qui descritto, anche se si parla di DirectX, è tra Direct3D (di DirectX) ed OpenGL… Un confronto corretto sarebbe DirectX contro OpenGL + SDL (+ OpenAL ). Comunque questo più che un confronto è una descrizione degli eventi che caratterizzarono la lotta tra OpenGL e DirectX; eventi che ci hanno portato allo stato attuale delle cose.

Comincia la storia – fatti oggettivi

Il predecessore di OpenGL è stata la IRIS GL di Silicon Graphics: era inizialmente una libreria grafica 2D che si è evoluta in una 3D, costruita su hardware dedicato.

SGI (Silicon Graphics) ha poi capito che perché potesse invadere un mercato più ampio doveva subire dei cambiamenti… Così nacque OpenGL.

Con lo scopo di definire lo standard e promuoverlo nacque l’ARB (Architecture Rewiev Board) composto inizialmente da: SGI, Digital Equipment Corporation, IBM, Intel, Microsoft. Ancora oggi 4 volte l’anno l’ARB si riunisce per discutere l’evoluzione di OpenGL e le strategie per promuoverlo.

SGI controllava comunque le licenze OpenGL.

Nel 1992 venne creata la specifica OpenGL 1.0. Da allora molti altri si sono aggiunti all’ARB: in particolare i produttori hardware.

Gli incontri sono aperti ad altre aziende non iscritte all’ARB; si tenta comunque di mantenere il numero di partecipanti limitato per non ridurre la produttività.

Un’implementazione OpenGL è composta o da una libreria software, che crea immagini tri-dimensionali in risposta alle chiamate OpenGL, oppure da un driver per un dispositivo hardware, che traduce le chiamate OpenGL in segnali comprensibili alla scheda grafica.

un produttore hardware che vuole entrare nel mercato sfruttando OpenGL deve pagare ad SGI una licenza: con questa licenza gli viene data un’implementazione di esempio interamente software e un “device hardware kit” che viene poi utilizzato per produrre driver ottimizzati e aggiungere estensioni OpenGL personalizzate.

Ogni modello del produttore deve passare un test di conformità per assicurare che implementi correttamente tutta una specifica OpenGL.

I driver per l’utilizzo sono forniti, con licenza, dai produttori stessi. Nonostante questo chiunque può produrre dei driver non ufficiali: in genere ci si basa sul codice non ufficiale MESA.

È a questo punto che entra in scena DirectX.

Un tempo si potevano comprare particolari schede (Windows Accellerator, o Graphic Device Interface – GDI) per accelerare i comandi 2D in windows (stiamo parlando del 3.1 3.11 per quelli che se lo ricordano, prima di windows 95): queste schede erano perfette per iniziare a sviluppare i primi videogiochi.

I giochi in windows erano allora: giochi di carte o puzzle, comunque non richiedevano animazioni veloci.

I produttori di giochi continuarono a basarsi sul DOS (il predecessore di Windows, un sistema non grafico, cercate su internet per maggiori informazioni) per avere un pieno controllo delle risorse e un accesso completo al monitor.

Sotto windows questo non poteva avvenire perché i giochi dovevano condividere le risorse con il sistema windows.

Microsoft provò a fornire gli strumenti per creare giochi basati su windows con un primo tentativo (WinG API) che fallì, i produttori di giochi continuarono a produrre per DOS.

Quando microsoft iniziò a sviluppare windows 95 si pose come obiettivo quello di fermare una volta per tutte lo sviluppo di giochi su DOS: doveva fornire un accesso diretto all’hardware. Così Windows95 incluse un kit di sviluppo orientato ai produttori di gioco che tra le sue API[¹] presentava DirectDraw (per dirla tutta DirectDraw è stato acquisito con l’acquisto di una piccola azienda: non lo ha fatto microsoft).

A quel punto per restare competitivi i produttori hardware avevano bisogno dei driver GDI e di DirectDraw: questi driver erano intesi a fornire agli sviluppatori un accesso diretto all’hardware simile a quello che avevano con l’utilizzo di DOS.

Questa volta Microsoft ebbe più successo e quel gruppo di API oggi si è chiamato DirectX. Quelle API rudimentali si sono evolute per fornire accesso diretto anche ad altri hardware: le schede sonore, ed i dispositivi multimediali in generale.

I giochi erano tutti in grafica 2D: DirectX era l’API più utilizzata (ce n’erano altre, ad esempio QuickTime di MAC)

Mentre microsoft cercava di portare all’interno di windows una piattaforma per i giochi sponsorizzava allo stesso tempo OpenGL perché entrasse a far parte di Windows. Lo scopo era far concorrenza alle workstation Unix-based che tradizionalmente ospitavano le applicazioni scientifiche.

Le schede grafiche 3D erano troppo costose per gli utenti e non venivano utilizzate per i giochi. Solo le aziende potevano permettersele così OpenGL divenne inizialmente popolare nel campo del CAD, delle simulazioni e delle visualizzazioni scientifiche. In questi campi le performance erano di grande importanza: OpenGL fu studiato per ottimizzarle ed ebbe molto successo.

OpenGL diventò uno standard sufficientemente maturo e ben stabilito, con molte potenti funzionalità. Contemporaneamente le schede grafiche 3D arrivarono ad un prezzo che iniziava ad essere attraente anche per i videogiocatori.

Mentre questo accadeva Microsoft stava cercando di pubblicizzare la sua nuova API di rendering 3D, direct3D, inizialmente era difficile da usare e dalle ristrette funzionalità rispetto ad OpenGL: tanto che non avrebbe trovato posto nel mercato.

Iniziò così la guerra delle API tra SGI e Microsoft:

Microsoft faveva parte dei membri fondatori dell’OpenGL ARB e aveva voluto OpenGL sulla piattaforma Windows per permettere ai produttori di software su piattaforme unix di effettuare con poca difficoltà un porting alle piattaforme Windows. La portabilità era un’arma a doppio taglio perché avrebbe permesso agli sviluppatori su Windows di effettuare dei porting ad altre piattaforme.

Uno dei giochi più popolari a quel tempo fu Quake: il suo autore John Carmack riscrisse in OpenGL il motore del gioco; lo fece in pochi giorni (un week-end).

L’evento mise in fermento l’intero mondo dei giochi su PC.

John Carmack dimostrò facilmente come 10 righe di codice OpenGL richiedevano 2-3 pagine di codice Direct3D per ottenere lo stesso obiettivo (renderizzare qualche triangolo).

Molti programmatori di giochi iniziarono a considerare seriamente OpenGL come ad un’API per tutte le applicazioni 3D e non più solo per le applicazioni scientifiche.

Aziende come la ID software, che si prefissavano di produrre giochi per più piattaforme, videro semplificarsi notevolmente il raggiungimento di questo obiettivo.

Microsoft si trovò di fronte ad un dilemma: non poteva smettere di promuovere Direct3D dopo quello che aveva già speso fino a quel momento ma non poteva neanche smettere di promuovere OpenGL perché avrebbe rinunciato ad una grossa fetta di mercato delle WorkStation (a quel tempo appartenente esclusivamente a piattaforme Unix).

Così iniziò a sostenere con insistenza che OpenGL era adatto a rendering[²] esatti e precisi senza vincoli di tempo e Direct3D al rendering real-time (quello dei giochi).

La documentazione ufficiale di Microsoft sosteneva che OpenGL fosse più come un motore di rendering per ray-tracing[*] che un’API per la grafica real-time.

[*]ray-tracing: tecnica di rendering alternativa che permette di ottenere risultati con qualità notevolmente maggiori di quella classica (scan-line), ma con tempistiche che lo rendono inadatto, per ora, al rendering real-time. (usate un motore di ricerca per + info, non voglio andare off-topic)

SGI prese in mano la campagna di promozione di OpenGL tra i produttori di giochi che volevano poter scegliere quale tecnologia utilizzare.

Qualche sviluppatore di giochi iniziò a scrivere in OpenGL in previsione della stagione natalizia 1997.

Microsoft incoraggiò i produttori a sviluppare in Direct3D e disse che chi voleva utilizzare l’OpenGL sulla sua piattaforma avrebbe dovuto utilizzare un apposito kit di sviluppo denominato Mini-Client Driver (MCD).

Dopo molte critiche imbarazzanti microsoft spese moltissimo tempo per migliorare le scarse prestazioni del suo MCD in rapporto a quelle della piattaforma sviluppata da SGI.

Dopo un lungo lavoro di miglioramento l’MCD permise ai produttori di mettere le mani sul codice fino a chiamate di basso livello (chiamate dirette all’hardware, la scheda video, per disegnare direttamente).

Microsoft continuò comunque ad insistere che l’OpenGL non era adatto allo sviluppo dei videogiochi e che l’MCD serviva solo per fornire una strada pronta alle applicazioni scientifiche come il CAD.

Rapidamente tutti i produttori di schede video ebbero la loro implementazione driver basata sull’MCD.

La maggioranza dei giochi di allora era sviluppata in Direct3D ma i produttori di schede video faticavano ad ottenere un supporto su di esso: supportavano invece fortemente OpenGL. Per questo presto il mercato del Direct3D si sarebbe estinto.

Nell’estate del ’97 microsoft annunciò che NON avrebbe fornito le licenze per il codice MCD e hai produttori non sarebbe stato permesso di rilasciare i propri driver per windows 98.

Potevano però fornirli per la piattaforma Windows NT: la piattaforma di pertinenza per OpenGL secondo microsoft ( nota: Windows NT era una versione di windows destinata alle aziende ed inadatta all’utenza Desktop ).

I produttori software che avevano speso tempo per sviluppare i propri giochi in OpenGL non poterono immettere nel mercato tali versioni entro il natale del 1997. I produttori di schede grafiche si ritrovarono a non poter fornire i driver OpenGL delle schede vendute.

Microsoft si “guadagnò” così un intero anno di vantaggio rispetto ad OpenGL; intanto continuava ad affermare che l’OpenGL andava usato per la grafica non real-time su piattaforma NT e Direct3D per i giochi su piattaforma windows98.

Per fortuna questa situazione non ristagnò a lungo e SGI fornì il proprio driver kit per OpenGL basato sulla propria implementazione per windows.

Il driver kit SGI venne battezzato Installable Client Driver (ICD).

Microsoft scoraggiò l’uso dell’ICD sostenendo che MCD era molto più semplice da utilizzare.

L’ICD comunque aveva un’interfaccia semplice da usare che rese lo sviluppo di driver simile a quello dell’MCD di microsoft, migliorando inoltre le loro prestazioni.

I produttori di giochi ricominciarono a guardare seriamente all’OpenGL.

Microsoft, forte della sua vittoria iniziale ed ormai senza possibilità di fermare l’avanzata di OpenGL nel mercato dei consumatori, accettò di nuovo di sviluppare OpenGL per Windows98.

Stavolta Microsoft e SGI avrebbero dovuto lavorare insieme ad una nuova versione delle API, battezzata “Fahrenheit“, che avrebbe dovuto mettere insieme il meglio di OpenGL ed il meglio di Direct3D.

Fahrenheit sarebbe dovuta essere fruibile esclusivamente su hardware microsoft e Silicon Graphics.

Nel contempo SGI stava perdendo la battaglia con microsoft sui prezzi delle workstation.

SGI dovette abbandonare il mercato dei consumatori e dopo poco tempo rilascio la sua nuova versione di NT Workstation, con il completo sostegno di microsoft.

OpenGL aveva perso il suo più grande sostenitore per il mercato dei consumatori.

Molte industrie videro l’accordo di Fahrenheit e l’uscita dal mercato consumer di SGI come la fine di OpenGL.

Invece OpenGL fu di nuovo ampiamente disponibile sull’hardware: gli sviluppatori non avevano bisogno di SGI o chiunque altro che mostrare i pregi di OpenGL. Era semplice da usare, potente, ed era utilizzato da qualche anno: questo significava un’enorme mole di documentazione disponibile.

Man mano che il tempo passava il progetto Fahrenheit cadde completamente nelle mani di Microsoft e venne cessato.

Ancora oggi i produttori hardware supportano OpenGL e contribuiscono a crearne estensioni. Così come ci sono aziende che producono giochi con OpenGL il cui vantaggio è la portabilità su diverse piattaforme.

storia recente (fino al 2007):

DirectX 10 sarà implementato SOLO ed ESCLUSIVAMENTE in Vista, il nuovo S.O. microsoft…

Inizialmente si voleva congelare OpenGL alla versione 1.4 emulandolo sopra all’interfaccia Aero di microsoft… Operazione (come visto) già tentata in passato… Alla fine pare che microsoft abbia desistito da questo proposito ma è ancora tutto da vedere!

OpenGL 3.0 è in cantiere: sarà più potente della specifica Directx 10 (almeno sulla carta, si vedrà); purtroppo arriverà solo fra qualche mese. Le estensioni che permettono di fare tutto ciò che è già possibile con Directx10 sono comunque già presenti nelle schede nVidia!

[¹] API, Application Programming Interface: Non sono altro che un insieme di funzioni o metodi, con relativa documentazione, che permettono ad un programmatore di utilizzare una libreria o un hardware senza conoscerne i dettagli o il funzionamento interno. Le API sono importantissime nella programmazione: permettono ad esempio di scrivere un programma grafico usando alcune funzionalità delle schede video senza preoccuparsi di come queste funzionalità verranno poi effettivamente realizzate dalla scheda Video.

[²] Rendering: parola utilizzata nella grafica 3D per indicare il processo matematico che trasforma un insieme di dati numerici rappresentanti un ambiente tridimensionale in un’immagine. Esistono diverse metodologie di rendering: quella tradizionale è implementata all’interno delle schede grafiche ed è ampiamente utilizzata in qualunque applicazione 3D. Le due tecniche principali di rendering sono lo “scan-line” e il “ray tracing”.