3 3D – Grafik mit Direct 3D

Werbung
Softwareentwicklung mit DirectX 9
Ein
Seminarvortrag
von
Michael Kreutzer
(Mtr.Nr. 659 231)
Informatik (TWA)
Sommersemester 2004
Betreuung
Prof. Dr. rer. nat. Erdmuthe Meyer zu Bexten
Seminarvortrag „DirectX 9“
Michael Kreutzer, FH-Gießen Friedberg
Inhalt
Die DirectX Software – Schnittstelle ..................................................................... 3
1.1 Was ist DirectX? ............................................................................................. 3
1.2 Wozu dient DirectX? ....................................................................................... 3
1.3 Was kann DirectX? ......................................................................................... 3
1.4 Unterstützung der Hardwarehersteller ............................................................ 4
1.5 DirectX Komponenten..................................................................................... 4
1.5.1 DirectX Graphics....................................................................................... 4
1.5.2 DirectX Audio ............................................................................................ 4
1.5.3 Direct Input ............................................................................................... 5
1.5.4 Direct Play ................................................................................................ 5
1.5.5 Direct Show .............................................................................................. 5
1.5.6 Direct Setup .............................................................................................. 5
2 Einbettung in die Windows – Architektur .............................................................. 5
3 3D – Grafik mit Direct 3D ...................................................................................... 6
3.1.1 Darstellung einer 3D Szene mit Direct 3D ................................................ 7
3.2 Direct 3D Immediate Mode und Retained Mode ............................................. 9
3.2.1 Immediate Mode im Detail ...................................................................... 10
3.2.2 Der Direct 3D Rasterizer ......................................................................... 11
3.2.3 Direct 3D Renderstates .......................................................................... 11
3.2.4 Direct 3D Ressourcen............................................................................. 12
3.2.5 Direct 3D Z - und Stencil – Buffer ........................................................... 12
3.2.6 Direct 3D Texturen.................................................................................. 12
3.2.7 Beleuchtung ............................................................................................ 13
3.2.8 Direct 3D Effekte..................................................................................... 15
4 Klangerzeugung mit Direct Sound ...................................................................... 18
4.1 Direct Sound Mixer und Soundpuffer ............................................................ 19
4.2 Direct Sound Schnittstellen ........................................................................... 19
4.3 Eigenschaften der Soundpuffer .................................................................... 19
4.4 3D Sound...................................................................................................... 20
4.4.1
Die IDirectSound3Dlistener8 – Schnitstelle ............................................ 21
4.5 Direct Sound Echtzeiteffekte ........................................................................ 22
5 Verwaltung von Eingabegeräten mit Direct Input................................................ 23
5.1 Schnittstellen für Direct Input ........................................................................ 23
6 Zusammenfassung ............................................................................................. 24
7 Anhang.............................................................................................................. 25
7.1 Abbildungsverzeichnis ................................................................................... 25
7.2 Literatur ......................................................................................................... 25
1
2
Michael Kreutzer, FH-Gießen Friedberg
Seminarvortrag „DirectX 9“
1 Die DirectX Software – Schnittstelle
1.1
Was ist DirectX?
DirectX ist eine von der Firma Microsoft entwickelte Softwareschnittstelle, also ein
sogenanntes Application Interface (API). Diese Schnittstelle soll dem Programmierer
eine Möglichkeit des einheitlichen Zugriffs auf Multimedia - Hardwarekomponenten eines
Rechnersystems mit dem Betriebssystem Microsoft Windows ermöglichen. DirectX stellt
also eine zusätzliche Softwareschicht zwischen einer Anwendung und den
Gerätetreibern der Hardware dar. Im Idealfall kann ein Programmierer die in einem PC
eingebauten Geräte über eine einheitliche Schnittstelle ansprechen und muss sich nur in
geringem Maße um gerätespezifische Einzelheiten kümmern. Die Entwicklung von
multimedialer Software wird also stark vereinfacht.
1.2
Wozu dient DirectX?
DirectX wurde 1996 erstmals von Microsoft für Windows 95 bereitgestellt. Zu dieser Zeit
kamen erste brauchbare Zusatzgeräte für Multimediaanwendungen auf den Markt.
Insbesondere die ersten Grafikkarten mit Prozessoren für die hardwareunterstützte
Berechnung von animierten 3D Grafiken (hauptsächlich im Bereich der
Spielesentwicklung). Vor der Einführung von DirectX und OpenGL gab es sehr viele
Anwendungsinterfaces für 3D Grafik, beinahe eine für jeden Grafikkartenhersteller.
DirectX stellt eine zusätzliche Softwareebene zwischen Programmierer und Hardware
bereit, ermöglicht gleichzeitig aber nahezu ungebremsten Zugriff auf die Hardware.
Neben
Grafikgeräten
werden
auch
Soundgeräte,
Eingabegeräte
und
Netzwerkkommunikation integriert.
1.3
Was kann DirectX?
DirectX bietet den heutigen Entwicklern prinzipiell alles, was sie benötigen um
multimediale
Anwendungen
umzusetzen.
Dazu
gehören
hochwertige
,
hardwarebeschleunigte 3D – Grafik ebenso wie brillanter 3D Sound, 3D Musik, sowie die
Ansteuerung aller Arten von Eingabegeräten (Tastatur, Maus, Joystick, Lenkrad,
Gamepads etc.).
Darüber hinaus bietet DirectX Netzwerkunterstützung, sowie die Möglichkeit der
Medienwiedergabe. Audio und Videomedien, z.B. MP3-Dateien oder DVDs, können
unter Einbindung der hardwaretechnischen Möglichkeiten von Grafik- und Soundkarten
wiedergegeben werden.
Der Programmierer muss sich bei der Entwicklung seiner Anwendungen nur wenig um
eventuell im System eingebaute Hardware kümmern. DirectX bietet ihm eine einheitliche
Schnittstelle. DirectX – Funktionen, die nicht durch die Hardware unterstützt werden,
können in den meisten Fällen von DirectX unter Belastung des Hauptprozessors
softwareemuliert werden. In der Regel wird dann immer noch ein akzeptables
Endergebnis erzielt.
3
Michael Kreutzer, FH-Gießen Friedberg
1.4
Seminarvortrag „DirectX 9“
Unterstützung der Hardwarehersteller
Die Hersteller von Multimediageräten unterstützen die DirectX – Schnittstelle sehr gut
und liefern fast immer moderne, aktuelle und oft auch für DirectX optimierte Treiber für
ihre Geräte. Im Gegenzug sorgt die Firma Microsoft dafür, dass aktuelle
Hardwareneuerungen möglichst schnell in die DirectX Schnittstelle integriert werden.
Erwähnenswert ist, dass DirectX auch die Multimediabefehlssätze aktueller
Hauptprozessoren (CPUs), wie SSE2 beim Pentium 4 Prozessor oder die 3D Now
Technologie der AMD Prozessoren, unterstützt.
1.5
DirectX Komponenten
Im Gegensatz zu OpenGL bedient DirectX - wie bereits angedeutet - nicht nur die
Unterstützung von Grafikgeräten, sondern versucht, im Rahmen des Möglichen, auch
alle anderen Multimediakomponenten zu unterstützen. Dazu ist die Schnittstelle in
unterschiedliche Softwarekomponenten aufgeteilt.
1.5.1 DirectX Graphics
Direct 3D ist die Grafikkomponente von DirectX. Im Widerspruch zu dem Namen Direct
3D werden von dieser Komponente nicht nur 3D Grafikanwendungen unterstützt,
sondern (seit DirectX Version 8) auch die 2D – Anwendungen bedient. Die Komponente
DirectDraw, die früher für 2D Grafik zuständig war, wurde in Direct3D eingebettet, da aus
technischer Sicht 2D Grafik nur ein untergeordneter Bereich der 3D Grafik ist.
Ansonsten sorg Direct 3D für eine äußerst effiziente und brillante Grafikdarstellung. Der
Programmierer muss sich beinahe nur noch um den geometrische Darstellung einer 3D
– Szene kümmern. Um die Beleuchtung einer 3D Szene beispielsweise, kümmert sich
Direct 3D, nach der Definition der Lichtquellen, selbst. In der Regel können alle
hardwarebeschleunigten Effekte eines Grafikadapters über Direct 3D angesprochen und
verwendet werden.
1.5.2 DirectX Audio
Unter DirectX Audio versteht man die DirectX Komponenten DirectSound und
DirectMusic. Während DirectMusic für die Wiedergabe von Musik, z.B. oder MIDIDateien zuständig ist, sorgt DirectSound für ein großes Repertoire an ansprechenden
Soundeffekten.
DirectSound ermöglicht eine der Realität äußerst nahe, virtuelle 3D Sound Emulation.
Dazu wird der virtuelle Kopf eines Zuhörers im Raum simuliert. Alle Geräuschquellen im
virtuellen Raum wird eine Position und eine Geschwindigkeit zugeordnet. Der virtuelle
Zuhörer hat ebenfalls eine Position und Geschwindigkeit, sowie eine Ausrichtung in der
3D Szene. Auf der Grundlage dieser Daten simuliert DirectSound mittels den Gesetzen
der Physik die Realität auf äußerst eindrucksvolle Art und Weise. Die Soundausgabe
kann, eine entsprechende Soundkarte vorausgesetzt, auch über eine Surround
Lautsprecheranlage erfolgen, was eine Szene im dreidimensionalen Schallraum noch
realitätsnäher erscheinen lässt.
Des weiteren können auch Sounds z.B. per Mikrofon aufgenommen werden und in
Echtzeit von DirectSound verarbeitet und wieder ausgegeben werden. DirectSound nutzt
für Echtzeiteffekte den digitalen Signalprozessor der Soundkarte. Ist dieser nicht
4
Michael Kreutzer, FH-Gießen Friedberg
Seminarvortrag „DirectX 9“
vorhanden, wird ein Signalprozessor über die CPU des Computers simuliert.
Interessante Effekte wie Hall, Echo, Chorus und vieles mehr sind möglich.
1.5.3 Direct Input
Direct Input bedient, wie der Name schon sagt, alle möglichen, an einen Computer
angeschlossene Eingabegeräte. Dazu gehören nicht nur Tastatur und Maus, sondern
auch exotischere Eingabegeräte wie Flightsticks, Gamepads, Lenkräder, Trackballs usw.
Direct Input ist in der Hauptsache zur Abfrage der Benutzereingaben bei Spielen
ausgelegt. Die Reaktionszeit bei Abfragen von Tastatur, Maus oder anderen
Eingabegeräten ist wesentlich kürzer als die der Windows API – Funktionen.
Auch interaktive Eingabegeräte, z.B. Forcefeedback – Joysticks, bei denen eine
Kraftrückkopplung zum Bediener realisiert ist, können von Direct Input angesprochen
werden.
1.5.4 Direct Play
Direct Play wurde entwickelt um Computerspiele netzwerkfähig zu machen. Es
erleichtert die Entwicklung von Multiplayerspielen und bietet auch für andere
Anwendungen interessante Möglichkeiten. Beispielsweise verfügt Direct Play über eine
eingebaute Voice-Chat Funktion. Mittels dieser Funktion ist es möglich über Mikrofon
und Lautsprecher mit anderen Personen in einem Netzwerk zu kommunizieren. Die Art
des verwendeten Netzwerks (LAN, Internet, Telefonleitung, usw.) spielt für den
Anwendungsprogrammierer keine Rolle. Er kann Direkt Play immer auf gleiche Art und
Weise ansprechen.
1.5.5 Direct Show
Die Komponente Direct Show dient
zur Wiedergabe von Multimediainhalten,
beispielsweise MpEG – Video oder MP3 – Audio. Auch das Ansprechen externer
Multimediageräte, zum Beispiel Kameras ist damit sehr leicht möglich. Sogar das
Abspielen von DVDs ist mit DirectShow möglich.
1.5.6 Direct Setup
Direct Setup ermöglicht die Installation von DirectX als Zusatz einer normalen
Programminstallation.
2 Einbettung in die Windows – Architektur
DirectX ist quasi ein Add-On für Windows. Es kann von den Internetseiten der Firma
Microsoft kostenlos bezogen werden und als Erweiterung für fast alle Windowsversionen
installiert werden.
Zum Betrieb auf DirectX basierender Anwendungen benötigt man eine DirectX Laufzeit
Installation, die sogenannte DirectX Runtime Environment.
Den Programmierern solcher Anwendungen bietet Microsoft, ebenfalls kostenlos, ein
speziellen DirectX Entwicklungspaket, das DirectX Software Development Kit (SDK). Es
5
Michael Kreutzer, FH-Gießen Friedberg
Seminarvortrag „DirectX 9“
enthält neben den Laufzeitbibliotheken (DLLs) die zur Compilation einer DirectXAnwendung benötigten Compilerbibliotheken und Headerdateien, sowie eine sehr
ausführliche Entwicklerdokumentation. Unterstützt werden vom DirectX SDK zur Zeit im
Wesentlichen drei Programmiersprachen: C++, C# und Microsofts Visual Basic.
Neben Dokumentationen und Compilererweiterungen sind liegen nach der Installation
des DirectX SDKs einige weitere nützliche Tools vor. Sie dienen der Prüfung und
Konfiguration der DirectX Laufzeitkomponenten, dem Debuggen von DirectX
Anwendungen, sowie der Konvertierung von z.B. Grafikdatenformaten in ein DirectX
verständliches Format.
Die DirectX – Funktionsbibliothek baut auf dem sogenannten COM (Component Object
Model) auf. Dieses Software – Modell ermöglicht die übersichtliche Organisation großer
Funktionsmengen, welche durch DirectX zur Verfügung gestellt werden.
Das COM ist ein sehr kompliziertes Modell und nicht gerade Anwenderfreundlich.
Glücklicherweise kommt man als DirectX – Entwickler nur relativ selten damit in Kontakt.
Das COM fordert die Aufteilung eines Programms in Schnittstellen, von denen jede einen
gewissen Aufgabenbereicht abdeckt. Letztendlich ist eine solche COM-Schnittstelle
nichts anderes als eine C++ Klasse, die keine sichtbaren Variablen enthält.
Um in einer Anwendung Zugriff, auf DirectX Komponenten zu erhalten, fordert man bei
Windows einen Zeiger auf die Basisschnittstelle von DirectX an. Alle weiteren DirectX
Schnittstellen sind hierarchisch der Basisschnittstelle untergeordnet und könne über
diese angesprochen werden.
3 3D – Grafik mit Direct 3D
Was ist Direct3D?
Direct 3D ist die Komponente von DirectX, die sich der Darstellung dreidimensionaler
Computergrafik widmet. Direct 3D vermittelt dabei zwischen einer Anwendung und der in
einem Computersystem eingebauten Grafikkarte. Es sorgt dafür, dass unterschiedliche
Grafikadapter auf die gleiche Art und Weise angesprochen werden können. Dazu nimmt
Direct 3D Anweisungen einer Anwendung entgegen und setzt sie in eine, für den Treiber
des jeweiligen Grafikadapters, verständliche Form um.
Darüber hinaus stellt Direct 3D eine umfangreiche Funktionsbibliothek für die
Programmierung von 3D – Grafikanwendungen bereit. Dem Entwickler einer solchen
Anwendung wird seine Arbeit dadurch wesentlich erleichtert.
6
Michael Kreutzer, FH-Gießen Friedberg
Seminarvortrag „DirectX 9“
Abb. 1: Einbettung von Direct X in die Windows-Architektur
Das obige Schema (Abbildung 1) beschreibt die Einbettung der Direct 3D Schnittstelle in
das Betriebssystem Windows. Eine Windows-Applikation kann auf die Direct 3D
Schnittstelle zugreifen und deren Funktionsumfang nutzen. Direct 3D setzt die von der
Anwendung empfangenen Funktionsaufrufe in Befehle für den Hardware Abstraktion
Layer (HAL) um. Auf dem HAL bietet der Treiber der Grafikkarte eine gewisse
Funktionalität an. Alle von der Hardware unterstützten Grafikoperationen können über
diese Ebene angesprochen werden. Grafikoperationen, die vom Grafikadapter nicht
umgesetzt werden können, werden zur Hardware Emulation weitergeleitet. Dort wird die
gewünschte Operation mithilfe des Hauptprozessors (CPU) des Computersystems
emuliert und über herkömmlichen Wege in den Bildpuffer, der Grafikkarte übertragen um
auf den Bildschirm projiziert zu werden.
3.1.1 Darstellung einer 3D Szene mit Direct 3D
Um mit Direct 3D eine dreidimensionale Szene auf den Bildschirm des Computers zu
projizieren, ist nur ein relativ geringer Aufwand erforderlich.
Direct 3D übernimmt beinahe alle Arbeitsschritte, die zur Projektion einer Szene
erforderlich sind. Sogar die komplexe Berechnung der Beleuchtung einer Szene wird von
Direct 3D übernommen. Die zur Bilderzeugung erforderliche Physik und Mathematik
wird, soweit dies möglich ist, vom Programmierer fern gehalten. Dieser muss Direct 3D
lediglich die Geometrie und die Oberflächenstrukturen der 3D Objekte beschreiben.
Um eine einfache 3D Szene auf den Bildschirm zu bringen sind im Groben folgende
Schritte notwendig:
1. Direct 3D initialisieren und die gewünschten Grundeinstellungen vornehmen.
2. Es muss ein virtuelles Auge, eine sogenannte Kamera, beschrieben werden. Die
virtuelle Kamera hat eine Position und eine Blickrichtung in einer 3D Szene. Außerdem
7
Michael Kreutzer, FH-Gießen Friedberg
Seminarvortrag „DirectX 9“
muss der Öffnungswinkel des Objektivs definiert werden. Ihr Standort befindet sich
beispielsweise am Rand einer Szene mit Blick auf das Geschehen. Die von der Kamera
eingefangene Perspektive wird auf dem Bildschirm abgebildet.
3.
Die
Positionen,
Oberflächenbeschaffenheiten
(Texturinformationen)
und
Geometriedaten, der in einer Szene darzustellenden 3D – Objekte müssen an Direct 3D
übermittelt werden.
4. Die Zahl und Art der für die Beleuchtung der Szene angedachten Lichtquellen muss
festgelegt und Direct 3D mitgeteilt werden.
Aus der obigen Darstellung ist deutlich zu entnehmen, dass der Programmierer sich auf
eine Beschreibung des Darzustellenden konzentrieren kann. Um technische Details wie
das Ansprechen eines speziellen Grafikkartentreibers oder die Projektion der 3D Szene
auf den 2D – Bildschirm muss er sich nur in Ausnahmefällen kümmern.
Abb. 2:Kamera in einer 3D – Szene
8
Michael Kreutzer, FH-Gießen Friedberg
3.2
Seminarvortrag „DirectX 9“
Direct 3D Immediate Mode und Retained Mode
Abb. 3: Immediate und Retained Mode
Direct 3D stellt dem Programmierer zwei grundlegende Schnittstellen für die Entwicklung
von Grafikanwendungen zur Verfügung.
Der Immediate Mode:
Diese Schnittstelle verwaltet die hardwarenahen Features von 3D Grafikadaptern. Dazu
gehören die Projektion von Polygonen in den Bildspeicher und das überziehen der
Polygone mit 2D Bildern, das sogenannte Texture Mapping. Auch Schattieren einer
Szene (Shading) bei Beleuchtungseffekten, wird über diese Schnittstelle realisiert.
Direct 3D versucht den Anwendungen im Immediate Mode einen virtuellen
Grafikprozessor bereitzustellen. Es kann dabei vorkommen, dass eine Funktion des
virtuellen Grafikprozessors vom Prozessor des Grafikadapters nicht unterstützt wird. In
diesem Fall wird die fehlende Funktionalität vom Direct 3D über den Hauptprozessor
emuliert (Softwareemulation).
Der Retained Mode:
Diese Direct 3D Schnittstelle arbeitet auf einem wesentlich höheren Abstraktionslevel als
die Immediate Mode – Schnittstelle.
Der Retained Mode stellt eine komfortable 3D Rendering Engine dar. Mit ihr ist es
möglich komplette 3D Szenen aus Dateien zu laden und in Echtzeit zu animieren. Die
Szenen selbst können mit recht leistungsstarken und komfortablen 3D
9
Michael Kreutzer, FH-Gießen Friedberg
Seminarvortrag „DirectX 9“
Grafikprogrammen, beispielsweise das in der Spieleindustrie häufig verwendete 3D
Studio Max, erstellt werden.
Bei nicht allzu speziellen oder komplexe 3D Anwendungen (meist Computerspiele)
erspart der Retained Mode dem Softwareentwickler den Kauf oder gar die
Eigenproduktion einer teuren, aufwendigen 3D Rendering Engine. Trotz dieses Vorteils
wird in Büchern zu DirectX 9 selten der Gebrauch dieser Schnittstelle eingehend
beschrieben. Stattdessen wird die Entwicklung eigener 3D Engines beschrieben. Das
deutet darauf hin, das die Retained Schnittstelle (als 3D Rendering Engine) noch nicht
für alle in der Praxis anfallenden Probleme geeignet ist und Entwickler nach wie vor
selbst diese schwierige Kunst beherrschen müssen. Auf dem freien Markt kann man 3D
Engines für spezielle Anwendungen käuflich erwerben, beispielsweise Engines zur
Entwicklung von Flugsimulationsspielen.
3.2.1 Immediate Mode im Detail
Der Immediate Mode besteht aus lediglich 3 COM – Objekten:
IDirect3D9: Ist das Hauptobjekt und verwaltet die anderen Objekte.
IDirect3DDevice9: Stellt die Abstraktion der Grafikhardware dar. Das Objekt bestimmt
die Hardware Rendering Engine (man unterscheidet hier zwischen HAL, Transform &
Lighning HAL, RGB und den sogenannten Reference Rasterizer). Des weiteren legt es
den Renderstate und den Viewport fest, verwaltet Texturen und andere Ressourcen und
die Lichtquellen.
IDirect3DVertexBuffer9: Ist ein Puffer der zum Speichern der 3D – Geometrie gedacht
ist. Es ist ein flexibles Format, welches passend zur Grafikkarte optimiert werden kann.
Für das Format der gespeicherten Geometriepunkte (Vertices) gibt es unzählige
Einstellungen. Vertices können mit oder ohne Normalenvektoren gespeichert werden
und es kann für jeden Vertex ein diffuser und spekularer (Glanz) Farbanteil festgelegt
werden.
Die wichtigste Funktion im Immediate Mode ist DrawPrimitiveUp( .. ), die als
Übergabeparameter einen Vertexbuffer erhält. Direct 3D wird durch den Aufruf
veranlasst die, durch den Vertexbuffer beschriebenen Punkte, Linien oder Polygone in
den Bildpuffer der Grafikkarte zu zeichnen.
Zusätzlich existiert für den Immediate Mode eine Utility Library mit nützlichen
Zusatzfunktionen. Sie besteht wiederum aus 3 COM – Objekten:
ID3DXContext: Dieses Object kümmert sich um allgemeine Dinge, wie das Verwalten
von Fenstern, das Verwalten der Bildpuffer, sowie das Ermitteln der Bildwiederholrate
(Framerate).
ID3DXMatrixStack: Soll bei der Realisierung einer Szenenhierarchie helfen, indem es
Funktionen zur Verwaltung eines Matrizenstapels bereit stellt.
ID3DXSimpleShape: Liefert Geometrien einfacher Objekte; Kugeln, Zylinder, Würfeln
usw.
10
Michael Kreutzer, FH-Gießen Friedberg
Seminarvortrag „DirectX 9“
Die Transformationspipeline
Unter Transformation versteht man im Sinne der 3D Computergrafik die Umformung und
Anpassung geometrischer Daten. Darunter fällt das Verschieben, Drehen und Skalieren
von Objekten oder Vektoren, ebenso wie die Umformung von 3D Koordinaten in eine
bildschirmkompatible 2D Form.
Die Transformation erledigt Direct 3D automatisch mithilfe der Transformationspipeline
und nutzt
dafür,
wenn möglich,
die eingebaute Grafikhardware.
Die
Transformationspipeline selbst besteht aus drei „hintereinandergeschalteten“
Transformationsmatrizen: Die Weltmatrize, die Sichtmatrize und die Projektionsmatrize.
Ist die Pipeline richtig konfiguriert, wird sie an ihrem Eingang mit 3D – Vektoren gespeist
und liefert an ihrem Ausgang fertige 2D – Bildschirmkoordinaten mit Tiefeninformation.
Die Welttransformation wird durch die Weltmatrix durchgeführt. Sie ist dafür
verantwortlich, dass 3D Objekte verschoben, rotiert und skaliert werden.
Die Sichttransformation sorgt dafür, dass eine 3D – Szene aus der Sicht einer virtuellen
Kamera betrachtet werden kann. Die Kamera kann dabei eine Position und eine
Blockrichtung im virtuellen 3D Raum simulieren.
Als letztes durchlaufen die 3D Vektoren die Projektionsmatrix. Sie konvergiert die 3D
Vektoren zu 2D Bildschirmkoordinaten und sorgt für den 3D Effekt, d.h. nahe Objekte
werden groß projiziert, weiter entfernte kleiner.
3.2.2 Der Direct 3D Rasterizer
Der Rasterizer stellt den Kern von Direct 3D dar, denn er sorgt dafür, das wir die 3D
Grafik auf dem Bildschirm sehen können. Während es früher noch Softwarerasterizer
gab, wird dieser Vorgang des Bildaufbauens heute vollständig von der Grafikhardware
durchgeführt.
Durch das Rasterisieren werden zu zeichnende Primitive – Punkte, Linien und Dreiecke
– in das Bildschirmraster eingefügt. Jedem Vektor wird eine zweidimensionale,
ganzzahlige Bildschirmkoordinate zugeordnet. Bei modernen 3D Anwendungen gibt man
sich jedoch nicht damit zufrieden nur eine einfache Drahtgitterdarstellung (Wireframe)
der 3D Szene zu zeichnen. Eine weitere Aufgabe des Rasterizers besteht also darin, die
zu zeichnenden Primitive mit Farben oder Texturen (zweidimensionale Bilder) zu füllen.
Während des Füllens werden zwischen verschiedenfarbigen Vektoren Farbverläufe
interpoliert um ein weiches Bild zu erhalten. Die Bildqualität von Texturen, die in häufig
durch die 2D Projektion verzerrt und skaliert werden, wird ebenfalls durch Interpolation
oder ähnliche Techniken erhöht.
Ein wichtiger Aspekt ist auch die Einarbeitung von Beleuchtungseffekten. Diese führen
im fertigen Bild zu bestimmten Helligkeits- und Farbverläufen, welche vom Rasterizer
bedacht werden müssen.
3.2.3 Direct 3D Renderstates
Mit Rendern bezeichnet man den gesamten Vorgang, der zur Darstellung von 3D Grafik
auf dem Bildschirm des Computers nötig ist.
Da es viele Möglichkeiten gibt, wie dies geschehen kann unterstützt Direct 3D
unterschiedliche Renderstates mit denen der Rendervorgang beeinflusst werden kann.
11
Michael Kreutzer, FH-Gießen Friedberg
Seminarvortrag „DirectX 9“
Der Renderstate bezieht sich vor allem auf das Zeichnen von Primitiven. Es kann
beispielsweise festgelegt werden, ob ein gefülltes Dreieck oder nur dessen Kanten oder
Eckpunkte gezeichnet werden sollen. Es ist auch möglich ein Primitiv transparent zu
zeichnen oder nur einen bestimmten Farbkanal zu verwenden. Die Verknüpfung der
Bildpunkte eines zu zeichnenden Primitives über arithmetische Operationen mit den
Daten im Bildpuffer ist ebenfalls möglich.
3.2.4 Direct 3D Ressourcen
Unter einer Ressource versteht man einen Speicherbereich, indem beispielsweise 3D
Geometrien und Bilder abgelegt werden können. Das Ressourcen Managementsystem
von Direct 3D ist sehr leistungsstark. 3D Anwendungen sind auf hohe Performance
angewiesen und moderne 3D Grafikkarten verfügen über einen großen und sehr
schnellen Grafikspeicher (oft 128MB). Direct 3D sorgt dafür, dass sich möglichst viele
der gerade benötigten Ressourcen im Speicher der Grafikkarte befinden. Um dieses Ziel
zu erreichen gibt Direct 3D Datenstrukturen zur Ressourcenverwaltung vor und managed
den Zugriff der Anwendung auf die Ressourcen. Soll beispielsweise ein Teil eines Bildes
durch die Anwendung verändert werden, so muss der Bildteil für die Grafikkarte gesperrt
werden und im Hauptspeicher der Anwendung zur Verfügung gestellt werden.
3.2.5 Direct 3D Z - und Stencil – Buffer
Der Z (Tiefen) - und Stencil (Schablonen) - Buffer ist ein zusätzlicher Bildpuffer, der im
Speicher der Grafikkarte angelegt wird. Der Z – Buffer hat die gleiche Auflösung wie der
Bildpuffer und dient dazu, für jeden Pixel des Bildes eine Tiefeninformation zu speichern.
Beim Bildaufbau kann die Grafikkarte mittels des Z – Buffers entscheiden ob ein
bestimmter Bildpixel gezeichnet werden darf oder nicht. Es könnte ja passieren, das ein
Pixel, der zu einem Objekt im Vordergrund des Bildes gehört , zuerst gezeichnet wird
und danach ein Pixel eines Objektes welches sich im Hintergrund der Szene befindet.
Der neue Pixel würde dann fälschlicherweise den alten Verdecken, aus diesem Grunde
führt die Grafikkarte beim zeichnen jedes Pixels einen sogenannten Z – Buffer Test
durch. Direct 3D unterstützt verschiedene Z – Buffer Formate, die sich hauptsächlich in
ihrer Genauigkeit und somit im Speicherverbrauch unterscheiden.
Der Stencil (Schablonen) – Buffer ist ein kleiner Zusatzpuffer (4-8 Bit/Pixel) der
zusätzlich in einen Z – Buffer integriert werden kann. Wie der Name schon sagt ist es
ein Schablonenspeicher, der zur Maskierung bestimmter Bildpixel verwendet werden
kann. Es ist zum Beispiel möglich, damit einen Nebeleffekt, welcher sich sonst auf das
gesamte Bild auswirken würde, auf einen bestimmten Bildbereich zu begrenzen. Eine
interessante Option, wenn beispielsweise der aufgeworfene Staub durchdrehender
Reifen eines Rennwagens oder der Abgasschweif eines Raumschiffes grafisch
dargestellt werden soll.
3.2.6 Direct 3D Texturen
Unter Texturen im Sinne der Computergrafik versteht man zweidimensionale Bilder. Sie
werden –mathematisch – über das Drahtgittermodell eines 3D Objektes geklebt um
dessen Oberfläche darzustellen. So kann aus einem einfarbigen Dreieck ein dreieckiges
stück Holz werden, einfach durch das überziehen mit einer Holztextur.
Texturen sind Bilddaten, auf welche die Grafikkarte schnellen und direkten Zugriff haben
muss. Es sind also typische Direct 3D Ressourcen. Zu ihrer Verwaltung bringt Direct 3D
12
Michael Kreutzer, FH-Gießen Friedberg
Seminarvortrag „DirectX 9“
die COM – Schnittstelle Idirect3Dtexture9 mit. Für jede neue Textur wird solch ein
Schnittstellenobjekt angelegt. Es ermöglicht eine Reiher spezieller Operationen mit
dieser Ressource und erleichtert so den Umgang.
Bei der Projektion texturierter 3D Objekte werden deren Texturen häufig stark skaliert
oder verzerrt. Die Textur eines sehr nahen Objektes muss oft stark vergrößert werden,
während Texturen entfernter Objekte gestaucht werden müssen.
Damit beim Skalieren die Bildqualität nicht zu sehr leidet unter stützt Direct 3D diverse
Texture Filtermethoden.
1. Der bilineare Filter
Dieser Filter sorgt für ein weiches Erscheinungsbild vergrößerter Texturen. Die
Vergrößerung wird nicht durch die Wiederholung einzelner Texturepixel erreicht.
Stattdessen werden Farbübergänge interpoliert, was zu einer wesentlichen Erhöhung
der Bildqualität führt. Die rechenaufwendige Interpolation erledigt die Hardware des
Grafikadapters.
2. Mip-Mapping
Mip-Mapping bedeutet, dass ein und dieselbe Textur in verschiedenen Größen im
Speicher der Grafikkarte angelegt wird. Direct 3D sucht sich dann im Betrieb
automatisch die Texturgröße, die am besten geeignet ist. Durch den Einsatz des
Mip-Mappings kann die Performance gesteigert werden, da immer die
kleinstmöglichen Texturen verwendet werden. Außerdem können Flimmereffekte, die
häufig durch das Verkleinern von Texturen entstehen vermieden werden.
Erzeugen lässt sich eine neue Textur in Direct 3D am einfachsten durch das Laden einer
Bilddatei. Zu diesem Zweck stellt die D3Dx – Utilitybibliothek eine spezielle Funktion zur
Verfügung: D3DXCreateTextureFromFile(..).
Der Funktion wird der Dateiname eines Bildes, sowie einige Anweisung zur Aufbereitung
der Textur übergeben. War der Ladevorgang erfolgreich, so erhält man ein neues
ID3Dtexture9 – Object, mit dem sich die Textur handhaben lässt.
3.2.7 Beleuchtung
Die Beleuchtung spielt eine elementare Rolle für die Räumlichkeit und Plastizität einer
3D Szene. Eine Szene ohne Lichtquellen wirkt einfarbig und unreal. Wie bereits erwähnt
übernimmt Direct 3D die Berechnung der Beleuchtung.
Direct 3D kennt verschiedene Typen von Lichtquellen. Die Typen unterscheiden sich
dadurch, wie sie ihr Licht abgeben. Punktlichter geben ihr Licht in alle Richtungen ab,
wie eine Glühbirne. Spotlichter bündeln das Licht in einem mehr oder weniger engen
Lichtkegel. Zuguterletzt gibt es noch einen dritten Lichtquellentyp, das Direktionale
(gerichtete) Licht. Diese Lichtquelle ist vergleichbar mit der Sonne, deren Strahlen fast in
geraden Linien auf die Erde treffen.
13
Michael Kreutzer, FH-Gießen Friedberg
Seminarvortrag „DirectX 9“
Abb. 4: Direct 3D Lichtquellen: Punktlicht, Spotlicht, Richtungslicht (v. links nach rechts)
Damit Direct 3D die Berechnung der Beleuchtung durchführen kann, muss für jeden
Vektor eines 3D Objekts ein Normalenvektor berechnet und gespeichert werden. Der
Normalenvektor eines Eckpunktes des Objekts wird so berechnet, dass er genau
senkrecht auf der Oberfläche des Objektes steht. Möchte man beispielsweise eine Kugel
darstellen, so berechnet man zuerst ihr Drahtgittermodell (Wireframe). Die
Normalenvektor berechnet man als Strahlen, die vom Mittelpunkt der Kugel ausgehen
und senkrecht die Kreuzungspunkte des Drahtgittermodells durchstoßen. Die
Normalenvektoren stehen somit exakt senkrecht zur Kugeloberfläche. Wird die Kugel
nun durch Direkt 3D beleuchtet erhält man eine glatte Oberfläche ohne scharfe Kanten.
Zu Verdanken ist dies der Technik mit den Normalenvektoren. Würde man auf diese
Technik verzichten, so würde die Oberfläche der Kugel kacheln da sie ja nur aus
Dreiecken angenähert wird und jedes Dreieck einen bestimmten Winkel zur Lichtquelle
hat.
Oberflächen, die senkrecht zu einer Lichtquelle stehen, werden von dieser am stärksten
beeinflusst. Wenn eine Oberfläche von der Lichtquelle abgewendet ist, der Einfallswinkel
des Lichts also mehr als 90 Grad beträgt, wird sie nicht mehr beeinflusst.
Lichtquellen haben eine bestimmte, definierte Reichweite. Alle Oberflächen, die dahinter
liegen, werden nicht mehr beleuchtet.
Jedem Objekt oder Dreieck kann man ein Material zuordnen. Das Material bestimmt die
Eigenschaften der Oberfläche und legt fest, wie sie auf das ankommende Licht reagiert.
In den Materialeinstellungen eines 3D Objektes können die Beleuchtung betreffend drei
Einstellungen vorgenommen werden: Farbe und Stärke des Eigenleuchtens, Farbe und
stärke der diffusen Reflexion und Farbe und Stärke der Glanzrefflektion. Eigenleuchten
bedeutet Licht, was von dem Objekt selbst emitiert wird (das Leuchten einer roten
Ampel). Diffuse Reflexion meint das Licht, welches gestreut reflektiert wird (matte
Oberfläche). Die Glanzreflexion regelt Stärke und Farbe des Oberflächenglanzes
(Weihnachtsbaumkugel).
In der realen Welt existiert immer ein gewisses Potential an Hintergrundlicht (Ambientes
Licht). Das Ambiente Licht kommt in der Natur dadurch zustande, das jedes Objekt im
Raum Lichtstrahlen reflektiert und streut, es entsteht immer ein mehr oder weniger
starkes diffuses Hintergrundlicht. Dieser Effekt wird durch Direct 3D lediglich simuliert,
eine Berechnung der gestreuten Lichtstrahlen wäre viel zu aufwendig und bleibt daher
professionellen Ray – Tracing – Programmen (Strahlenverfolgern) vorbehalten. Diese
Programme brauchen dann oft Stunden für das erzeugen eines einzigen 3D Bildes und
sind für Echtzeitsimulationen von 3D Welten denkbar ungeeignet. Die Simulation des
ambienten Licht erfolgt bei Direct 3D durch die Definition einer zusätzlichen ambienten
Lichtquelle. Diese Lichtquelle tut letztlich nichts anderes, als allen Objekten ein
schwaches Eigenleuchten der Farbe der Lichtquelle aufzuprägen. Der Effekt wirkt in
14
Michael Kreutzer, FH-Gießen Friedberg
Seminarvortrag „DirectX 9“
etwa so, als würden alle 3D Objekte die diffusen Strahlen einer Hintergrundbeleuchtung
reflektieren.
Beim Beleuchten einer Szene gibt es häufig das Problem, dass manchmal scharfe
Kanten zwischen Polygonen gewünscht werden, während in anderen Fällen aus
mehreren Polygonen eine zusammenhängende Fläche erzeugt werden soll. Deutlich
wird dieser Unterschied sehr gut beim Vergleich eines Würfels mit einer Kugel. Die
Flächen des Würfels stehen im rechten Winkel zueinander und bilden daher scharfe
Kanten. Jede der sechs Flächen hat einen anderen Winkel zur Lichtquelle. Kugeln
werden in der 3D Technik ebenfalls nur aus Dreiecken, also Flächen angenähert.
Berechnet man die Beleuchtung der Kugel jedoch so, dass die einzelnen Dreiecke aus
denen sie besteht scharfe Kanten zueinander bilden, so erhält man eher einen
Diamanten als eine richtige Kugel.
Zur Lösung dieses Problems unterstützt Direct 3D Glättungsgruppen. Alle Eckpunkte
(Vertices) eines Objektes die derselben Glättungsgruppe angehören bilden eine
zusammenhängende Fläche mit weich interpolierten Übergängen. Flächen aus
Vertexmengen, die unterschiedlichen Glättungsgruppen angehören bilden scharfe
Kanten zueinander.
Es gibt leider noch einen weiteren Punkt, den Direct 3D bei der Beleuchtung einer Szene
nicht automatisch übernehmen kann. Das ist die Berechnung von Schatten. Um
Schatten in einer Szene korrekt berechnen zu können müsste ein Lichtstrahl von jedem
zu beleuchtenden Vertex bis zur Lichtquelle einzeln zurückverfolgt werden, um
festzustellen, ob sich auf seinem Weg ein Hindernis befindet. Für solche Kalkulationen,
haben heutige Computersysteme nicht die ausreichende Rechenleistung. Der
Programmierer muss sich mit einem Trick behelfen. Er setzt alle Lichtquellen statisch
(unbeweglich) und lässt ein einziges Mal
den Schattenwurf berechnen. Diese
Berechnung wird in Form von Texturen über die Dreiecke der Szene gelegt.
3.2.8 Direct 3D Effekte
Direct 3D unterstützt eine Vielzahl von interessanten Effekten. Ich möchte hier nur einige
wenige kurz erläutern. Grundsätzlich kann man jedoch sagen, dass in der Regel alle
Spezialeffekte unterstützt werden, die auch von aktueller Grafikhardware angeboten
werden. Dies ist der engen Zusammenarbeit der Grafikkartenhersteller mit den DirectX
Entwicklern zuzuschreiben.
Direct 3D Nebel
Nebel ist ein interessantes Stielmittel um die Atmosphäre einer 3D Szene interessanter
zu gestalten. Ein großer Vorteil ist auch, dass man die Sichtweise, beispielsweise eines
Spielers in einem Computerspiel, auf natürlich wirkende Weise begrenzen kann. Man
spart dadurch Rechenleistung, da weit entfernte Objekte im Nebel untergehen und nicht
mehr gezeichnet werden müssen. Die Szene selbst wirkt viel natürlicher, da in der Natur
immer ein gewisser Dunst vorhanden ist, man kann nie unendlich weit sehen. Natürlich
lassen sich auch interessante Effekte, wie der aufgewirbelte Staub eines Sandsturms
durch Nebel simulieren.
Direct 3D kennt technisch gesehen zwei verschiedene Arten von Nebel:
15
Michael Kreutzer, FH-Gießen Friedberg
Seminarvortrag „DirectX 9“
1. Den linearen Nebel, der ab einer gewissen Entfernung vom Betrachter beginnt,
linear ansteigt bis zu einer Entfernung ab der alle Objekte völlig im Nebel
untergehen.
2. Den Exponentiellen Nebel. Er breitet sich nicht linear, sondern exponentiell aus
und hat keine Anfangs- und Enddistanz. Die Stärke des Nebels wird durch einen
Wert – die Nebeldichte – festgelegt.
Darüber hinaus muss noch entschieden werden, ob Direct 3D einen Vertexnebel oder
einen Pixelnebel berechnen soll.
Der Vertexnebel ist die schnellere Variante. Hier wird für jeden Geometrieeckpunkt
berechnet, wie stark er durch den Nebel verdeckt wird. Der bereich zwischen den
Geometrieeckpunkten wird, ähnlich wie bei der Beleuchtung, interpoliert.
Die genauere Nebelvariante, aber auch die Rechenaufwendigere ist der sogenannte
Pixelnebel. Hier wird für jeden einzelnen Bildpunkt des fertigen Bildes berechnet, wie
stark er durch den Nebel beeinflusst wird.
Direct 3D Alphablending
Alphablending wird dazu benutzt transparente oder durchsichtige Objekte zu zeichnen.
Dazu verwendet Direct 3D ein erweitertes Farbformat, welches zusätzlich zu den
Farbkanälen Rot, Grün und Blau einen Alphakanal unterstützt, in dem die Transparenz
eines Pixels definiert wird.
Man könnte zum Beispiel die teilweise transparente Flamme einer Fackel oder die
Oberfläche eines Gewässers mit Alphablending zeichnen (beim Eintauchen in das
Gewässer kann durch blauen Nebel die Unterwasserwelt simuliert werden).
Bei eingeschaltetem Alphablending, werden die neu zu zeichnenden Pixel eines
Objektes mit denen im Bildpuffer bereits vorhandenen auf eine vorher festgelegte Art
und Weise verknüpft , um einen Durchsichtigkeitseffekt zu erzielen. Bedauerlicherweise,
muss bei der Verwendung von Alphablending auf den Z – Buffer (Tiefenpuffer) verzichtet
werden. Das bedeutet, dass alle Objekte, die mit Alphablending gezeichnet werden
sollen vorher von hinten nach vorne in der Szene sortiert werden müssen, damit ihre
Pixel sich in korrekter Reihenfolge überdecken.
Direct 3D bietet verschiedene Methoden, mit der die Pixel im Bildpuffer mit den neu zu
zeichneten überblendet werden können:
Ergebnis = (Alt * BlendfaktorAlt) + ( Neu * BlendfaktorNeu)
Die Farben der Pixel werden mit ihren Blendfaktoren multipliziert und anschließend
aufaddiert. Statt der Addition könnte beispielsweise auch eine Subtraktion oder
Multiplikation der Farbwerte durchgeführt werden.
Für die Blendfaktoren wählt man gerne den Wert 1, d.h.
BelndfaktorAlt’ = BlendfaktorNeu
Diese Methode hat den Nachteil, dass beim Ergebnis möglicherweise die maximale
Farbhelligkeit überschritten wird und man einen Sättigungseffekt provoziert, aber dafür
ist sie sehr schnell.
Besser aber langsamer ist es die Blendfaktoren auf folgende Werte einzustellen:
BlendfaktorAlt = 1 - AlphaNeu
BlendfaktorNeu = AlphaNeu
16
Michael Kreutzer, FH-Gießen Friedberg
Seminarvortrag „DirectX 9“
In Worten bedeuten die beiden Gleichungen: Je höher der Alphawert des neuen Pixels
der in den Bildpuffer geschrieben werden soll ist, desto stärker beeinflusst er die
endgültige Farbe und desto geringer ist der Einfluss des alten Pixels.
Die Summe der Blendfaktoren ist hier immer genau 1. Man vermeidet so das Problem,
das die neu berechnete Farbe zu hell wird.
Als weitere sehr interessante Möglichkeit bietet Direct 3D das sogenannte Alpha –
Testing. Hierbei kann man eine bestimmte Anforderung an den Alphawert eines Pixels
stellen, der gezeichnet werden soll. Nur wenn die Bedingung erfüllt ist, wird der Pixel
tatsächlich gezeichnet. Ein Beispiel wäre: Pixel nur dann zeichnen, wenn sein Alphawert
größer als 0.5 ist. Pixel, die ohnehin nur eine geringe, im Bild kaum sichtbare Deckkraft
hätten, würden dann einfach nicht mehr gezeichnet und die Performance würde steigen.
Ein zweites sehr interessantes Beispiel: Zeichne Pixel nur dann, wenn sein Alphawert
genau 0.7 beträgt. Wenn man diese Bedingung für jedes Bild ein wenig ändert kann man
schöne, animierte Effekte erzeugen.
Direct 3D Multitexturing
Multitexturing ist eine sehr wichtige Technik, die es erlaubt mehrere Texturen
übereinander auf ein und dasselbe Objekt zu legen. Über den Alpha-Farbkanal können
dabei Transparenzen und Überblendungsfaktoren für jeden Texel (Texturpixel)
angegeben werden. Auf diese Weise können beispielsweise auf der großen Textur einer
Mauer viele kleine Pflanzentexturen dynamisch angeordnet werden.
Durch die Kombination unterschiedlicher Texturen spart man jedoch nicht nur Speicher,
man kann auch zahlreiche interessante Grafikeffekte erzielen. Ein Anwendungsbeispiel
ist die Simulation von Schatten und Lichteffekten in einer Szene.
Moderne Grafikadapter unterstützen Hardwaremäßig die Kombination von bis zu 16
Texturen. Der Programmierer wird also eingeladen, davon reichlich Gebrauch zu
machen.
Direct 3D Environment Mapping
Environment – Mapping ist eine der modernsten und interessantesten Techniken, die
von Direkt 3D angeboten werden. Mit dieser Technik ist es möglich spiegelnde
Oberflächen zu simulieren.
Zur Erstellung einer Umgebungskarte (Environment Map) werden sechs Texturen
erzeugt, die genau das zeigen, was sich auf der linken, rechten, oberen, unteren,
vorderen und hinteren Seite des spiegelnden Objekts befinden (360 Grad Panorama in
alle Richtungen). Die dann sogenannte Kubische Umgebungstextur wird dynamisch
generiert. Dazu rendert man statt in den Bildpuffer direkt auf die Texturen und wählt eine
Kameraposition, die der Mitte des Objektes entspricht. Danach werden sechs Bilder in
allen Blickrichtungen auf die Texturen gerendert.
Um zu erreichen, dass ein Objekt spiegelt, werden seine Umgebungstexturen direkt auf
das Objekt gelegt. Um die Texturen korrekt auf das Objekt zu „mappen“ braucht man
jedoch zu jedem Eckpunkt (Vertex) des Objekts eine Texturkoordinate.
Zur Berechnung der Texturkoordinaten wird, ausgehend von der Kamera, zu jedem
Vertex des Objekts ein virtueller Strahl gesendet. Mit Hilfe des Normalenvektors des
Vertex (diesen braucht man auch zur Beleuchtungsberechnung) wird errechnet, in
welchem Winkel der Strahl am Objekt reflektiert wird. Nach der Reflektion wird der Strahl
weiterverfolgt bis er eine Seite der – wie ein Würfel um das Objekt gespannten –
kubischen Umgebungstextur trifft. Der Strahl kann nur eine von sechs Texturen treffen
17
Michael Kreutzer, FH-Gießen Friedberg
Seminarvortrag „DirectX 9“
und diese eine trifft er an einer bestimmten Texturkoordinate. Das ist genau die
Koordinate, an der diese Textur auf den getesteten Eckpunkt „gemappt“ werden muss.
Der Aufwand die oben beschriebenen Berechnungen bei jeder Positionsveränderung
von Kamera oder Objekten zu erneuern wäre natürlich für die Echtzeitanwendung viel zu
groß.
Direct
3D
verfügt
über
die
Möglichkeit
der
automatischen
Texturkoordinatengenerierung und automatisiert damit den größten Teil der
Berechnungen unter Einsatz der Grafikhardware.
Um
beispielsweise
Environment
–
Mapping
mit
der
automatischen
Texturekoordinatengenerierung von Direct 3D zu realisieren sind nur wenige Schritte
erforderlich. Es muss lediglich die Umgebung des zu verspiegelndes Objektes
„abfotografiert“ werden, alternativ kann auch eine fest eingestellte Umgebungstextur von
einem Datenträger geladen werden. Die sechs
Einzeltexturen der kubischen
Umgebungstextur werden zu einer sogenannten Volumentextur – eine dreidimensionale
Textur, die in der dritten Dimension über sechs Ebenen verfügt – zusammengefasst um
von Direct 3D korrekt verarbeitet werden zu können. Nach Abschluss dieser Vorarbeiten
können Texturen von Direct 3D nach bestimmten Regeln automatisch auf
dreidimensionale
Objekte
„gemappt“
werden.
Durch
die
automatische
Texturkoordinatengenerierung sind, neben dem Environment – Mapping, weitere sehr
schöne grafische Effekte möglich.
4 Klangerzeugung mit Direct Sound
Eine im Computer eingebaute Soundkarte lässt sich natürlich auch über die Windows
API ansteuern. Die Windows API Funktionen sind einfach zu handhaben, sind aber in
ihrem Einsatzgebiet recht eingeschränkt. Beispielsweise ist es schon nicht mehr möglich
eine abzuspielende Klangdatei im Stereopanorama nach links oder rechts zu
verschieben. Für die Entwicklung von Multimediaanwendungen, vor allem von Spielen,
sind reichhaltige Klangmodifikationen und Effekte jedoch von Nöten.
Direct Sound bietet gleich eine ganze Reihe von interessanten Features. Dazu gehören:

