Open-GL vs. Direct3D

Transcrição

Open-GL vs. Direct3D
Universität Koblenz–Landau
Fachbereich Informatik
Open-GL vs. Direct3D
Marco Thum
Matrikelnummer 9720895
Seminar Computergraphik
betreut von Prof. Dr.-Ing. H. Giesen
Wintersemester 2000/2001
Vortrag vom 11. April 2001
INHALTSVERZEICHNIS
2
Inhaltsverzeichnis
1
Einleitung
2
OpenGL
2.1 Funktionaliät . . . . .
2.2 Architektur . . . . . .
2.3 Renderingtechnik . . .
2.3.1 Bilddarstellung
3
4
4
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
5
. 5
. 6
. 9
. 10
Direct3D
3.1 Funktionalität . . . . . .
3.2 Architektur . . . . . . .
3.2.1 Immediate Mode
3.2.2 Retained Mode .
3.3 Renderingtechnik . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
12
12
12
13
14
15
Vergleich beider Schnittstellen
4.1 Funktionalität . . . . . . .
4.2 Architektur . . . . . . . .
4.3 Renderingtechnik . . . . .
4.4 Tabellarischer Vergleich .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
16
16
17
17
17
5
Resümee
18
6
Aussichten
19
7
Quellen im Internet
21
ABBILDUNGSVERZEICHNIS
3
Abbildungsverzeichnis
1
2
3
4
5
6
7
8
9
OpenGL und zusätzliche Bibliotheken [10] . . . . .
Aufteilung des Framebuffers [10] . . . . . . . . . . .
Resultat des Codefragments (mit Fenstersystem) [10]
Renderingablauf in OpenGL [13] . . . . . . . . . . .
Bufferswapping [10] . . . . . . . . . . . . . . . . .
HAL & HEL [15] . . . . . . . . . . . . . . . . . . .
Architektur des Direct3D-Device . . . . . . . . . . .
Renderingpipeline in DirectX . . . . . . . . . . . . .
Übersicht zu Leistungen von 3D-Graphikkarten [16]
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
6
8
9
10
11
13
14
15
19
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
7
8
12
13
13
17
Tabellenverzeichnis
1
2
3
4
5
6
Befehlsfunktionen von OpenGL nach [1] .
Nomenklatur von OpenGL . . . . . . . .
DirectX7-Komponenten . . . . . . . . . .
Objekttypen in DirectDraw und Direct3D
Interfacetypen in Direct3D . . . . . . . .
OpenGL vs. Direct3D . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
4
1 EINLEITUNG
1 Einleitung
Spätestens seitdem Personal Computer neben staatlichen Einrichtungen und wissenschaftlichen Instituten Einzug in Haushalte und Kinderstuben genommen haben, dehnt sich ihr
Nutzungsbereich ständig aus. Im gleichen Verhältnis steigen auch die Ansprüche an Hard
-und Software. Inbesondere im 3D-Bereich hat sich der Markt in den 90er Jahren rapide entwickelt. Doch auch wenn derzeitige 3D-Hardware der softwareseitigen Berechnung
von großen Polygonlandschaften schon sehr viel Arbeit abnehmen kann, so sind die Grenzen solange noch nicht erreicht, bis photorealistische Welten in Echtzeit gerendert werden
können. Nun gibt es am Anfang einer jeden Entwicklung immer eine Basis, auf die aufgebaut wird. Diese Basis bilden in unserem Falle die beiden Graphikschnittstellen OpenGL
und Direct3D.
Als Graphikschnittstelle bezeichnet man ein Softwaremodul, dass nicht vorhandene
Graphikhardware zur Implementierung komplexer 3D-Szenen in 2D-Format am Bildschirm
emuliert, sich somit also zwischen Hard -und Software klinkt.
Ende der 80er Jahre hatte die auf den Bau von graphikberechnenden Servern spezialisierte Firma Silicon Graphics eine Schnittstelle namens IrisGL1 für ihre eigene Hardware
entwickelt. OpenGL als weiterentwickelte Form von IrisGL wurde später durch ein Konsortium namens ”Architecture Review Board” (ARB) implementiert. Namhafte Hersteller
wie IBM, DEC, Intel und Microsoft sind hier vertreten und zeichnen sich bis dato für Definition, Weiterentwicklung und Herausgabe offizieller Dokumente zum Standard OpenGL
aus. Von Fremdherstellern entwickelte Variationen müssen einer Konformitätsprüfung, die
auf Richtlinien der ARB basieren, unterzogen werden, um legitimiert zu sein. Trotz dieser Auflagen definiert sich OpenGL als sozusagen herstellerneutrale und damit frei verfügund erweiterbare Schnittstelle. Seine Einbindung in den Consumer-Markt hat OpenGL im
Jahre 1993 erfahren, als es von Microsoft in Windows NT implementiert wurde.
Während OpenGL als plattformunabhängiges Modul auf nahezu jedem beliebigen Betriebssystem lief und immer noch läuft, entstand im Frühjahr 1995 im Hause Microsoft
eine eigene Multimedia-Schnittstelle, die auf die speziellen Eigenschaften ihrer WindowsPlattformen ausgerichtet ist: DirectX. Die Intention des Redmonder Unternehmens war
es, zum einen die Entwickler für den Umstieg von der DOS-Ebene zur Win32-API zu
gewinnen, und zum anderen die Industrie bei der Umstellung auf ein 32Bit-System zu
neuen Innovationen zu bewegen. Den Entwicklern gab man ein umfangreiches Software
Development Kit (SDK)2 mit. Im Gegensatz zu OpenGL besitzt DirectX mehr als eine
Graphikschnittstelle, die hier in ihrer Version zur Emulierung von 2D-Graphiken DirectDraw genannt wird. Im Laufe seiner Weiterentwicklung wurden mehr und mehr Peripheriegeräte und ihre softwareseitige Unterstützung in DirectX integriert. Erst im Herbst 1996
wurde Direct3D als fester Bestandteil von DirectX und als Modul zur Emulierung von
3D-Objekten integriert.
Ziel dieser Seminararbeit war es, die verschiedenen Eigenschaften beider Graphikschnittstellen hinsichtlich Funktionalität, Architektur und Renderingtechnik vorzustellen
und im Anschluss zu vergleichen. Auf Grund dessen, dass sich Befehlsstrukturen und Programmiertechniken als sehr umfangreich zu beschreiben herausstellen, soll an dieser Stelle
nur kurz auf Syntax und Semantik eingegangen werden.
Nicht alle in der Literaturliste aufgeführeten Quellen wurden für die Seminararbeit herangezogen, vielmehr sollen sie zur Vertiefung des Themas anregen.
1 Das ”GL” steht hierbei für ”Graphics Library”, folglich eine Bibliothek von Befehlen und Algorithmen zum
Umgang mit graphisch beschreibbaren Objekten und Formen.
2 Eigentlich: Gamers Development Kit (GDK), da DirectX hauptsächlich für die Entwicklung von Spielen und
Multimedianwendungen gedacht war
5
2 OpenGL
2.1 Funktionaliät
Im eigentlichen Sinne ist OpenGL ein Application Programming Interface (API) zur Modellierung graphisch primitiver Objekte. Diese Objekte sind zwar nur zweidimensional,
doch sind die 13 darstellbaren Primitva mittels Darstellungslisten zu verknüpften, dreidimensionalen Objekten ausbaufähig. Diese Methode bezeichnet man als prozedurales Modell, genauer gesagt beschreibt OpenGL aber nicht das Aussehen eines Objekts, sondern
nur, wie es bearbeitet werden soll[1].
Seine Plattformunabhängigkeit verdankt OpenGL dem einfachen Aufbau der Befehlsbibliothek. Weder spezifische Programmierkenntnisse, noch ein spezielles Fenstersystem
werden verlangt. Die Bibliotheken sind auf jedes System portierbar und meistens auch
schon im Betriebssytemkernel verankert.
Da OpenGL an sich nur einfache graphische Objekte beschreiben kann, existieren Zusatzbibliotheken zur Erweiterung seines Befehlssatzes:
• OpenInventor
– Klassenbibliothek für den hierarchischen Aufbau von Szenen
– ereignisgesteuerte Interaktion sowie persistente Speicherung grafischer Objekte im ASCII oder Binärformat
• GLX
– Bibliothek zur Einbettung von OpenGL in das X-Windows-System (unter UNIX)
• WGL
– auch ”wiggle” genannt
– dient zur Einbettung von OpenGL unter Windows
• GLU
– ”OpenGL Utility Library”, z.B. für Matrizen, Orientierungspunkte, Projektionen, Polygonzerlegung, Oberflächenrendering
– erzeugt auch die angesprochenen Darstellungslisten
• GLUT
– ”OpenGL Utility Toolkit”; fensterunabhängig
Wie die verschiedenen Bibliotheken miteinander agieren, zeigt eine Übersicht in Abb.
1.
Weiterhin existieren von Graphikhardwareherstellern speziell optimierte Implementationen von OpenGL. Darüberhinaus sind reine Software-Emulationen vorhanden, wie etwa
die MESA-Bibliothek3 oder spezifische Betriebssystemsimplementationen.
Welche Befehlsfunktionen OpenGL innehat, zeigt Tabelle 1.
3 (http://www.mesa3d.org)
2 OPENGL
6
Abbildung 1: OpenGL und zusätzliche Bibliotheken [10]
2.2 Architektur
Um größere Szenen in relativ akzeptabler Zeit berechnen zu können, ist OpenGL auf eine
Client-Server-Architektur ausgelegt. Über ein Netzwerk wird die Anwendung oder die Anfrage an die Renderapplikation vom Client aus gestartet, der Server interpretiert dann im
folgenden die zu berechnenden Operationen. Realisiert wird dies über die Implementation
eines Fensterssystems. Intern führt OpenGL die Befehle in der vorgegebenen Reihenfolge
ihres Aufrufs aus. Dies bedeutet, dass graphische Primitiva wie Dreiecke erst vollständig
dargestellt werden, bevor weitere Aufrufe ausgeführt werden und sich das Objekt in detailliertere Form wie einen Würfel verwandelt. Dabei arbeitet OpenGL als Zustandsautomat
in folgenden Schritten [1]:
1. Ausgabe graphischer Primitive in den Bildspeicher
2. Interner Zustand bestimmt durch den Modus der Darstellung (aktueller Status der
Befehlsverarbeitung)
3. Veränderung des Status durch Befehle, dennoch keine Ausgabe des bisher gezeichneten
Die Zustandsbeschreibung erfolgt durch die Vergabe von Werten an Variablen, die in
einem Stack gespeichert werden. Ist die komplette Berechnung erfolgt, wird der Stack
ausgelesen und die Objekte gezeichnet. Die stetige Berechnung von gesamten Objekten
sorgt für deren einfachere Reproduzierbarkeit.
Hinsichtlich Hardwareanforderungen arbeitet OpenGL einerseits unabhängig von verwendeter Hardware, was bedeutet, dass es einfach von System zu System zu portieren ist,
andererseits unter Ausnutzung vorhandener Ressourcen, intensiv vor allem des Speichers.
Die minimale Speichermenge, die OpenGL fordert, ergibt sich aus folgender Gleichung:
32
640
∗ 480} ∗( |{z}
| {z
P ixel
F arbtief e
+
1
|{z}
z−Buf f er
+
1
|{z}
Stencil−Buf f er
+
4
|{z}
)Bit = 1, 4592M Byte
Akkumulationsbuf f er
OpenGL legt in einem reservierten Bereich einen Framebuffer an, in dem alle nötigen
Informationen zur Darstellung des Bildschirmbereiches gespeichert werden. Dabei wird
direkt auf vorhandene Graphikhardware zugegriffen, anstatt auf die Reserven des Hauptspeichers. Abb.2 zeigt eine grobe Aufteilung des Framebuffers.
Im Einzelnen ist der Framebuffer folgendermaßen aufgeteilt:
• Farbspeicher (Color Buffer)
2.2 Architektur
7
Befehlsgruppe
Modellierung und Darstellungslisten
Transformation
Beleuchtung und Schattierung
Clipping
Scankonvertierung
Pixeloperationen
Texturen
Framebufferoperationen
Evaluatoren
Selektion und Feedback
Steuerung und Statusabfragen
Mögliche Anwendung
Definition von Eckpunkten und
Rechtecken; Aufbau, Löschen und
Ausführen von Darstellungslisten
Festlegen von Transformationen
und Viewing; Manipulation der aktuellen Matrix
Festlegen von Farben, Lichtquellen und Materialien; Definition von
Echtfarbe- und Indexmodus; Wahl
des Beleuchtungsmodells, der Art
der Schattierung und von Nebel
Festlegung zusätzlicher Clipebenen
Wahl des Konvertierungsmodus,
von Füllmustern und Ausdehnungen, Definition von Bitmaps
Lesen, Schreiben und Kopieren von
Bildschirm- und Speicherauszügen
als Pixelmap
Definition und Mapping von einund zweidimensionalen Texturen
Steuerung der Fragmenttests, der
Auswahl von Framebufferebenen
und Maskierung der Einträge
Definition und Generierung von
Koordinaten,
Texturkoordinaten und Farben mit Hilfe von
Bezierkurven und -flächen
Kontrolle der Selektions- und Feedbackmechanismen
Aktivieren, Deaktivieren und Erfragen der Darstellungsmodi, Fehlerbehandlung und Abfrage der Statusvariablen
Tabelle 1: Befehlsfunktionen von OpenGL nach [1]
• Bildmaskenspeicher (Stencil Buffer)
• Tiefenspeicher (Depth Buffer)
• Sammelspeicher (Accumulation Buffer)
• Hilfsspeicher (Auxiliary Buffer)
Die Daten des darzustellenden Szenenauschnitts werden in ihrer kleinsten berechenbaren Einheit gespeichert: in Pixeln. Pixeldaten werden mit Farbe, Adresse und Texturkoordinaten hinterlegt. Jene ”Operationen am Fragment”[1] erleichtern jede weitergehende
Berechnung, da komplexe Objekte niemals komplett berechnet werden. Trotz dieser wirtschaftlichen Aufteilung des Speichers und der effizienten Berechnung der Bilddaten gilt
durchgängig der Leitsatz: Je besser die Hardware, desto besser die Performance.
Da sich OpenGL nur um die Interna der Graphikberechnung kümmert, also nur um
die Objekte selbst, werden die restlichen Aufgaben der Betriebssystem-API überlassen.
2 OPENGL
8
Abbildung 2: Aufteilung des Framebuffers [10]
Dazu gehören die Organisation der Buffer, die Darstellung des Bildspeichers, γ-Korrektur,
Funktionalitäten der Peripherie (Maus . . . ) etc.
Nun besteht die Frage, wie OpenGL in eigene Programme integriert werden kann. Eigentlich ist die Antwort schon gegeben. Der Entwickler muss die Header-Dateien von
OpenGL und seinen Zusatzbibliotheken einbinden, den Rest erledigt das Betriebssystem.
Wichtig zu wissen ist aber, wie Befehle aufgerufen und Variablen angesprochen werden
können. Hierzu eine kleine Übersicht zur Nomenklatur in Tabelle 2.
Konstanten
Datentypen
Methoden
Varianten für Zusatzbiblitheken
GL TRUE, GL FALSE
GLboolean
glMatrixMode()
glu..., wgl....
Tabelle 2: Nomenklatur von OpenGL
Um sich OpenGL in Aktion vorstellen zu können, folgt an dieser Stelle ein simples
Codebeispiel [10]:
glDisable(GL DEPTH TEST);
glClearColor(0.0,0.0,0.0,1.0); // setze Hintergrund
glClear(GL COLOR BUFFER BIT); // lösche Hintergrund
glMatrixMode(GL PROJECTION); // Projektionstransformationsmodus
glLoadIdentity(); // Rücksetzen auf Identität
glOrtho(0.0,1.0, 0.0,1.0, -1.0,1.0); // Orthogonalprojektion
glMatrixMode(GL MODELVIEW); // Geometrietransformationsmodus
glColor3f(0.0, 1.0, 0.0); // Malfarbe auf Grün setzen
glBegin(GL POLYGON); // Beginn Primitiv
glVertex2f(0.25,0.25); // 1. Ecke
2.3 Renderingtechnik
glVertex2f(0.75,0.25); // 2.
glVertex2f(0.75,0.75); // 3.
glVertex2f(0.25,0.75); // 4.
glEnd(); // Ende Primitiv
glFlush(); // Ausgabepipeline
9
Ecke
Ecke
Ecke
synchronisieren
SwapBuffers(m pDC->GetSafeHdc()); // Win32-spezifisch:
Buffer-Swap
Abbildung 3: Resultat des Codefragments (mit Fenstersystem) [10]
2.3 Renderingtechnik
Allgemein gesagt erstellt OpenGL ausgehend von der Geometrie der Szene eine gerenderte
Darstellung im Framebuffer, der dann auf den Bildschirm wiedergegeben wird. Jede Szene
besteht aus
Vertexdaten: die Geometrie der Szene, also die Punkte, Normalenvektoren, Linien, Polygone, Spline-Kurven und Flächen
Pixeldaten: Texturen für die Oberflächen, Schablonenmasken
Darstellungslisten: Darstellungslisten sind speziell für OpenGL vorbereitete Listen mit
Geometrie- und Texturdaten, die eine deutlich schnellere Bearbeitung ermöglichen
Diese Daten werden in verschiedenen Stufen verarbeitet. Zuerst werden darzustellende
Objekte aus Primitiva modelliert. Ein Teil derer wird anschließend zu Objekten höherer
Komplexität durch mehrfache Verwendung in unterschiedlich transformierten Zuständen
zusammengefasst. Im Anschluß werden die Objekte durch Transformation in der (virtuellen) Welt (Szene) plaziert. Sichtbarkeit und Perspektive werden durch eine gedachte
Kamera samt ihrer spezifischen Eigenschaften festgelegt. Um nicht sichtbare Flächen zu
entfernen, werden Verdeckungsrechnungen durchgeführt. Das Verfahren wird Back-FaceCulling genannt. Im nächsten Schritt wird die Szene mit festgelegten Lichtquellen beleuchtet und die daraus resultierende, farbig schattierte Darstellung der Objekte berechnet.
2 OPENGL
10
Während der nun folgenden Rasterisierung (Scankonvertierung) der Objekte und Diskretisierung der Farben wird deren visuellen Nebeneffekten durch Antialiasing, Dithering und
γ-Korrektur entgegengewirkt.
Abbildung 4: Renderingablauf in OpenGL [13]
Der Prozess des Renderns in OpenGL kann aber noch weiter spezifiziert werden. Wie
schon beschrieben, durchlaufen mehrere Vertices die Rendering-Pipeline und definieren
dabei zusammenhängend ein Primitiv, welches später in Fragmente4 rasterisiert und in den
Bildspeicher geschrieben wird. Doch können auch Funktionen die Eigenschaften der Primitive beschreiben. Hierbei werden Koordinaten und Farben auf der Basis von parametrisierten Kurven und Flächen beschrieben. Die Umwandlung in die benötigten Eckpunkte erfolgt dann durch Evaluatoren. Diese Eckpunkte werden abgespeichert und mittels Darstellungslisten wieder aufgerufen und in die Pipeline zurück geschickt. Dieser Vorgang wird
als Caching5 bezeichnet. Nach der Rasterisierung können dann erweiternde Berechnungen
von Textur, Nebel oder z-Buffer-Test erfolgen. Bemerkenswert ist dabei die Tatsache, dass
OpenGL auf Interaktion angewiesen ist. So kann der Fluss der Pipeline unterbrochen und
damit die Abarbeitung vorher definierter Befehle durch Kommandos wie glFlush oder
glFinish erzwungen werden. Die Befehle innerhalb der durch die Kommandos festgelegten Struktur werden als ein Gesamtobjekt identifiziert. Grob gesagt besitzt OpenGL also
drei Darstellungsmodi6:
• Selektion (Speicherung von Bezeichnungen)
• Rückkopplung7 (Speicherung von Objekten)
• Rendering
2.3.1 Bilddarstellung
Bekannt ist, dass OpenGL den Framebuffer verwendet, um Bildinhalte darzustellen. Um
aber z.B. Flackern bei Animationen, deren Flüssigkeit vom Prozessortakt und der Komplexität der Szene abhängig ist, zu verhindern, wird die Technik des Double Buffering
verwandt.
4 Pixel
mit Zusatzinformationen
Kap.3.2.2
6 rendering modes
7 feedback mode
5 vgl.
2.3 Renderingtechnik
11
Abbildung 5: Bufferswapping [10]
Unter der Verwendung zweier Farbpuffer wird Frame8 für Frame das folgende Bild im
Hintergrund aufgebaut (Back Buffer). Davon unabhängig ist das gerade sichtbare Bild auf
dem Bildschirm und im Front Buffer. Ist ein Bild im Back Buffer neu aufgebaut worden,
tauschen die beiden Puffer ihre Daten, und der Bildschirm erhält seinen neuen Inhalt aus
dem Front Buffer (Buffer Swapping).
8 einzelne
Szenendarstellung ohne Animation
3 DIRECT3D
12
3 Direct3D
Seit seiner Entstehung 1995 hat sich DirectX auf dem Endverbrauchermarkt zu einer fast
unverzichtbaren Multimedia-Schnittstelle entwickelt. Mittlerweile hat DirectX als ”Code
zwischen Software und Hardware”[2] die Rolle eines kleinen Betriebssystems übernommen. Microsoft ist inzwischen sogar damit beschäftigt, Lösungen für das Internet und eine
Integration in das Windows-Fensterssystem zu realisieren.
Derzeit besteht DirectX aus den Komponenten:
DirectDraw
Direct3D
DirectSound
DirectMusic
DirectPlay
DirectInput
DirectSetup
Methoden zur Darstellung von 2D-Grafiken
Methoden zur Generierung von 3D-Grafiken auf Basis von DirectDraw
Ermöglicht den Zugriff auf alle Soundfunktionen des Betriebssystems
Emuliert Midi-Instrumente
Regelt die Netzwerkkommunikation bei der Entwicklung von
Multiplayer-Spielen
Ermöglicht die Unterstützung von Eingabegeräten
Überprüft DirectX-Komponenten im Betriebssystem und installiert
nach Bedarf Updates
Tabelle 3: DirectX7-Komponenten
Im direkten Vergleich zu OpenGL steht nun Direct3D, welches ähnliche Funktionen
zur Verfügung stellt.
3.1 Funktionalität
Direct3D steht in enger Zusammenarbeit mit DirectDraw. Letzteres ist dafür verantworlich, graphische Primitive wie in OpenGL aufzubauen, die Direct3D benötigt, um 3DEffekte zu emulieren. Wie OpenGL besitzt Software über die beiden Komponenten direkten Zugriff auf den Graphikspeicher. Diese Option bleibt dem GDI9 von Windows vorbehalten.
Die Intention Microsoft’s, DirectX als eine Schnittstelle zwischen Softwareentwicklern
und Hardwareherstellern zu etablieren, gelingt dadurch, dass Entwickler in einer hardwareunabhängigen Umgebung arbeiten können. Man kann also Applikationen entwerfen, ohne die tatsächliche Hardwareausstattung zukünftiger Anwender zu kennen. Realisiert wird
dies mittels des ”Hardware Abstraction Layer” (HAL). Hierfür stellen Hardwarehersteller (software-)technische Informationen zu ihren Produkten zur Verfügung. Alle Features
von DirectX können auf diese Weise ausgenutzt werden. Auf Seiten des Anwenders kann,
um bestimmte Charakteristiken in der Peripherie festzustellen, kann eine Abfrage gestartet
werden. Sollte von der Applikation geforderte Hardware vorhanden sein, wird diese von
DirectX direkt angesteuert, ansonsten wird sie durch den ”Hardware Emulation Layer”
(HEL) emuliert.
3.2 Architektur
Zur Programmierung stellt Direct3D zwei verschiedene Modi bereit:
Immediate Mode : API auf reduziertem Niveau, durch die Entwickler ihre Applikationen
auf Windows-Systeme adaptieren können; hardwareunabhängige Programmierung,
aber dennoch Nutzung von beschleunigender Hardware; eigene 3D-Engine10 erforderlich
9 Graphic
Device Interface
zur Integration von 3D-Funktionen
10 Programmcode
3.2 Architektur
13
Abbildung 6: HAL & HEL [15]
Retained Mode : API auf hohem Niveau, durch die dem Entwickler eine schnelle Entwicklungszeit garantiert wird; Einbindung von Szenenhierarchien und Animationen
möglich
3.2.1 Immediate Mode
Im Gegensatz zu OpenGL kommt Direct3D nicht mit eigenständigen Objekten aus. Daher
baut Direct3D auf DirectDraw auf und bedient sich dessen zweidimensionaler Strukturen.
So sind die zu rendernden Flächen - wie etwa Vorder- und Rückseiten eines Objekts oder
Flächen im z-Buffer - DirectDraw-Gebilde. Zudem bearbeitet Direct3D die Modellierung
einer Szene nicht prozedural wie OpenGL, sondern arbeitet objektorientiert. Die jeder
Szene zu Grunde gelegten Objekttypen sind in Tabelle 4 aufgelistet.
DirectDraw Object
DirectDrawSurface Object
Direct3DDevice Object
Direct3DVertexBuffer Object
Tabelle 4: Objekttypen in DirectDraw und Direct3D
Hauptsächlich arbeitet Direct3D aber mit den sogenannten COM-Schnittstellen11 . Diese Interfaces sind mit jenen aus JAVA und C++ vergleichbar. Sie stellen in Programmfragmenten Methoden bereit, die aber keine Daten liefern. In der folgenden Tabelle 5 sind die
zumeist verwendeten Schnittstellen kurz vorgestellt.
IDirect3D
IDirect3DDevice
IDirect3DVertexBuffer
Grundschnittstelle, um andere Schnittstellen zu erreichen
3D-Objekt zur Programmierung von grafischen Primitiven
Schnittstelle, die Listen von Eckpunkten verwaltet
Tabelle 5: Interfacetypen in Direct3D
Da das DirectX-Entwicklungspaket ständig aktualisiert wird, muss seitens der Softwareentwickler gewährleistet werden, dass ihre Applikation neue Funktionalitäten auto11 Common
Object Models
3 DIRECT3D
14
matisch verwendet. Zur Initialisierung wird daher ein Pointer auf ein IDirect3D-Interface
gesetzt, die Hauptschnittstelle, von denen alle anderen Komponenten ”erben”12 .
Ein Direct3D-Device ist die Komponente, die später gerendert wird. Es fasst die angefallenen Daten zusammen und speichert sie. Im Folgenden durchwandert jedes Device
verschiedene Stufen der Verarbeitung, die in Abb. ?? skizziert sind, bis schließlich die
gesamte Szene in eine DirectDraw-Oberfläche (Surface) umgewandelt worden ist.
Abbildung 7: Architektur des Direct3D-Device
3.2.2 Retained Mode
Zu Zeiten, wo 3D-Graphikhardware noch zu teuer und in ihrer Performance und Funktionsvielfalt zu unausgereift war, erlaubte der Retained Mode von Direct3D die Programmierung einer vollständigen 3D-Umgebung, ohne eigene Algorithmen zur Erzeugung und
Beschleunigung implementieren zu müssen. Inzwischen wird der in Version 6.0 bestehende
Modus aber nicht mehr weiterentwickelt, da zum einen die Hardware effizienter geworden
und somit vollständig softwaregesteuertes Rendern nur noch selten nötig ist, und zum anderen die Entwickler ausgereiftere Algorithmen implementieren als die langsameren des
Retained Mode.
Um den Aufbau von Szenen zu beschreiben, werden Szenengraphen in selbige eingebettet. Diese enthalten Frames13 als Grundeinheit, an welche Geflechte14 aus Polygonen,
Lichtquellen und Kamerastandpunkten15 gebunden sind.
Wie auch der Immediate Mode arbeitet dieser mit Objekten und Interfaces. Das Interface IDirect3DRMObject gilt hierbei als übergeordnete Managment- und Erzeugerklasse
für alle anfallenden Objekte einer Szene. Von hier aus werden den Objekten Methoden
bereitgestellt für
• Devices
• Viewports
• Picking und Transforming
• Frames
• Lokale Transformationen
12 Methoden
und Attribute, die hier vereinbart sind, können auch alle anderen Klassen verwenden
unsichtbarer Punkt im 3D-Raum
14 Meshes
15 Viewports
13 leerer,
3.3 Renderingtechnik
15
3.3 Renderingtechnik
Direct3D bearbeitet die Daten einer Szene in drei verschiedenen aufeinanderfolgenden Stufen ab. Die Eingabedaten, die die Schnittstelle zu allererst und unbedingt benötigt, sind Vertices, also Eckpunkte von Polygonen. Jene Daten wandern dann durch das Transformationsmodul, welches die Eigenschaften der Szene festlegt. Die Koordinaten der Polygoneckpunkte werden in das Weltkoordinatensystem der Szene interpretiert. Danach werden die
Kameraposition und -perspektive festgelegt und danach wird eine Projektionstransformation durchgeführt, in welcher der Szene eine Tiefenwirkung beigebracht und die Objekte
im Bezug auf die Distanz zum Betrachter positioniert werden. Die bis hierhin berechneten Daten werden dann geclippt und das Ergebnis durch den Rasterisierer geschickt. Bei
der Rasterisierung werden geometrische und pixelspezifische Daten in Fragmente zerlegt.
Jedes Fragmentstück entspricht dabei einem Pixel im Framebuffer.
Abbildung 8: Renderingpipeline in DirectX
4 VERGLEICH BEIDER SCHNITTSTELLEN
16
4 Vergleich beider Schnittstellen
4.1 Funktionalität
Sowohl OpenGL als auch Direct3D16 beherrschen grundlegende Funktionen zur Erzeugung
von Objekten im zwei- und dreidimensionalen Raum. Während OpenGL aber lediglich Befehle zur Erzeugung von zweidimensionalen Fragmenten bereitstellt, die dann einzeln zu
einem dreidimensionalen Konstrukt verbunden werden, besitzt Direct3D direkte Methoden zur Erzeugung dreidimensionaler Effekte. Trotzdem bedarf es der Vorberechnung von
zweidimensionalen Strukturen durch die Komponente DirectDraw. OpenGL hat aber als
nicht ständig aktualisierte und nahezu ”openSource-ähnliche” Schnittstelle im Laufe der
Jahre einige zusätzliche Bibliotheken erhalten, die den Funktionsumfang ausbauen.
Historisch gesehen war OpenGL lange vor Direct3D auf dem Markt. Und obwohl es
nicht in dem Maße wie das Microsoft-Produkt kontinuierlich und proportional zur Hardware weiterentwickelt wird, arbeiten die meisten Entwickler hauptsächlich mit dieser Schnittstelle, da es zum einen einfacher zu handhaben und zu implementieren ist, und zum anderen
nicht auf allerneuste Graphikhardware angewiesen ist. Es arbeitet hauptsächlich mit Prozessor und Arbeitsspeicher. Zudem ist die Performance - gemessen an der Geschwindigkeit
beim Aufbau von dreidimensionalen Szenen - besser. Demgegenüber stellt das mittlerweile
in Version 8 verfügbare Direct3D cirka dreivierteljährlich neue Funktionen bereit, die die
Graphikhardware direkt ansprechen und ausnutzen. Problematisch ist aber, dass die Hardware auch vorhanden sein muss, da ansonsten der Softwarerenderer einsetzt und sowohl
Qualität als auch Performance einbrechen, obwohl die Funktionen skalierbar sind. Diese
Emulierung von Graphikkartenfeatures hingegegen beherrscht OpenGL nicht, dies muss
die 3D-Engine der Applikation übernehmen.
Hinsichtlich des Umgangs mit Szenendaten hat es OpenGL schwer. Es besitzt keine
Ein- und Ausgabefunktionalitäten zur Speicherung von Daten über die Laufzeit hinaus.
Objekte müssen stets neu gerendert werden, wenn sie benötigt werden. DirectX hingegen
besitzt ein eigenes Dateiformat zur Speicherung von Daten. Darüberhinaus stellt OpenGL
keine Funktionen bereit [7]
• zur Kommunikation mit der graphischen Benutzeroberfläche des Betriebssystems
• zum Drucken
• zum Laden externer Szenenbeschreibungen oder Geometrien
• zum Verwalten und Erstellen einer Objekthierarchie für die Szene
• zur Generierung von Objekten wie Kugeln oder Tori, die nicht aus Polygonen erstellt
werden müssen.
In DirectX sind jene Funktionen implementiert und werden darüberhinaus durch zusätzliche Module zum Umgang mit sämtlicher Peripherie ergänzt, sozusagen ist es eine einheitliche Schnittstelle für unterschiedliche Anwendungszwecke. Leider ist das Paket an Windowsplattformen gebunden und nicht für andere Betriebssysteme verfügbar. Diesen Vorteil
hat sich OpenGL verschafft. Es ist nicht nur auf beinahe allen gängigen Systemen bereits
fest implementiert, sondern wird teilweise auch von Graphikhardware und dessen Treibern
direkt unterstützt.
Trotz des umfangreicheren Funktionspakets von DirectX, ist OpenGL anwendungsnäher.
Die Header-Dateien mit der Verknüpfung zu sämtlichen notwendigen Bibliotheken muss
nur zusätzlich im Programm angegeben werden. Zur Entwicklung mit DirectX ist aber
ein separates Paket nötig, dass umfangreiche Bibliotheken, Beispiele und Dokumentationen beinhaltet. Um Programme mit DirectX-Funktionen auszuführen, ist aber lediglich ein
wesentlich minimierteres Paket von Nöten.
16 inklusive
seiner Basiskomponente DirectDraw
4.2 Architektur
17
4.2 Architektur
Der wohl wichtigste Unterschied bei der Programmierung ist, dass OpenGL prozedural
und Direct3D objektorientiert arbeitet. Beide Methoden haben ihre Vor- und Nachteile,
gleichen sich aber im wesentlichen aus. So können Objekte bei OpenGL viel übersichtlicher und konsistenter erstellt werden, DirectX speichert objektspezifische Daten auch als
Attribute dieses Objekts ab und sind demnach nur durch separaten Aufruf verfügbar. Zudem können einmal angefallene Daten persistent gespeichert werden, was natürlich deren
Wiederverwendbarkeit erleichtert. Das objektorientierte Programmieren und die ständig
wachsende Funktionsvielfalt von DirectX verkompliziert aber den Einstieg. Es sind wesentlich mehr Schritte nötig, um ein einfaches, akzeptables Ergebnis zu erhalten. OpenGL’s
Modell hingegen kann sehr schnell implementiert werden, ohne dass größere Kenntnisse
der API erforderlich sind.
Auffällig ist, dass OpenGL seit seiner Entwicklung zwar nicht viele Neuerungen erfahren hat, dennoch immer noch noch auf dem Stand der Zeit ist. DirectX respektive
Direct3D als jüngere Schnittstelle wurde vielfach umstrukturiert und erweitert, gleichsam
mit dem Entwicklungsstand der Hardware. Da die Graphikchips viele Renderingtechniken übernommen haben und Entwickler demnach hardwareorientierter arbeiten können, ist
inzwischen auch der Retainded Mode, mit dem einstmals komplette 3D-Engines erstellt
wurden, veraltet. Demnach ist OpenGL viel unabhängiger und bedarf nicht so intensiver
Pflege.
4.3 Renderingtechnik
Im Wesentlichen unterscheiden sich die Rendermethoden der beiden Schnittstellen nicht.
Auf eine bestimme Menge an groben Polygondaten werden Transformationen, Beleuchtungsund Texturoperationen angewandt, die schließlich rasterisiert und zuletzt im Graphikspeicher abgelegt werden. Seitens Direct3D können die Daten aber umfangreicher manipuliert
werden, in OpenGL muss dies die Engine des Entwicklers übernehmen.
4.4 Tabellarischer Vergleich
Vorteile
OpenGL
hardware- und systemunabhängig
anwendungsnäher als Direct3D
schnelle Performance durch prozedurale Objektgenerierung
einfache Programmierung
Nachteile
keine Kommunikation mit GUI
keine Ein- und Ausgabefunktionalität
keine Szenenhierarchie
keine Emulation von neuen Grafikkartenfeatures
Probleme mit nicht-polygonalen
Objekten
Direct3D
multidimensionale
Schnittstelle
durch Einbindung in DirectX
eigenes Dateiformat
im Retained Mode Aufbau einer
Szenenhierachie
Softwareemulation von Hardwarefeatures
auf
Windowsplattformen
beschränkt
im Retained Mode component calling overhead
Überlastung durch COM-Objekte
Performanceeinbußen durch Emulation und Zugriffe auf Registry
Tabelle 6: OpenGL vs. Direct3D
5 RESÜMEE
18
5 Resümee
In dieser Seminararbeit galt es nicht, eine einzelne Schnittstelle als die herausragendste
herauszustellen, sondern vielmehr Unterschiede, Vorzüge und Nachteile kenntlich zu machen, sowie ihre Funktionalität vorzustellen. Dennoch soll an dieser Stelle festgemacht
werden, welche Schnittstelle sich zu welchem Zweck am besten eignet und welches die
ausschlaggebenden Kriterien dafür sind.
Aus der Perspektive des Entwicklers ist diejenige Schnittstelle die erste Wahl, die
in Kombination mit aktueller Graphikhardware die beste Performance erbringt und zugleich einfach zu handhaben ist. Zudem muss abgeschätzt werden, auf welchen Systemen die Software zum Einsatz kommen soll. Direct3D ist hier auf Windows-Plattformen
beschränkt, OpenGL auf allen Systemen anwendbar. Wird OpenGL hardwaremäßig unterstützt, erhält man auch auf ”langsameren”17 Systemen gute Resultate, Direct3D hingegen benötigt bei anspruchsvoller Software immer auch schnelle Hardware, besonders dann,
wenn bestimmte Funktionen emuliert werden müssen. Hinsichtlich der Handhabbarkeit ist
die Struktur von OpenGL eindeutig leichtgängiger als die von Direct3D, nicht zuletzt, weil
es zu OpenGL mehr einschlägige anerkannte Literatur gibt. Schließlich muss der Entwickler Prioritäten setzen und daran die Wahl der Schnittstelle festmachen.
Wissenschaftlich betrachtet, ist OpenGL die eindeutig priorisierte Schnittstelle bei Erstellung und Rendering von dreidimensionalen Umgebungen, denn Direct3D ist zum einen
sehr undurchsichtig und zum anderen rein kommerzieller Natur. OpenGL genießt daher
auch einen sehr hohen Stellenwert bei der Diskussion um die Einbindung von computergraphischen Erkenntnissen, sowie in Bildung und Lehre.
Anzumerken ist noch, dass frei zugängliche Literatur nur für OpenGL ausreichend
vorhanden ist, seien es Tutorien, Grundlagen oder komplette Beschreibungen. Da die
Schnittstelle bereits seit längerer Zeit existiert, finden sich vor allem im Internet viele Quellen. Auch haben sich inzwischen einige ”Standardwerke” (u.a.[3],[4],[5],[8],[14],[12]) hervorgehoben. Standardliteratur zu Direct3D hingegen existiert kaum, denn das zugeörige
DirectX-Paket wird ständig weiterentwickelt und bildet selten eine Grundlage für wissenschaftliche Untersuchungen. Leider existiert auch kein Konsortium, dass gewisse Normierungen vornimmt und die Schnittstelle standarisiert.
17 abhängig
von den Anforderungen der Software
19
6 Aussichten
Grundsätzlich muss man erst den Markt für die beiden Schnittstellen analysieren, um herauszufinden, welche Zukunft ihnen bevorsteht. Obwohl OpenGL bereits fest in Betriebssysteme und in Treiber und Komponenten von Graphikkarten integriert ist, selbst aber nicht
stark weiterentwickelt wird, bleiben die Anforderungen und somit der Markt beständig.
Die Grundlage zur Generierung dreidimensionaler Objekte ist vorhanden und muss nicht
zwangsweise ausgebaut werden, da Softwareentwickler (insbes. Spieleentwickler) und
Hardwarehersteller eigene Unternehmungen hierzu anstreben. Neuere Graphikkartengenerationen wie PowerVR’s Kyro II, NVidias Geforce3 oder ATI’s Radeon II integrieren Techniken wie ”Truform”18, ”Tile Based Rendering”19, ”Trilineare Filterung” oder ”Mipmaps”
und bieten teilweise eine T&L-Komponente20, die dem Renderingvorgang der Schnittstelle
bei der Verarbeitung von Transformations- und Beleuchtungsaufgaben behilflich ist. Ihre
Effizienz ermittelt man hierbei mittels Frameraten21 in Benchmarks bzw. Spielen. Insbesondere bei der Spieleentwicklung, bei der sehr hohe Datenmengen anfallen, kommen
diese Techniken zum Einsatz. Desweiteren versuchen die Hersteller, neuere Direct3DTechnologien seitens der Hardware selbst und auch der Treiber zu unterstützen, um somit
einerseits die Technolgien ausreizend verwendbar zu machen und andererseits die Entwickler auf ihre Seite zu bringen.
Abbildung 9: Übersicht zu Leistungen von 3D-Graphikkarten [16]
Von diesen Entwicklungen fast unbeeindruckt zeigt sich der Markt für die professionellen Anwender, die spezielle Karten zum Rendern mit professioneller Software wie AutoCAD, 3D Studio MAX oder dergleichen benötigen22. Fast ausschließlich wird mit OpenGL
gerendert, die Treiber der Hardware sind hierauf spezialisiert. Auch werden Hardware und
Treiber genaustens auf die anzuwendende Software abgestimmt, Zusatzbibliotheken wie
OpenInventor von OpenGL mit integriert und zusätzliche Techniken wie ”Overlay unified
18 von ATI entwickelt; Erhöhung der Polygonanzahl, um Objekten abgerundete Formen zu geben; in DirectX8
als ”High-Order-Surfaces” eingeführt[17]
19 Verfahren zur Reduzierung von Speicherzugriffen
20 Transform & Lightning
21 Bildaufbau pro Sekunde
22 allgemein: ”Digital Content Creation”
20
6 AUSSICHTEN
Backbuffer” oder ”Realtime Fog/Blending” integriert. Direct3D hat in diesem Bereich
nicht sehr viel Einfluss, denn es ist hier langsamer als OpenGL und bedarf softwareseitig
mehr Pflege.
Ein Ende der Neuentwicklungen ist lange nicht in Sicht. Inzwischen wechseln Generation und Leistung in dieser Branche schneller als die Taktraten im Prozessorbereich.
Das Ziel wird es ständig sein, Szenen und Animationen noch schneller, plastischer und
photorealistischer zu rendern.
Zuletzt sei bemerkt, dass OpenGL und Direct3D ”nur” Schnittstellen sind, die dem
Entwickler viel Arbeit abnehmen können und den Zugriff auf die Hardware erleichtern.
Eigentliche Algorithmen zur Erstellung und Beschleunigung von Grafiken sowie die Nutzung von Techniken, die Schnittstellen und Hardware noch nicht besitzen, müssen aber
selbst implementiert werden. Da sich OpenGL und Direct3D inzwischen auf dem Markt
durchgesetzt haben, haben es Neuentwicklungen schwer. Zwischenzeitlich hatte der Graphikkartenhersteller 3DFX seine auf eigene Karten (VooDoo) zugeschnittene Schnittstelle
Glide auf dem Markt, wegen schlechtem Absatz sich aber nicht weiterentwickelt hat.
21
7 Quellen im Internet
• Benchmarks
– FOGCITY (TIRTANIUM) D3D/OPEN GL by Michael Tirtasana
∗ http://viswiz.gmd.de/ mic/prog3d.html
– 3DMark 2001
∗ http://www.madonion.com
• Offizielles
– Microsoft DirectX: Platform SDK, Overview & Documentation
∗ http://msdn.microsoft.com/library
– OpenGL Extension Specifications
∗ http://oss.sgi.com/projects/ogl-sample/registry/
– Silicon Graphics Homepage
∗ http://www.sgi.com/
– Silicon Graphics/OpenGL WWW Center
∗ http://www.sgi.com/Technology/openGL/
– Offizielle Ressourcen zu OpenGL
∗ http://www.opengl.org
• Tutorials
– Jackie Neider, Tom Davis & Mason Woo, OpenGL Programming Guide or
”The Red Book”, Addison-Wesley, 1993
∗ http://arctic.eng.iastate.edu:88/SGI Developer/OpenGL PG
– Jeff ’NeHe’ Molofee, Nehe Productions OpenGL Tutorials
∗ http://nehe.gamedev.net
• Sonstiges
– Philip Kaufmann, PE OpenGL Extensions
∗ http://www.t-online.de/home/Phil.Kaufmann/main.htm
– Informationen zu 3D-Beschleunigern
∗ http://www.cs.columbia.edu/ bm/3dcards/3d-cards1.html
22
LITERATUR
Literatur
[1] Ute Claussen, Programmieren mit OpenGL - 3D-Grafik und Bildverarbeitung,
Springer-Verlag, 1997
[2] Rob Glidden, Graphics Programming with Direct3D - Techniques and Concepts,
Addison-Wesley Developers Press, 1997
[3] Mark J. Kilgard, All About OpenGL Extensions,including specifications
for some significant OpenGL extensions, Papersheet, NVIDIA Corporation,
http://reality.sgi.com/employees/mjk asd/home.html
[4] Mark J. Kilgard, OpenGL Programming for the X Window System, Addison-Wesley,
http://reality.sgi.com/employees/mjk asd/home.html
[5] Mark J. Kilgard,
The OpenGL Utility Toolkit(GLUT)Programming
Interface
API
Version
3,
Silicon
Graphics,
Inc.,
1996,
http://reality.sgi.com/employees/mjk asd/home.html
[6] The OpenGL Machine, The OpenGL graphics system diagram, Version 1.1, Silicon
Graphics, Inc., 1996
[7] Jens-Peer Kuska, Graphik-Programmierung mit OpenGL, Juli 2000
[8] Mark J. Kilgard, The OpenGL Utility Toolkit(GLUT)Programming Interface API
Version 3, Silicon Graphics, Inc., 1996
[9] NVIDIA Corporation, NVIDIA OpenGL Extension Specifications, 2000
[10] Dr. Jürgen Döllner, Einführung in die Computergraphik, hier: Kapitel 2: Graphikprogrammierung mit OpenGL, Universität Münster, WS 2000/2001, [email protected]
[11] Dave Horne, DirectX8 Graphics Overview, Technical Developer Relations, NVidia
Corporation
[12] Richard S. Wright & Michael Sweet, OpenGL SuperBible
[13] Mark Segal & Kurt Akeley, The OpenGL Graphics System: A Specifcation (Version
1.2.1), Silicon Graphics, 1999
[14] Jackie
Neider,
Tom
Davis
&
Mason
Woo,
OpenGL
Programming Guide
or
”The
Red
Book”,
Addison-Wesley,
1993
http://arctic.eng.iastate.edu:88/SGI Developer/OpenGL PG
[15] Matthias Merz, Seminararbeit ”Spieleprogrammierung”, betreut von den
Professoren Prof. Kaufmann u. Prof. Scheer, FH Gießen Friedberg, 1999,
http://www.hausarbeiten.de/archiv/informatik/infospiele/info-spiele.shtml
[16] Manfred Bertuch: 3D-Flaschenhälse, aus: c’t, Magazin für Computertechnik, Heise
Verlag, 12/2001, S.160
[17] c’t, Magazin für Computertechnik, Heise Verlag, 09/2001, S.32

Documentos relacionados