Het verschil zit hem vooral in de 'afkomst'
OpenGL was oorspronkelijk door SGI ontwikkeld voor hun grafische workstations.
Oorspronkelijk was OpenGL puur op software-rendering gericht.
Later ontwikkelde SGI 3d-acceleratie en werd OpenGL daarop geimplementeerd.
Toen andere systemen ook 3d-acceleratie kregen, is de OpenGL-API ook naar die systemen geport.
Zo is het dus ook op Windows beland. Het probleem hierbij was echter dat Windows op veel simpelere hardware draaide dan de workstations van SGI, en OpenGL was dus enorme overkill. De 3d-hardware kon de meeste functies niet accelereren, en de drivers waren ook nogal log. Was dus niet zo geschikt voor spelletjes op een standaard PC.
In den beginne was de VooDoo de enige 3d-kaart, en die had een eigen 3d-API, Glide, die wel geoptimaliseerd was voor PCs en spelletjes.
Toen er echter andere 3d-kaarten op de markt kwamen, hadden die ook weer hun eigen APIs, en moesten ontwikkelaars daar dus aparte code voor schrijven.
Daar moest een oplossing voor komen.
Enerzijds kwam daar dus MiniGL... een lichtgewicht-versie van OpenGL, waar de functionaliteit heel beperkt was, en veel beter aansloot bij de PC-hardware (drivers waren ook veel makkelijker te schrijven dan OpenGL-drivers, die enorm complex zijn).
Anderzijds kwam Microsoft met Direct3D, een compleet nieuwe API die heel lowlevel commando's naar de hardware kon sturen (ironisch genoeg op advies van John Carmack, die uiteindelijk OpenGL verkoos omdat ie Direct3D te lowlevel vond, waar OpenGL bijzonder highlevel is).
Het voordeel van Direct3D was dat het heel nauw aansloot op de functionaliteit van de hardware... Een programmeur kon dus behoorlijk effciente code schrijven, en goed gebruik maken van alle features... mits hij een goede kennis van de hardware had. Nadeel daarvan was dat bij iedere generatie de hardware drastisch veranderde, en er een nieuwe generatie van Direct3D bij kwam, die soms een nieuwe API moest krijgen, om beter bij de nieuwe structuur van de hardware te passen (zoals de introductie van T&L en shaders).
Voordeel daarvan was dan weer wel dat je weer efficiente toegang had tot de nieuwste features.
Aan de andere kant werden de 3d-accelerators en PCs steeds krachtiger, dus na niet al te lange tijd was het ook mogelijk om 'gewone' OpenGL te gebruiken, en verdween MiniGL van het toneel.
Het probleem van de complexe drivers bleef echter, vandaar dat de implementatie van de meeste OpenGL drivers erg slecht was. nVidia was de eerste die hun OpenGL-driver goed op orde had, met weinig bugs en goede efficientie. Ze hadden hier lange tijd een voorsprong op de concurrentie.
Nadeel daarvan was dan weer wel dat je als programmeur van tevoren al wist dat je code alleen op nVidia-kaarten echt goed zou werken, en op alle andere kaarten een stuk minder. Een probleem dat Direct3D niet had, omdat die drivers makkelijker te ontwikkelen waren, en iedere fabrikant al snel een redelijk efficiente driver had, met weinig bugs.
Door de hevige concurrentie bleven er echter al gauw nog maar twee spelers over, nVidia en ATi, dus het probleem van slechte OpenGL drivers was daarmee bijna opgelost. ATi moest alleen hun achterstand nog inlopen, de rest deed er niet meer toe.
In de loop der jaren zijn Direct3D en OpenGL dus naar elkaar toe gegroeid, qua features, efficientie en compatibiliteit, door allerlei omstandigheden.
Het grootste verschil is nog steeds dat Direct3D nog steeds om de zoveel tijd compleet aangepast wordt op de nieuwste 3d-hardware, terwijl OpenGL in de basis altijd dezelfde API blijft (hoewel men voor OpenGL 2.0 een nieuwe API wilde ontwikkelen, maar die is er uiteindelijk niet gekomen). OpenGL maakt daarentegen gebruik van een systeem van extensies.
Het voordeel daarvan is dat iedere fabrikant zelf extensies kan toevoegen, zodat nieuwe features vanuit OpenGL bijna direct toegankelijk zijn.
Het nadeel daarvan is dat die extensies alleen voor die fabrikant werken.
Er is dus een commissie (de ARB) in het leven geroepen die extensies standaardiseert. Nieuwe versies van OpenGL houden dan ook met name in dat er een nieuwe set extensies is die standaard aanwezig is in die versie.
Het nadeel daarvan is dat die commissie altijd achter de feiten aanloopt. Eerst is er de wildgroei van nieuwe extensies van fabrikanten, en daarna worden die samengevoegd tot een nieuwe ARB-extensie voor iedereen.
Direct3D werkt anders. Er is voor Direct3D ook een commissie, die bestaat uit Microsoft, en de grote hardware-fabrikanten. Deze commissie gaat om de tafel zitten VOORDAT de nieuwe hardware ontwikkeld is, en gaat proberen om de neuzen van alle fabrikanten dezelfde kant op te zetten, om daarna de API te bepalen voor die generatie videokaarten, waarna de fabrikanten ieder hun eigen implementatie daarvan mag maken.
Direct3D stuurt dus als het ware de ontwikkeling van de hardware, terwijl OpenGL die ontwikkeling alleen maar volgt. Het grappige is dan ook dat bv het shadermodel van OpenGL bijna identiek is aan dat van Direct3D.
Al met al maakt het dus steeds minder uit welke API je gebruikt qua features en efficientie. Ze gaan steeds meer op elkaar lijken.
Grootste verschil voor programmeurs is dat je bij OpenGL tegenwoordig voornamelijk via extensies moet werken, de basis-API is eigenlijk compleet achterhaald. Bijna alles gaat met shaders, vertexbuffers en rendertargets, en dat zijn allemaal extensies.
Vandaar dat programmeren in Direct3D mij een iets 'nettere' indruk geeft (mede doordat het ook netjes object-georienteerd is, terwijl OpenGL nog procedureel is).
Verder is een groot verschil dus dat OpenGL nog steeds door vele systemen ondersteund wordt, terwijl Direct3D maar op een beperkt aantal systemen werkt (Windows, XBox, Mac OS, en via wine op linux en soortgenoten).
Voor de snelheid maakt het doorgaans weinig uit. Het is immers de hardware die de acceleratie doet, niet de API.
Als de code dus gewoon goed geschreven is, en de driver efficient is, zal in de meeste gevallen de hardware het verschil maken (er zijn natuurlijk altijd uitzonderingen, omdat Direct3D nog steeds alleen lowlevel is, waar OpenGL ook nog de highlevel functionaliteit heeft).