• Keine Ergebnisse gefunden

Kontakt und Updates

2.4 Initialisierung von Direct3D

2.4.5 Erstellen der IDirect3DDevice9-Schnittstelle

2.4.5.4 Unterstützung abfragen

Bevor man nun in die Präsentationsstruktur irgendwelche Werte wie zum Beispiel die Multi-Sampling-Qualität einträgt, sollte man – wenn man Wert darauf legt, dass das Programm spä-ter auf möglichst vielen Rechnern läuft – erst einmal herausfinden, was genau unspä-terstützt wird und was nicht. Das gilt auch für Z-Buffer-Formate.

Beim Videomodus müssen wir uns keine Sorgen machen, und damit auch nicht beim Bildpuf-ferformat, denn beides haben wir vorher durch Abzählen erhalten, und es wird natürlich nur das abgezählt, was die Grafikkarte auch unterstützt.

Eine gute Überprüfung vor der Initialisierung von Direct3D ist das A und O jeder Direct3D-Initialisierungsfunktion. Wird hier schlampig gearbeitet, hat das zur Folge, dass das Programm möglicherweise auf vielen PCs nicht funktioniert, und das nur, weil das Programm nicht flexi-bel genug war. Es gilt der Grundsatz: Das Programm muss mit der Grafikkarte zurechtkom-men und nicht umgekehrt – kaum ein Benutzer wird sich wegen eines einzelnen Spiels gleich eine neue Grafikkarte zulegen.

Gerätetyp

Auch das Vorhandensein eines hardwarebeschleunigten Gerätetyps (D3DDEVTYPE_HAL) ist nicht unbedingt als hundertprozentig sicher anzusehen. Hier kommt erneut die Methode

IDirect3D9::GetDeviceCaps zum Einsatz. Man wendet sie einfach auf den gewünschten Geräte-typ an und fragt das Ergebnis ab. Falls es D3DERR_INVALIDDEVICE ist, dann ist der Gerätetyp auf dem angegebenen Adapter nicht verfügbar. Ist die Methode erfolgreich ausgeführt, so ist die-ser Gerätetyp verwendbar.

Bildpuffer- und Z-Stencil-Buffer-Format

Obwohl man bei dieser Art von Oberflächen kaum sagen kann, dass es dort eine riesige For-matauswahl gebe, darf man sich nicht darauf verlassen, dass jedes Format auf jeder Grafikkar-te verfügbar ist. Auch hängt es nicht nur vom Typ der GrafikkarGrafikkar-te ab, ob ein Format unGrafikkar-ter- unter-stützt wird, sondern auch vom verwendeten Videomodus und – im Fall des Z-Stencil-Buffer-Formats – auch vom Bildpufferformat.

Erst einmal sollte man die Methode IDirect3D9::CheckDeviceFormat verwenden, um herauszu-finden, ob das Format überhaupt irgendwie unterstützt wird. Dann folgt noch ein weiterer Schritt, um sich endgültig zu vergewissern. Die CheckDeviceFormat-Methode verwendet man nicht nur für Z-Stencil-Buffer, sondern für alle möglichen Typen von Ressourcen, auch für den Bildpuffer.

Tabelle 2.14 Die Parameter der Methode IDirect3D9::CheckDeviceFormat Parameter Beschreibung UINT Adapter ID des Adapters, auf dem getestet wird D3DDEVTYPE DeviceType Gerätetyp (zum Beispiel D3DDEVTYPE_HAL)

Parameter Beschreibung

D3DFORMAT AdapterFormat Format des Videomodus, in den der Adapter während der Anwendung gesetzt sein wird, oder der aktuelle Videomodus, falls man im Fenster-modus arbeitet.

DWORD Usage Verwendungszweck für das Format:

ƒ D3DUSAGE_RENDERTARGET: Oberfläche, auf die gerendert werden kann (zum Beispiel der Bildpuffer)

ƒ D3DUSAGE_DEPTHSTENCIL: Z-Stencil-Buffer

D3DRESOURCETYPE RType Typ der Ressource. Hier geben wir D3DRTYPE_SURFACE an, um das For-mat im Zusammenhang mit einer normalen Oberfläche zu testen. Nicht nur Oberflächen haben ein Format, sondern auch noch andere Ressour-cen.

D3DFORMAT CheckFormat Dies ist das eigentliche Format, das geprüft wird. Direct3D testet, ob es auf dem angegebenen Adapter und mit dem gewählten Gerätetyp als Bildpuffer/Z-Stencil-Buffer/… in Form einer bestimmten Ressource (zum Beispiel einer Oberfläche) einsetzbar ist.

Wenn die Methode IDirect3D9::CheckDeviceFormat vom Typ HRESULT den Wert D3D_OK liefert (und nicht D3DERR_NOTAVAILABLE oder sonstiges Fehlerzeug), also das Makro SUCCEEDED an-schlägt, wissen wir, dass das getestete Format in Ordnung ist und wir mit seiner Unterstützung durch die Hardware rechnen können.

Bildpufferformat

Nachdem mit CheckDeviceFormat geprüft wurde, ob das gewünschte Bildpufferformat verfüg-bar ist, muss noch mit einer weiteren Methode getestet werden, ob auf diese Weise auch der gewünschte Gerätetyp (zum Beispiel Hardwarebeschleunigung) zur Verfügung steht. Das geht mit der Methode IDirect3D9::CheckDeviceType. Wir übergeben ihr die Adapter-ID, den Geräte-typ, das Format des Videomodus, das Format des Bildpuffers und schließlich noch einen BOOL -Wert, der beim Fenstermodus TRUE ist und beim Vollbildmodus FALSE. Wenn die Methode er-folgreich ausgeführt werden konnte, steht uns nichts mehr im Wege, und dieses Bildpuffer-format ist verwendbar. Der nächste Schritt wäre, es zur Liste der BildpufferBildpuffer-formate hinzuzu-fügen, damit der Benutzer später die Auswahl hat.

