Kapitel 1 - Initialisierung von DirectX
In diesem Kapitel erstellen wir das Programmgerüst für die folgenden
Abschnitte der Einführung. Klären wir als erstes, wie unser Programm
funktionieren soll, damit wir später überhaupt einmal Grafik auf dem Bildschirm darstellen
können. So ungefähr könnte der Ablauf aussehen:
- Erstellen eines Fensters
- Initialisieren von DirectX
- Hauptschleife mit Löschen des Hintergrunds
- Abmelden von DirectX
- Abmelden des Fensters
DirectX und all seine Bestandteile sind als COM-Objekte implementiert, um
von den verschiedenen Programmiersprachen, wie Visual C++, Visual Basic,
Delphi etc. zugänglich zu sein. COM-Objekte werden in C++ ähnlich wie
Klassen benutzt.
Wie praktisch jedes Windows-Programm braucht auch unsere Applikation ein
Window um Nachrichten empfangen und bearbeiten zu können. Dieses Fenster
wird später mit DirectX verbunden.
Da dieser Teil eigentlich übliche Windows-Programmierung ist gehe ich
hier nicht weiter auf Details ein, sondern stelle nur kurz den Code vor.
[Quellcode 1]
Natürlich brauchen wir für unser Fenster eine WindowProc()-Funktion,
die auf eingehende Nachrichten von Windows reagiert. Die wichtigste
Nachricht, die uns interessiert ist WM_KEYDOWN, die Tastendrücke meldet,
denn auf Druck von [ESC] wollen wir unser Programm beenden.
[Quellcode 2]
Um Grafik mit DirectX darstellen zu können bedient man sich dem
Bestandteil Direct3D.
Davon müssen wir also eine Instanz erzeugen und danach mittels Methoden von
Direct3D ein Device erstellen, in dem wir dann zeichnen können.
Erzeugen einer Instanz von Direct3D
Das ist eine einfache Aufgabe und benötigt eigentlich nur eine Zeile
Code, in der wir die Funktion Direct3DCreate8() aufrufen.
[Quellcode 3]
Ein Direct3DDevice erstellen
Um ein Device zu erstellen müssen wir eine Struktur ausfüllen, die die
Eigenschaften unseres Device genauer beschreibt. Schauen wir uns die
einzelnen Eigenschaften einmal genauer an.
| Windowed |
Gibt an, ob unser
Programm im Fenster oder Vollbildmodus laufen soll. |
| hDeviceWindow |
Dies ist das Handle
unseres Hauptfensters, mit dem wir das Device verbinden wollen. |
| BackBufferCount |
Gibt die Anzahl der
Backbuffer an. Geben wir hier eine 1 an, so haben wir einen Frontbuffer und einen Backbuffer, die wir für
Double Buffering benutzen können. |
| SwapEffect |
Gibt an, was mit dem
Frontbuffer passiert, wenn er zum Backbuffer wird.
Bei D3DSWAPEFFECT_DISCARD wird der Inhalt als
unwichtig angesehen und man kann sich nicht darauf verlassen, dass
dieser so im Backbuffer ankommt, wie er als Frontbuffer einmal war.
Für unseren Fall ist das kein Problem, denn wir füllen den
Backbuffer ja jedes Mal komplett mit einer Farbe auf.
|
| BackBufferWidth
BackBufferHeight |
Diese beiden Werte
geben die Größe des Backbuffers an. In der Regel ist der Backbuffer
genauso groß, wie der Frontbuffer, also die Auflösung, in der das
Programm laufen soll. |
| BackBufferFormat |
Gibt an, in welchem
Pixelformat der Backbuffer angelegt werden soll. D3DFMT_R5G6B5
bedeutet, das 5 Bit für Rot, 6 Bit für Grün und 5 Bit für Blau zur
Verfügung stehen. Dieses Format wird von praktisch allen aktuellen
Grafikkarten unterstützt. |
Jetzt können wir die Struktur mit den entsprechenden Werten füllen und
dann das Device mittels CreateDevice() erzeugen.
[Quellcode 4]
In der Hauptschleife unseres Programms machen wir nichts weiter, als
zwischen dem Backbuffer und dem Frontbuffer hin- und herzuschalten und
diesen jeweils mit einer Hintergrundfarbe zu füllen. Das Ganze passiert
solange bis der Benutzer das Programm beendet, also durch Druck auf [ESC] in
der WindowProc() g_Quit auf true gesetzt wird.
Das Füllen des Hintergrunds geschieht mittels der Methode Clear() des
Direct3DDevice. Wir verändern die Hintergrundfarbe jedes Mal ein wenig,
damit man auch sieht, das sich etwas tut.
Zwischen den beiden Buffern umzuschalten erledigt die Methode Present(),
die ebenfalls zum Direct3DDevice gehört.
[Quellcode 5]
Jetzt haben wir alles zusammen, um Grafik anzuzeigen, aber wir wollen
unser Programm natürlich auch wieder verlassen können und müssen deshalb die
belegten Ressourcen wieder freigeben.
Das Abmelden von DirectX ist ähnlich unkompliziert, wie das Anmelden.
Zuerst wird das Device mittels Release() freigeben, anschließend Direct3D
ebenfalls mittels Release().
[Quellcode 6]
Zu guter Letzt melden wir auch noch unser Fenster ab und haben damit alle
belegten Ressourcen freigegeben und können das Programm verlassen.
[Quellcode 7]
Nun haben wir die Basis für die folgenden Teile der Einführung.
Alles zusammen genommen ergibt folgendes Programm:
[Quellcode Gesamt]
|