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