Das schnelle Mischen einer unbegrenzten Anzahl sich überlagernder Sounds

Wenn beschleunigende Hardware vorhanden ist, wird diese genutzt. Klänge
können direkt im Speicher der Soundkarte abgelegt werden und von deren APU
(Audio Processing Unit) gemischt oder mit Effekten versehen werden.

3D Sound: Klänge können frei in einem virtuellen Raum positioniert werden.
Direct Sound berechnet automatisch und sehr realitätsnah, den Weg der 3D
Klänge zu den Ohren des Hörers. Sogar der Dopplereffekt (Änderung der
Tonhöhe, bei sich bewegenden Schallquellen) wird simuliert. Die Klangausgabe
kann nicht nur auf Stereolautsprecher, sondern auch auf Surround – Anlagen mit
sechs oder mehr Lautsprechern erfolgen.

Sounds sind durch eine Vielzahl von Effekten, deren Parameter in Echtzeit
verändert werden können, beeinflussbar.

Sounds können synchron aufgenommen, verarbeitet und wieder ausgegeben
werden.
18
Michael Kreutzer, FH-Gießen Friedberg
Seminarvortrag „DirectX 9“
Das Haupteinsatzgebiet von Direct Sound liegt im Bereich 3D Sound, obwohl es auch
immer mehr von Anwendungen zur Aufnahme und Bearbeitung von Audiotracks
eingebunden wird.
4.1
Direct Sound Mixer und Soundpuffer
Direct Sound organisiert alle Sounds in sogenannten Soundpuffern. Einen Soundpuffer
kann man sich wie einen fast beliebig großen Speicherbereich vorstellen, der Klangund Formatinformationen beinhaltet. Die Puffer sind vergleichbar mit den Puffern für die
Geometriedaten in Direct 3D.
Von der Soundkarte wiedergegeben werden kann nur ein einziger puffer, der
sogenannte primäre Soundpuffer. Alle Klänge, die eine Anwendung benötigt werden
dagegen, in sekundären Soundpuffern abgelegt. Wenn immer ein sekundärer
Soundpuffer wiedergegeben werden soll, werden seine Daten zu einem virtuellen Mixer
übertragen. Dieser mischt alle zur Zeit spielenden Soundpuffer und schreibt das
Ergebnis in den primären Soundpuffer, von wo aus der fertige Klang über die Soundkarte
wiedergegeben wird. Ein sekundärer Soundpuffer kann entweder im Hauptspeicher oder
im Speicher der Hardware abgelegt werden, soweit diese es unterstützt. Sekundäre
Soundpuffer, die sich im Speicher der Soundkarte befinden können sehr schnell und
ohne Belastung des Hauptprozessors gemischt und ausgegeben werden.
Überhaupt ist zu beachten, dass alle Stationen die ein Klang durchläuft, da wären zu
nennen 3D – Sound, Effekte, Mixer, entweder per Hardware oder per Software
durchgeführt werden können, ähnlich wie bei Direct 3D. Nicht von der Hardware
unterstützte Features werden softwareemuliert.
4.2
Direct Sound Schnittstellen
DirectX bietet für Direct Sound wieder ein auf COM basierendes Programmierinterface.
Im wesentlichen wird mit drei Schnittstellen gearbeitet: IDirectSound8 und
IDirectSoundBuffer8, sowie IDirectSound3DBuffer8. Der Versionsnummern der
Schnittstellen ergeben sich aus der Tatsache, dass Direct Sound seit der Version 8 von
DirectX nicht mehr weiterentwickelt wurde. IDirectSound8 repräsentiert das Interface für
das
Audioausgabegerät
(Soundkarte)
und
kapselt
dessen
Funktionalität.
IDirectSoundBuffer8 ist die Schnittstelle für alle Soundpuffer und bietet Methoden zum
Abspielen, Stoppen von Klängen und die verschiedensten Effekte. Ein weiterer wichtiger
SoundBuffer ist die Schnittstelle IDirectSound3DBuffer8. Sie dient zur Erzeugung von 3D
– Soundbufferschnittstellen mit denen dreidimensionaler Raumklang erzeugt werden
kann. Soundpuffer werden durch eine Methode von IDirectSound8 erstellt.
4.3
Eigenschaften der Soundpuffer
Es gibt verschiedene Kategorien von Soundpuffern. Es gibt statische und dynamische
Soundpuffer. Statische Puffer werden nach ihrer Initialisierung nicht mehr verändert.
Direct Sound kann sie recht effizient im Speicher der Soundkarte platzieren, falls dort
genügend Platz ist. Auf statische Soundpuffer können allerdings keine Echtzeiteffekte
angewandt werden, z.B. Echo. Auch können ihr Inhalt nicht mehr geändert werden, für
solche Anwendungen werden dynamische Soundpuffer benötigt, die aber etwas weniger
performant sind.
19
Michael Kreutzer, FH-Gießen Friedberg
Seminarvortrag „DirectX 9“
Soundkarten können nur eine begrenzte Anzahl an Klangstimmen zur Zeit abspielen
(etwa 32 – 128 Stimmen). Überschreitet eine Anwendung die maximale Anzahl an in
Hardware implementierten Stimmen, so setzt die Softwareemulation und die damit
verbundene Belastung des Hauptprozessors ein. Zur Organisation der Stimmen bietet
Direct Sound eine Stimmenverwaltung (Voice Management) an. Die Stimmenverwaltung
sorgt für eine intelligente Ausnutzung der vorhanden Ressourcen. Nach Möglichkeit
werden nur die Hardwarestimmen der Soundkarte genutzt, nur in Situationen in denen
unbedingt weitere Stimmen von Nöten sind, wird der Softwaremixer mit weiteren
Stimmen hinzugezogen.
Eine weitere Variante sind ringförmige Soundpuffer. Es handelt sich um dynamische
Soundpuffer ohne Anfang und Ende, eben ringförmig. Stattdessen besitzen sie eine
Schreibmarke an deren Position Daten in den Puffer geschrieben werden können und
eine Abspielmarke, die sich genau an der Stelle des Puffers befindet, die gerade
wiedergegeben wird. Ringpuffer eignet sich durch ihren Aufbau also vor Allem zur
Wiedergabe großer Klangdateien, die nach und nach von einem Datenträger geladen
werden.
4.4
3D Sound
Abb. 5: Virtueller Hörer (ähnlich Kamera in Direct3D) und Bewegliche Geräuschquellen
3D Sound bedeutet, das Geräuschquellen eine dreidimensionale Position und eine
Geschwindigkeit zugeordnet wird. Auch dem Hörer wird eine Position und
Geschwindigkeit im Raum zugeordnet. Mittels dieser Angaben wird durch Direct Sound
ein Klang so verändert, dass man den Eindruck hat eine Geräuschquelle befände sich
beispielsweise direkt über oder hinten, links vom Hörer. Zur Simulation von 3D Sound
bedient sich Direct Sound folgender Techniken:
20
Michael Kreutzer, FH-Gießen Friedberg





