Kampf der Titanen OpenGL 1.3 vs. DirectX 8.1 (Direct3D)
! |
|||||||||||||||||||||||||||||||||||||||||||||
Die Gegner DirectX wurde von Microsoft entwickelt, um Windows für Spieleentwickler leichter und nutzbar zu machen. Man brauchte u.a. eine Schnittstelle für die 3D-Beschleunigerkarten - Direct3D. Microsoft kaufte also 1995 Rendermorphics Ltd - welche die RealityLab API entwickelten. Man bearbeitete diese ein wenig (Treiber Modell) und nannte sie Direct3D Immediate-Mode. Heute ist man bei Version 8.1 angelangt und die API hat nicht mehr viel mit der ersten Version gemein. Im Folgenden werde ich zwar oft von DirectX (DirectDraw, DirectInput, Direct3D, DirectSound, DirectPlay) reden, meine aber meistens Direct3D. Leider läuft DirectX nur auf Microsoft Windows Systemen. Der Funktionsumfang der jeweiligen DirectX Version wird von Microsoft und ein paar Hardwareherstellern (NVIDIA, ATI, ...) festgelegt. Die Neuerungen in Version 8.1 gegenüber Version 7.0 lassen sich recht kurz zusammenfassen.
Vor einigen Tagen, am 14. August 2001 war es soweit, eine neuen Version (1.3) von OpenGL wurde vorgestellt. OpenGL wurde von SGI, in Zusammenarbeit mit anderen Hardware/Softwareherstellern, entwickelt. Es läuft auf Großrechnern, verteilten Systemen, Mac's, PC's uva. Der Funktionsumfang wird von einem Konsortium (ARB - Architectural Review Board) verabschiedet, dem viele Hardware-/Softwarehersteller angehören. Hier die Neuerungen:
|
|||||||||||||||||||||||||||||||||||||||||||||
Quake 3 Arena hatte aber auch schon Multitexturing unter
OpenGL bevor es die Version 1.3 gab!!!?!?!?
Wie der Name ("Open Graphics Library") bereits sagt, handelt es sich bei OpenGL um eine offene Schnittstelle. Unter der Verwendung von sogenannten Extensionen kann jeder Hersteller seine eigenen Funktionen einbauen. Extensionen:
|
|||||||||||||||||||||||||||||||||||||||||||||
Ist Microsoft's DirectX mit Version 8 nun also einfacher?
Eigentlich sollte man meinen "JA". Leider befinden wir
uns aber bei Version 8 / 8.1.
Es fing alles so schön an. Mit der Freigabe von DirectX 8 wurden Spezifikationen für die Pixel und Vertex Shader herausgegeben. Hier ein kurzer Überblick:
![]() Mit den Vertex Attribut Registern werden Dinge wie Geschwindigkeit, Gewicht, Dichte ..... der einzelnen Eckpunkte festgelegt. Das Vertex Programm führt dann math. Operationen auf den Vertices aus, erzeugt allerdings keinerlei neue. Zum Schluss werden die bearbeiteten Vetices geclipped und kommen in die Vertex Resultat Register. Die Vertex Shader machen auch keine Probleme, obwohl es laut Gerüchten 3 verschiedene Versionen/Spezifikationen geben soll. Das Problem machen die Pixel Shader. Mit DirectX 8.1 sind die Versionen 1.0 bis 1.4 auf dem Markt. Bevor ich genauer auf die Pixel Shader eingehe, hier noch ein paar notwendige Informationen: So werden aus S,T,R,Q die Texturekoordinaten gewonnen: ![]() ![]() ![]() Die Register
Es gibt drei Arten von Befehlen:
PS 1.0 - kein Hardwaresupport bekannt
PS 1.1 - Geforce 3, Radeon 8500
PS 1.2 - Geforce 3, Radeon 8500
PS 1.3 - Geforce 3, Radeon 8500
PS 1.4 - Radeon 8500
Die Unterschiede zwischen den Pixel Shader Versionen sind doch recht groß, da freut man sich schon auf DirectX 9. Mir persönlich sind es jedenfalls zu viele Versionen - wozu legt man Standarts fest? Es sollte doch alles etwas einfacher für die Softwarehersteller werden - eine Pixel Shader Version pro DirectX hätte doch sicher genügt. Die Geforce 3 unterstützt PS 1.0 -1.3, diese erlauben maximal 4 Texturen pro Pixel. ATi's neue Radeon 8500 erfüllt bereits PS 1.4, welche bis zu 6 Texturen pro Pixel erlaubt. Also müssen alle PS Programme, die nicht der Version 1.4 entsprechen durch den Treiber konvertiert werden, was wiederum Performanceverluste, für die Radeon 8500, bedeuten könnte. Bei der Geforce 3 wiederum lassen sich 6 Texturen pro Pixel nur mit mehreren Durchläufen erzeugen. Das kostet ebenfalls Performance. Diese ganze Angelegenheit erschwert natürlich wieder das Benchmarken, da hier wieder ästhetische Gesichtspunkte mit in Betracht gezogen werden müssen, ähnlich wie bei FSAA. |
|||||||||||||||||||||||||||||||||||||||||||||
Pixel Shader, Vertex Shader - gibts die bei OpenGL auch?
![]() Wie man sieht, sind die DX8 Vertex Shader hier als "per-vertex programs" und die DX8 Pixel Shader als "per-pixel shading" gekennzeichnet. Die Vertex Programme benutzt man bei NVIDIA GPU's mit der NV_vertex_program Extension und bei ATI mit ATI_vertex_shader Jedoch ist bei ATI der Befehlssatz noch nicht veröffentlicht. Die Programmiersprache ist bei NVIDIA genau die gleiche, wie in DirectX 8.1. Somit sind keine Konvertierungen nötig. Bleibt zu hoffen, dass die anderen Hersteller (ST Micro, BitBoys) ähnlich verfahren. Die Pixel Shader hingegen werden unter OpenGL ähnlich ihrer realen Beschaffenheit nach angesprochen. Das diese Einheit noch weit von freier Programmierungsmöglichkeit entfernt ist, ![]() hat die OpenGL-Lösung keinerlei Nachteile. Hier unterscheidet man ganz klar zwischen NV_texture_shader, welcher für die Adressierungen der Texturen veranwortlich ist und dem NV_register_combiners der für die math. Operationen (Texture Überblendungen) verantwortlich ist. Bei ATI kommt die ATI_fragment_shader Extension zum Einsatz, bei der jew. 32 Mehrzweckregister und 32 Temp. Register zur Verfügung stehen. Deutlich mehr also, als in DirectX 8.1 vorgesehen sind. Hier sehen wir einmal einen Vergleich (NVIDIA), kein besonders guter, da die DirectX Version nur aus einem Aufruf besteht: ![]() Bleibt abzuwarten, was andere Hersteller hier für Möglichkeiten bieten. |
|||||||||||||||||||||||||||||||||||||||||||||
Die haupt Vorteile / Nachteile der jeweiligen Schnittstelle
|
|||||||||||||||||||||||||||||||||||||||||||||
Was bringt die Zukunft?
Wie es mit Verbesserungen bei DirectX 9 aussieht, ist noch nicht
ganz klar. Die entgültigen Spezifikationen stehen noch
nicht fest. Die Renderfarbtiefe wird von 8 auf 10 oder 16 Bit angehoben
und die Pixel + Vertex Shader können mehr Befehle ausführen.
Momentan laufen aber auch recht interessante Diskussionen über
OpenGL 2.0. Hierbei ist das Ziel einen Hochsprache für die Pixel
+ Vertex Shader zu entwickeln, welche hardwareunabhängig ist. Das
würde eine Vereinfachung der Programmierung bedeuten, denn assemblerähnliche
Sprachen sind nicht jedermanns Sache. Für Programme wie Lightwave,
3D Studio oder Maya wäre es einfacher, die Shader zu integrieren.Die Hardwarehersteller (nicht Microsoft ;) ) hätten endlich eine gemeinsame Basis für zukünftige Entwicklungen. Es gäbe die Möglichkeit, die Shader flexibler zu machen, oder Teile davon in Software auszulagern, um z.B. bei Multiprozessorsystemen eine optimale Lastenverteilung zu erreichen. Natürlich liegt es nicht im Interesse der Hardwarefirmen, welche Ihren Marktanteil erhöhen wollen, besonders bereitwillig mit anderen Herstellern zusammenzuarbeiten. Microsoft hat sicher auch andere Pläne, und wird versuchen OpenGL aus dem Consumer-Markt fernzuhalten. Eine weitere Möglichkeit wäre allerdings, eine gemeinsame Pixel + Vertex Shader Sprache zu entwickeln, welche in OpenGL & DirectX eingesetzt werden würde. Für die Softwareentwickler würde damit sicher ein Traum in Erfüllung gehen. Die Möglichkeiten die sich zur Zeit bieten sind wirklich riesig, denn die Zukunft liegt in den programmierbaren Shadern. Wenn wir nicht zu vergangenen Zeiten zurückkehren wollen, wo es für jede Karte eine eigene Schnittstelle (3dfx Glide, Rendition Redline, S3 Metal, ....) gab, dann ist jetzt der Zeitpunkt gekommen wo die Industrie handeln muss. Hier noch ein aktueller Link zum Thema, von id Softwares John Carmack. |