Tabelle 2.15 Die Parameter der Methode IDirect3D9::CheckDeviceType

Parameter Beschreibung

UINT Adapter ID des Adapters

D3DDEVTYPE CheckType Gerätetyp, von dem wir wissen möchten, ob er mit der angegebenen Konfiguration verfügbar ist (normalerweise D3DDEVTYPE_HAL) D3DFORMAT DisplayFormat Format des verwendeten Videomodus (im Fenstermodus: das

For-mat des aktuellen Videomodus)

D3DFORMAT BackBufferFormat Bildpufferformat, das wir verwenden möchten

BOOL Windowed TRUE, falls das Programm im Fenstermodus läuft, und FALSE im Falle des Vollbildmodus

Z-Stencil-Buffer-Format

Wie auch immer, auch beim Z-Stencil-Buffer-Format reicht CheckDeviceFormat noch nicht ganz. Es muss noch eine weitere Testmethode namens CheckDepthStencilMatch aufgerufen wer-den.

Tabelle 2.16 Die Parameter der Methode IDirect3D9::CheckDepthStencilMatch

Parameter Beschreibung

UINT Adapter ID des Adapters D3DDEVTYPE DeviceType Gerätetyp

D3DFORMAT AdapterFormat Format des Videomodus, in den der Adapter versetzt werden wird D3DFORMAT RenderTargetFormat Format der Ziel-Renderoberfläche, die das Programm verwenden

wird (nomalerweise der Bildpuffer) D3DFORMAT DepthStencilFormat Zu überprüfendes Z-Stencil-Buffer-Format

Erst wenn auch diese Methode D3D_OK zurückliefert, können wir sichergehen, dass das gewähl-te Format zum Videomodus und dem Bildpufferformat kompatibel ist. Anderenfalls sollgewähl-te es natürlich nicht verwendet werden.

Formatkonvertierung im Fenstermodus

Wie bereits angesprochen, besteht in DirectX 9 die Möglichkeit, auch im Fenstermodus ein Bildpufferformat zu verwenden, das von dem Format des aktuellen Videomodus abweicht. Es muss aber dann eine Formatkonvertierung zwischen dem aktuellen und dem gewünschten Format möglich sein. Ob das der Fall ist, erfährt man mit Hilfe der Methode

IDirect3D9::CheckDeviceFormatConversion. Sie erwartet zuerst die ID des Adapters, dann den Gerätetyp und zum Schluss zuerst das Format, welches konvertiert werden soll (also das ge-wünschte Bildpufferformat), und schließlich noch das Zielformat (das Format des aktuellen Videomodus). Liefert die Methode D3D_OK zurück, ist die Hardware fähig, die Konvertierung zu übernehmen.

Multi-Sampling

Selbst der Referenz-Rasterizer unterstützt nicht alle Typen von Multi-Sampling: Tatsächlich sind dort nur die Typen 4x und 9x implementiert (nur Microsoft weiß, warum). Viele Grafik-karten unterstützen überhaupt kein Multi-Sampling, und manche bieten eine ganze Bandbreite an Typen und Qualitätsstufen. Ob ein bestimmter Multi-Sampling-Typ verwendbar ist und wie viele Qualitätsstufen für diesen Typ existieren, findet man durch Aufrufen der Methode

IDirect3D9::CheckDeviceMultiSampleType:

Tabelle 2.17 Die Parameter der Methode IDirect3D9::CheckDeviceMultiSampleType

Parameter Beschreibung

UINT Adapter Adapter-ID D3DDEVTYPE DeviceType Gerätetyp

D3DFORMAT SurfaceFormat Format der Ziel-Renderoberfläche BOOL Windowed Fenstermodus oder Vollbildmodus?

Parameter Beschreibung D3DMULTISAMPLE_TYPE

MultiSampleType

Zu testender Multi-Sampling-Typ. D3DMULTISAMPLE_12_SAMPLES prüft zum Beispiel, ob Multi-Sampling mit 12 Samples (das ist schon sehr viel) verfügbar ist.

DWORD* pQualityLevels Zeiger auf eine DWORD-Variable, die von der Methode mit der Anzahl der für diesen Multi-Sampling-Typ verfügbaren Qualitätsstufen gefüllt wird.

Mit mindestens einer Stufe ist zu rechnen.

Wenn es beispielsweise vier Qualitätsstufen gibt, dann sind die erlauben Werte 0, 1, 2 und 3.

Auch hier gilt: Anhand des Rückgabewerts wird entschieden, ob der Multi-Sampling-Typ ver-fügbar ist oder nicht (D3D_OK: Erfolg). Sehr wichtig: Ein Multi-Sampling-Typ muss sowohl mit dem Bildpufferformat als auch mit dem Z-Stencil-Buffer-Format getestet werden. Es ist näm-lich mögnäm-lich, dass ein bestimmter Typ zum Beispiel nur bei 16-Bit-Oberflächen funktioniert.

Alles zusammen

Jetzt kennen wir alle Parameter der Methode IDirect3D9::CreateDevice, die uns das sehr wich-tige IDirect3DDevice9-Schnittstellenobjekt erzeugt. Wir wollen jetzt ein Dialogfeld erzeugen, in dem man zwischen all diesen Optionen wie Multi-Sampling oder Videomodus wählen kann.