Seminarvortrag „DirectX 9“
Schallabschwächung: Je weiter eine Geräuschquelle vom Hörer entfernt ist, desto
leiser wird sie wahrgenommen.
Kommt ein Geräusch von links, so hört man es im linken Ohr etwas lauter und ein
kleines bisschen früher als im Rechten.
Geräusche, die ihren Ursprung hinter dem Hörer haben, werden von diesem
leicht gedämpft wahrgenommen, da sie zuerst den Kopf passieren müssen. Auch
dieser Effekt wird simuliert.
Dopplereffekt: Bei schneller Bewegung einer Geräuschquelle oder des Hörers
kann es passieren, dass Schallwellen (relativ zum Hörer) gestreckt oder
gestaucht werden. Dadurch verändert sich die Frequenz des Geräusches. Man
kennt diesen Effekt von der Sirene des vorbeieilenden Krankenwagens. Auch der
Dopplereffekt kann von Direct Sound originalgetreu, unter Einbeziehung der
relativen Geschwindigkeit Geräuschquelle zu Hörer, simulieren.
Wenn eine Surroundanlage angeschlossen ist, können all ihre vielen
Lautsprecher für die Verbesserung des Raumklangs genutzt werden.
Um die 3D Soundfähigkeiten von Direct Sound nutzen zu können, muss zu jedem Klang,
der durch einen Soundpuffer repräsentiert wird ein zusätzlicher 3D Soundpuffer
(IDirectSound3DBuffer8) angelegt werden, der besondere Einstellungen für den 3D
Sound, sowie Angaben zur Position und Geschwindigkeit der Geräuschquelle speichert.
Eine 3D – Klangquelle besteht demnach immer aus zwei Schnittstellen, aus der
„normalen“
Soundpuffer
–
Schnittstelle
und
der
3D
Soundpuffer
Erweiterungsschnittstelle.
Die Position und Geschwindigkeit einer Klangquelle wird über die 3D
Soundpufferschnittstelle gesetzt. Die Angabe der Position erfolgt durch einen
dreidimensionalen Positionsvektor, die Einheit des Koordinatensystems ist Meter. Die
Geschwindigkeit einer Klangquelle wird als dreidimensionaler Geschwindigkeitsvektor
mit der Einheit Meter pro Sekunde angegeben. Die Einheiten haben hier eine elementare
Bedeutung. Die Angaben der Werte in Meter bzw. Meter/Sekunde sind wichtig, damit
Direct Sound den Weg des Schalls physikalisch korrekt berechnen kann.
4.4.1 Die IDirectSound3Dlistener8 – Schnittstelle
Neigung
Bewegung
Blick
Abb. 6: Virtueller Hörer, simuliert durch 3 Vektoren zur Angabe von Bewegung, Blickrichtung und
Neigung
21
Michael Kreutzer, FH-Gießen Friedberg
Seminarvortrag „DirectX 9“
Wie bereits angedeutet benötigt man zur Darstellung von 3D Sound nicht nur
Geräuschquellen im virtuellen Raum, sondern auch einen Hörer, welcher die Geräusche
wahrnimmt, vergleichbar mit der Kamera in der 3D – Grafik. In der Tat setzt man 3D
Sound fast immer in Kombination mit 3D – Grafik ein. In diesem Fall hat der virtuelle
Hörer meist die gleiche Position und die gleiche Orientierung im Raum wie die virtuelle
Kamera. Während die Kamera das Bild „abfilmt“ und auf den Bildschirm projiziert nimmt
der künstliche Kopf des Hörers die Klänge im 3D Raum wahr und projiziert sie auf
Kopfhörer oder Lautsprecherboxen.
Die
Programmierschnittstelle
zur
Einstellung
des
virtuellen
Hörers
(IDirectSound3Dlistener8 – Schnittstelle ) erhält man, da es nur einen geben darf,
durch eine Abfrage der Schnittstelle des primären Soundpuffers.
Über diese Schnittstelle kann man die Position und Geschwindigkeit des Hörers setzen.
Es kann sich, genau wie die Geräuschquellen, durch den Raum bewegen. Diese
Bewegung hat Einfluss auf das Klangbild und dient vor allem zur korrekten Berechnung
des Dopplereffektes.
Neben Position und Geschwindigkeit hat der Hörer eine Orientierung, also quasi eine
Blickrichtung, im Raum. Die Orientierung wird durch die Angabe von zwei
Richtungsvektoren angegeben: Dem Nach – vorne – Vektor und dem Nach – Oben –
Vektor. Der Nach – Vorne – Vektor gibt die Z – Achse des Hörers an, das ist die
Richtung in der er zeigt. Der Nach – Oben – Vektor steht senkrecht auf dem Nach –
Vorne – Vektor und stellt demnach die y – Achse des Hörers dar. Man beachte, dass ein
Vektor zur Angabe der Orientierung nicht ausreicht, da auch eine eventuelle
Seitwärtsneigung des Kopfes wiedergegeben werden soll.
Letztlich lassen sich über die IDirectSound3Dlistener8 noch einige wichtige Faktoren
einstellen, die das Gesamtergebnis beeinflussen nämlich die Einstellung des
Distanzfaktors, Dopplerfaktors und Abschwächungsfaktor. Der Distanzfaktor dient
zur Skalierung der Maßeinheiten für Position und Geschwindigkeit. Ein Distanzfaktor
von 1000 ändern beispielsweise die Einheiten von Meter bzw. Meter/Sekunde auf
Kilometer bzw. Kilometer/Sekunde.
Über die Einstellung Dopplerfaktor kann die Simulation des Dopplereffektes verstärkt
oder abgeschwächt werden. Es bietet sich in der Praxis an, diesen Effekt etwas zu
verstärken um den Hörer zu beeindrucken.
Der Abschwächungsfaktor legt fest, wie stark die Lautstärke einer Geräuschquelle
mit steigender Entfernung abnimmt. Erlaub sind hier nur Werte zwischen 1 und 10,
wobei 10 bedeutet, dass die Lautstärke 10 mal stärker abnimmt als in der Realität.
4.5
Direct Sound Echtzeiteffekte
Zum Abschluss des Kapitels möchte ich hier gerne noch eine weitere Funktionalität von
Direct Sound vorstellen: Die Echtzeiteffekte. Unter Echtzeiteffekt versteht man die
Modifikation eines Klangs während dessen Wiedergabe, in Echtzeit eben.
Direct Sound bietet gleich eine ganze Palette von interessanten Echtzeiteffekten




