3D-Spieleprogrammierung mit DirectX 9 und C++

David Scherfgen

3D-Spieleprogrammierung mit DirectX 9 und C++

2006

867 Seiten

Format: PDF, Online Lesen

E-Book: €  31,99

E-Book kaufen

E-Book kaufen

ISBN: 9783446408456

 

3 3D-Grafik mit der TriBase-Engine (S. 274-275)

3.1 Was Sie in diesem Kapitel erwartet

Nun sind alle grundlegenden Direct3D-Themen abgehandelt. Wir beschäftigen uns jetzt damit, wie man sich die Arbeit mit Direct3D ein wenig erleichtern kann – nämlich durch die Einführung einer Klasse für 3D-Grafik in der TriBase-Engine. Sie werden zum Beispiel lernen, wie man Modelldateien lädt oder Texte darstellt. Diese Techniken werden später zur Erstellung der Spiele verwendet.

3.2 Direct3D mit der TriBase-Engine
Sie haben nun die wichtigsten Dinge über Direct3D gelernt. Natürlich war das noch längst nicht alles, doch sehen Sie bitte ein, dass es unmöglich ist, alle Themen in einem Buch zu behandeln, das einen möglichst breitflächigen Überblick über das große Gebiet der Spieleprogrammierung vermitteln soll. Wer genauer wissen möchte, wie Direct3D im Inneren funktioniert und welche weiteren Techniken es bietet, sollte sich unbedingt Literatur speziell über das Thema Direct3D anschaffen (zum Beispiel vom Microsoft Press-Verlag). Nun, da Sie einen Überblick über Direct3D erhalten haben, können wir damit beginnen, die TriBase-Engine so zu erweitern, dass viele Arbeitsschritte vereinfacht werden können.

3.2.1 Was uns das Leben leichter machen kann
3.2.1.1 Automatische Initialisierung von Direct3D
Die bisherigen Beispielprogramme verwendeten alle die Dateien INITWINDOW.CPP, INITDIRECT3D. CPP und DIRECT3DENUM.CPP. Mit den in diesen Dateien enthaltenen Funktionen wurde dann ein Fenster erstellt, der Direct3D-Konfigurationsdialog angezeigt, und schließlich wurden alle für die Arbeit mit Direct3D notwendigen Schnittstellen erzeugt, so dass sich die Beispielprogramme auf das Wesentliche beschränken konnten. Den Konfigurationsdialog werden wir auch für die TriBase-Engine übernehmen, und auch die Initialisierung wird ähnlich vonstatten gehen. Wichtig ist, dass der Benutzer stets freie Kontrolle über die verwendete Auflösung, den Direct3D-Adapter, die Oberflächenformate und sonstige Einstellungen hat, um für sich die optimale Kombination finden zu können. Die neue Funktion zum Aufrufen des Konfigurationsdialogs – der nicht nur für Direct3D zuständig sein wird – heißt tbDoConfigDialog. Die Konfigurationsstruktur heißt nun tbConfig und besteht aus Unterstrukturen, wovon eine den Namen Direct3D trägt; darin befinden sich alle wichtigen Direct3D-Einstellungen wie Adapter, Videomodus oder Oberflächenformate.

3.2.1.2 Statusänderungen minimieren

Immer wenn wir ein Render- oder ein Texturschicht-State, eine Matrix, eine Lichtquelle, ein Material, eine Textur oder Sonstiges mit irgendeiner Set-Methode der IDirect3DDevice9- Schnittstelle aktivieren, muss Direct3D das dem Grafikkartentreiber mitteilen, der es wiederum – je nach Art der Änderung – an die Grafikkarte weiterleitet. Vor allem beim Setzen einer neuen Textur, die vielleicht noch im Systemspeicher wartet und dann zur Grafikkarte transferiert werden muss, kann dabei eine Menge Zeit verloren gehen. Daher sollte man als „umweltbewusster" Programmierer immer darauf achten, nicht unnötig viele Änderungen vorzunehmen (zum Beispiel Alpha-Blending ein- und direkt danach wieder auszuschalten).

Die Direct3D-Komponente der TriBase-Engine werden wir daher so entwerfen, dass sie unnötige – doppelte – Statusänderungen wie Render-States, Texturen oder was auch immer automatisch erkennt und gar nicht erst an die Geräteschnittstelle weiterleitet. Es wird dazu eine interne Tabelle mit den Werten aller Render- und Texturschicht-States, Texturen und dem aktuellen Vertexformat angelegt, welche die Engine stets aktualisiert und zum Vergleich heranzieht, wenn ein neuer Status gesetzt werden soll. Wenn dieser dann bereits in der Tabelle steht, wäre es unsinnig, ihn erneut zu aktivieren.

Nach Angaben von Microsoft sollte man sich niemals darauf verlassen, dass der Grafikkartentreiber sich um solche Probleme kümmert – also lieber selbst die Initiative ergreifen!

3.2.1.3 Texturverwaltung

Oft kann es vorkommen, dass ein Spiel Ressourcen verschwendet, indem es bestimmte Texturen zweimal lädt (wenn zum Beispiel zwei verschiedene 3D-Modelle die gleiche Textur verwenden). Um das zu verhindern, werden wir eine automatische Texturverwaltung implementieren, bei welcher das Programm Texturen anfordern und später wieder löschen kann. Existiert eine angeforderte Textur noch nicht, wird sie geladen – andernfalls wird die bereits geladene Textur zurückgeliefert. Die Texturverwaltung wird vollen Gebrauch von der TriBase- Klasse tbVFile machen. Erinnern Sie sich noch an diese Klasse? Mit ihr können wir virtuelle Dateien aus echten Dateien, aus dem Speicher, aus Ressourcen und aus eventuell verschlüsselten Zip-Archiven laden und alle auf die gleiche Weise behandeln.

3.2.1.4 Vertex- und Index-Buffer einfacher erstellen

Oftmals schreckt man vor der Arbeit mit Vertex- und Index-Buffern zurück, da sie immer einen gewissen Arbeitsaufwand mit sich bringen: Erst muss man sie mühsam erstellen, dann sperren, mit Daten füllen, wieder entsperren, vor dem Zeichnen als Datenstromquelle festlegen und am Ende wieder freigeben. Wie Sie vielleicht bemerkt haben, habe auch ich mich um die Vertex- und Index-Buffer gedrückt, wenn es ging: Die meisten Beispielprogramme, die nur wenige Primitiven zu zeichnen hatten (zum Beispiel ein Rechteck), legten die Vertizes lieber im Systemspeicher an, als dafür Puffer zu erstellen.

Dem soll nun ein Ende gemacht werden, indem wir zwei Klassen für Vertex- und Index- Buffer implementieren werden. Ein einfacher Aufruf des Konstruktors soll dabei reichen, um einen Puffer generieren zu lassen, und auch das Füllen mit Daten soll wesentlich einfacher werden.

 

© 2009-2024 ciando GmbH