• Keine Ergebnisse gefunden

Beispielprogramm: eine komplette Direct3D-Anwendung

Kontakt und Updates

2.4 Initialisierung von Direct3D

2.4.7 Beispielprogramm: eine komplette Direct3D-Anwendung

Listing 2.56 Erstellen der Geräteschnittstelle IDirect3DDevice9

Mit dem Aufruf von CreateDevice schaltet Direct3D automatisch in den entsprechenden Voll-bildmodus um, falls das Windowed-Element der Präsentationsstruktur auf FALSE gesetzt ist, und beim Programmende wird der ursprüngliche Videomodus wiederhergestellt – darum müssen wir uns also nicht selbst kümmern.

2.4.6 Direct3D herunterfahren

Am Anfang des Spiels wird Direct3D initialisiert, am Ende wieder heruntergefahren, und wie Letzteres funktioniert, werden wir uns jetzt anschauen. Sicherlich erinnern Sie sich noch an die Release-Methode, die Eigentum aller COM-Schnittstellen ist. Genau diese verwenden wir auch, um Direct3D herunterzufahren. Was wir tun müssen ist, Release auf der IDirect3D9- und der IDirect3DDevice9-Schnittstelle aufzurufen, wobei die Reihenfolge keine Rolle spielt. Den-ken Sie immer daran: Eine nicht freigegebene Schnittstelle wird mit großer Wahrscheinlich-keit in einem Speicherleck enden. Dagegen kann auch die TriBase-Engine ohne zusätzliche Überwachungsfunktionen nichts tun. Um das Aufräumen von Direct3D kümmert sich die sehr einfach gestrickte Funktion ExitDirect3D:

// Funktion zum Herunterfahren der Direct3D-Komponente tbResult ExitDirect3D()

{

// Schnittstellen abbauen TB_SAFE_RELEASE(g_pD3D);

TB_SAFE_RELEASE(g_pD3DDevice);

return TB_OK;

}

Listing 2.57 Höfliches Herunterfahren von Direct3D

2.4.7 Beispielprogramm: eine komplette Direct3D-Anwendung

Das zweite komplette Beispielprogramm dieses Kapitels verwendet zuerst die Funktion

GetDirect3DParameters, um den Einstellungsdialog anzuzeigen und um die Wahl des Benutzers festzuhalten. Anschließend wird mit InitWindow ein Fenster in der entsprechenden Größe gene-riert, und danach initialisiert das Programm Direct3D mit einem Aufruf der Funktion

InitDirect3D. Nun wird – wie üblich – die Nachrichtenschleife ausgeführt. Die Render- und Move-Funktionen sind dabei noch leer. Am Ende wird alles wieder schön ordentlich aufge-räumt – also eine komplette kleine Direct3D-Anwendung, die allen nachfolgenden Beispiel-programmen als Grundgerüst dient.

// Beispielprogramm 02 // ===================

// Auflisten aller Direct3D-Optionen und anschließende Erstellung // einer Geräteschnittstelle (IDirect3DDevice9).

// Zu den Optionen gehören unter anderem:

// - Adapter und Gerätetyp // - Videomodi

// - Multi-Sampling-Typen und -Qualitätsstufen // - Hardware- oder Softwareverarbeitung?

#include <Windows.h>

// TriBase-Engine initialisieren tbInit();

// Direct3D-Optionen abfragen (vom Benutzer gewählt) SDirect3DParameters Direct3DParameters;

tbResult Result = GetDirect3DParameters(&Direct3DParameters);

if(Result == TB_ERROR) {

// Es trat ein Fehler auf!

MessageBox(NULL, "Fehler beim Abzählen!", "Fehler", MB_OK | MB_ICONEXCLAMATION);

// Fenster initialisieren. Die Größe hängt vom gewählten // Videomodus ab, der in der Parameterstruktur gespeichert ist.

if(InitWindow(Direct3DParameters.VideoMode.Width, Direct3DParameters.VideoMode.Height,

"Beispielprogramm Nr. 2: Direct3D-Abzählung", LoadIcon(hInstance, MAKEINTRESOURCE(IDI_ICON1)))) {

// Fehler beim Erstellen des Fensters!

MessageBox(NULL, "Fehler beim Erstellen des Fensters!", "Fehler", MB_OK | MB_ICONEXCLAMATION);

tbExit();

return 1;

}

// Direct3D mit den abgefragten Einstellungen initialisieren if(InitDirect3D(&Direct3DParameters,

g_hWindow)) {

// Fehler!

MessageBox(g_hWindow, "Fehler beim Initialisieren von Direct3D!", "Fehler", MB_OK | MB_ICONEXCLAMATION);

ExitWindow();

tbExit();

return 1;

}