Chorus: Es entsteht der Eindruck, als würde der Klang zweimal abgespielt, aber
leicht verzögert und etwas moduliert.
Kompression: Bestimmte Amplitudenbereiche werden unterdrückt.
Verzerrung: Der Klang wird übersteuert / verzerrt.
Echo: Der Klang wird in der gleichen Weise zweimal abgespielt, wobei beim
zweiten Durchgang die Lautstärke abnimmt.
22
Michael Kreutzer, FH-Gießen Friedberg





Seminarvortrag „DirectX 9“
Flanger: Ein Modulationseffekt bei dem der Klang mit einer minimalen,
variierenden Verzögerung sich selbst überlagert wird.
Gurgeln: Verändert die Amplitude eines Sounds periodisch (immer wieder lauter
und leiser werdend)
Equalizer: Kann die Lautstärke bestimmter Frequenzbereiche verstärken oder
abschwächen.
Widerhall: Ähnlich wie Echo, jedoch eher für Musik gedacht.
Raumklang: Simulation der Schallwellenreflexion in Räumen.
Die oben genannten Effekte können einem Klang nicht nur in Echtzeit hinzugefügt
werden, es ist sogar möglich die Effektparameter noch während der Wiedergabe zu
verändern. Auch ist es möglich eigene Effekte zu entwerfen und zu implementieren.
5 Verwaltung von Eingabegeräten mit Direct Input
Die Anwendungsschnittstelle von Windows bietet zwar einige Funktionen zum Abfragen
von Eingabegeräten, beschränkt sich jedoch dabei auf Standardeingabegeräte, wie
Tastatur und Maus. Spezielle Eingabegeräte, zum Beispiel sogenannte Force Feedback
Joysticks (Steuerknüppel mit Kraftrückkopplung) , welche als Eingabegerät in Interaktion
mit dem Benutzer stehen, werden von der Windows API nicht unterstützt. Auf die
Standardeingabegeräte wie Maus und Tastatur lässt die Windows API keinen „LowLevel“- Zugriff zu, so dass Tastatur- und Mausabfragen für schnelle Computerspiele viel
zu lange dauern. All diese Probleme bekommt man durch den Einsatz von Direct Input
gut in den Griff. Insbesondere die Unterstützung von exotischen Eingabegeräten ist auch
außerhalb der Spieleindustrie eine Stärke von Direct Input.
Direct Input teilt alle am PC angeschlossenen Geräte in folgende Klassen ein:



Tastaturen: Es können mehrere unterschiedliche Tastaturen zur gleichen Zeit
angeschlossen und abgefragt werden.
Zeigergeräte: Dazu gehören Mäuse aber auch CAD – Design – Boards. Es
können mehrere dieser Geräte gleichzeitig angeschlossen werden, auch mehrere
Mäuse, wenn dies gewünscht wird.
Joysticks / Gamecontroller: In diese Klasse fallen praktisch alle Eingabegeräte,
die nicht unter Tastaturen oder Zeigegeräte einzuordnen sind. Insbesondere
Geräte, die mit ihrem Benutzer in Interaktion treten, sind hier einzuordnen.
Damit Direct Input mit allen Eingabegeräten umgehen kann, abstrahiert es und sieht
jedes Gerät immer nur als eine Ansammlung von Achsen und Knöpfen. Achsen liefern
analoge Daten (z.B. Einstellung eines Potentiometers) und Knöpfe liefern digitale Werte
(Taste auf der Tastatur oder Mausknopf).
Damit die Anwendung entscheiden kann, mit welchem an den Computer
angeschlossenen Gerät sie gerne arbeiten möchte, kann sie sich alle Geräte von Direct
Input nach den oben genannten Geräteklassen auflisten lassen. Die Listenpunkte liefern
für jedes Gerät detaillierte Informationen und eine GUID (Genereller einheitlicher
Identifizierer) mit dem eine Schnittstelle zu dem speziellen Gerät geöffnet werden kann.
5.1
Schnittstellen für Direct Input
Es gibt zwei wesentliche COM – Schnittstellen mit denen man sich die Funktionalität von
Direct Input zugänglich machen kann. IDirectInput8 und IDirectUnputDevice8.
23
Michael Kreutzer, FH-Gießen Friedberg
Seminarvortrag „DirectX 9“
IDirectInput ist das Basisobjekt. Über die Schnittstelle erhält man eine Liste an den
Computer angeschlossener Eingabegeräte mit ihren IDs. Über die Methode
IDirectInput8::CreateDevice(..) kann man sich Zugriff zu einem gewünschten Gerät
verschaffen und erhält einen Zeiger auf eine IDirectInputDevice8 – Schnittstelle, welche
dann immer ein spezielles Gerät repräsentiert. Über die erhaltene Geräteschnittstelle
können alle Achsen und Knöpfe des Gerätes abgefragt werden und Steuerinformationen
zum Gerät gesendet werden, für den Fall, dass es sich um ein interaktives Eingabegerät
handelt, das seinem Benutzer Rückmeldungen geben kann.
Zuletzt muss noch ein zu dem Gerät passendes Datenformat festgelegt werden um über
Ein-/Ausgabemethoden kommunizieren zu können. Für Standardgeräte wie Tastatur,
Maus und Joystick gibt Direct Input bereits Datenformate vor. Für den Fall, dass man ein
ganz spezielles Eingabegerät ansteuern möchte, muss man sich jedoch beim Hersteller
über das entsprechende Datenformat informieren.
6 Zusammenfassung
Microsoft bietet mit dem umfangreichen Softwareentwicklungspaket DirectX eine
leistungsstarke Erweiterung für ihr Betriebssystem Windows an. DirectX in Version 9 ist
eine gute und ausgereifte Multimediaschnittstelle, die sehr gut von den Herstellern der
Hardware unterstützt wird. Alle wichtigen Hardwarefeatures und Neuerungen werden
laufend integriert. Spieleentwickler und Entwickler von Multimediaanwendungen
enthalten von DirectX breitbandige Unterstützung im Grafik, Audio, Video und
Netzwerkbereich, außerdem werden fast alle denkbaren Eingabegeräte unterstützt.
Oft wird versucht DirectX mit OpenGL zu vergleichen. Dieser Vergleich ist unangebracht,
da OpenGL eine Grafikschnittstelle ist und lediglich mit der Unterkomponente Direct 3D
von DirectX verglichen werden könnte. Für andere Betriebssysteme z.B. Linux gibt es
jedoch DirectX ähnliche Spieleentwicklungspakete, sogenannte Game Software
Development Kits, welche die Grafikschnittstelle OpenGL erweitern.
Ein massives Manko von DirectX ist der Verlust der Plattformenabhängigkeit. DirectX ist
nur für Microsoft – Betriebssysteme erhältlich. Durch die inzwischen große
Marktetabliertheit droht DirectX , vor allem im Bereich der 3D – Spieleentwicklung,
andere Multimediaschnittstellen vom Markt zu verdrängen. Das bedeutet, dass im
Bereich der PC – Spiele bedauerlicherweise andere Betriebssysteme verdrängt werden
und Microsoft seine Monopolstellung bestärken kann.
24
Seminarvortrag „DirectX 9“
Michael Kreutzer, FH-Gießen Friedberg
7
7.1
Anhang
Abbildungsverzeichnis
Abbildung
1
2
3
4
5
6
Herkunft
Michael Kreutzer
Michael Kreutzer
Michael Kreutzer
Michael Kreutzer
Michael Kreutzer
Michael Kreutzer
Datum
20.06.2004
20.06.2004
20.06.2004
20.06.2004
20.06.2004
20.06.2004
7.2
Literatur
[1]
3D Spieleprogrammierung und modernes Game Design mit DirectX 9
und C++ von David Scherfgen, erschienen im Hanser Verlag
[2]
Jetzt lerne ich DirectX 9 und Visual
erschienen im Markt & Technik Verlag
C++
von
Christian
Roussel,
25
Herunterladen