// Nachrichtenschleife tbDoMessageLoop(Render, Move);

// Direct3D und Fenster herunterfahren ExitDirect3D();

ExitWindow();

// Engine herunterfahren tbExit();

return 0;

}

Listing 2.58 Eine komplette kleine Direct3D-Anwendung mit Einstellungsdialogfenster

Wenn Sie im Einstellungsdialog die Option Vollbildmodus wählen, ist es sehr schwer, das Fenster und damit auch das Programm nur mit Hilfe der Maus zu schließen. Verwenden Sie in dem Fall die Tastenkombination [Alt]+[F4], die für alle Windows-Programme und auch für Windows selbst gilt.

2.4.8 Rückblick

Dieser Teil des Kapitels ist wohl der trockenste von allen gewesen, denn die Initialisierung von Direct3D will gelernt sein, und es dauert auch seine Zeit, all die wichtigen Direct3D-Grundprinzipien durchzugehen – Direct3D ist eben die komplexeste Komponente von allen.

Es verbergen sich vor allem in der Initialisierung viele Hürden, über die schon so mancher Programmierer gestolpert ist.

Ich verspreche Ihnen, dass es schon sehr bald viel aufregender werden wird. Hier trotzdem noch einmal ein kleiner Rückblick: Wie geht man bei der Direct3D-Initialisierung vor?

ƒ Zu Beginn wird mit der Funktion Direct3DCreate9 eine Schnittstelle vom Typ IDirect3D9 erzeugt. Wir brauchen sie vor allem am Anfang der Anwendung, wenn es um das Abfra-gen der Adapter und ihrer Fähigkeiten geht.

ƒ Nun kommt die Phase der Abzählung. Die verschiedensten Dinge werden mit Hilfe dieser eben generierten Schnittstelle abgezählt: Adapter, ihre Videomodi, Bildpuffer- und Z-Stencil-Buffer-Formate, Multi-Sampling-Typen und Multi-Sampling-Qualitätsstufen. Dem Benutzer sollte man all diese Dinge übersichtlich in einem Dialogfeld präsentieren und bei

jeder Kombination prüfen, ob sie überhaupt gültig ist. Es existiert eine Prüfmethode für je-den Fall: Beispielsweise wendet man IDirect3D9::CheckDeviceMultiSampleType an, um ei-nen Adapter und ein Gerät auf eiei-nen bestimmten Multi-Sampling-Typ hin zu testen.

ƒ Sind alle Parameter festgelegt und überprüft worden, geht es an die Erstellung der Geräte-schnittstelle IDirect3DDevice9, die den gewählten Adapter und den Gerätetyp repräsentiert.

ƒ Die Hilfsfunktionen GetDirect3DParameters, InitDirect3D und InitWindow, die nicht Teil der TriBase-Engine sind, sondern speziell für die Beispielprogramme, die ohne den Teil der Engine geschrieben sind (erst im nächsten Kapitel werden wir Direct3D-Unterstützung zur Engine hinzufügen), bieten eine hervorragende Möglichkeit zur schnel-len, sicheren und effizienten Initialisierung von Direct3D und des dazugehörigen Fensters.

2.4.9 Übungsaufgaben

1. Schreiben Sie ein Konsolenprogramm, das alle Direct3D-Adapter auflistet. Es sollen Na-me, Treiber und Treiberversion angezeigt werden.

2. Erweitern Sie das Programm aus der ersten Aufgabe so, dass der Benutzer einen Adapter durch Eingabe der entsprechenden Zahl (1: erster Adapter, 2: zweiter Adapter …) wählen kann. Das Programm soll nun alle Videomodi des Adapters auflisten, die zu dem Format

D3DFMT_X8R8G8B8 (32 Bits) kompatibel sind. Schaffen Sie es, eine Funktion zu schreiben, die einen D3DFORMAT-Parameter erwartet und einen String zurückliefert, der eine kleine Be-schreibung des Formats beinhaltet?

Tipp: Verwenden Sie IDirect3D9::GetAdapterModeCount und EnumAdapterModes.