• Keine Ergebnisse gefunden

Kontakt und Updates

2.4 Initialisierung von Direct3D

2.4.5 Erstellen der IDirect3DDevice9-Schnittstelle

2.4.5.3 Die Präsentationsparameter

Kommen wir nun zum nächsten und damit zum wichtigsten Parameter der CreateDevice -Methode: Die Präsentationsparameter enthalten Daten wie den zu verwendenden Videomodus oder das Z-Buffer-Format und sind in der Struktur D3DPRESENT_PARAMETERS angelegt. Diese kor-rekt auszufüllen ist eine sehr wichtige Aufgabe, und hieran kann alles scheitern, wenn auch nur ein kleiner Fehler gemacht wird.

Tabelle 2.13 Die Elemente der Struktur D3DPRESENT_PARAMETERS

Element Beschreibung UINT BackBufferWidth,

UINT BackBufferHeight

Breite (width) und Höhe (height) des Bildpuffers und damit auch des zu verwendenden Videomodus

D3DFORMAT BackBufferFormat Format des Bildpuffers (zum Beispiel D3DFMT_X8R8G8B8 für 32 Bits pro Pixel)

UINT BackBufferCount Anzahl der Bildpuffer (1 bis 3; mehr dazu später) D3DMULTISAMPLE_TYPE

MultiSampleType

Typ des Multi-Samplings (mehr dazu später)

Element Beschreibung

DWORD MultiSampleQuality Qualität des Multi-Samplings (mehr dazu später)

D3DSWAPEFFECT SwapEffect Beschreibt, wie das Tauschen des Bildpuffers mit dem Videospei-cher geschehen soll (mehr dazu später)

HWND hDeviceWindow Handle des zu verwendenden Fensters oder NULL für das Fenster, das gerade den Fokus hat

BOOL Windowed TRUE für Fenstermodus, FALSE für Vollbildmodus

BOOL EnableAutoDepthStencil Gibt an, ob Direct3D automatisch einen Z-Stencil-Buffer erzeugen soll oder nicht.

D3DFORMAT

AutoDepthStencilFormat

Wenn das vorherige Element TRUE ist, beschreibt AutoDepthStencilFormat das Format des automatisch zu erstel-lenden Z-Stencil-Buffers, wie zum Beispiel D3DFMT_D24S8 für 24 Bits Z-Buffer und 8 Bits Stencil-Buffer.

DWORD Flags Geben Sie hier D3DPRESENTFLAG_LOCKABLE_BACKBUFFER an, um später die Bildpufferoberfläche sperren zu können (für direkten Zugriff). Die DirectX-Dokumentation weist darauf hin, dass man mit Einbußungen bezüglich der Performance rechnen muss.

Wenn Sie D3DPRESENTFLAG_DISCARD_DEPTHSTENCIL angeben, wird der Z-Stencil-Buffer nach jeder 3D-Szene (also nach jedem Bild) ungültig gemacht (mit „Schrott“ gefüllt). Die Grafikkarte muss dann nicht darauf achten, dass sein Inhalt unverändert bleibt. Dies kann die Performance erhöhen. Nicht kombinierbar mit dem Z-Stencil-Buffer-Format D3DFMT_D16_LOCKABLE.

Beide Flags sind durch den „|“-Operator miteinander kombinierbar.

UINT

FullScreen_RefreshRateInHz

Die Bildwiederholfrequenz des gewünschten Vollbildvideomodus in Hz oder D3DPRESENT_RATE_DEFAULT für die Standardfrequenz.

Wenn Sie eine explizite Frequenz angeben, sollte das eine solche sein, die vorher beim Auflisten der Videomodi gefunden wurde.

UINT PresentationInterval D3DPRESENT_INTERVAL_DEFAULT, andernfalls sind noch D3DPRESENT_INTERVAL_ONE bis D3DPRESENT_INTERVAL_FOUR oder D3DPRESENT_INTERVAL_IMMEDIATE möglich. ONE bis FOUR geben an, dass der Bildpuffer nicht öfters als alle ein bis vier Bildwiederholun-gen angezeigt wird. IMMEDIATE zeigt den Bildpuffer immer sofort an, ohne auf den vertikalen Strahlrücklauf zu warten, was zu einem Verzerrungseffekt führen kann. So kann man jedoch die maximale Framerate erzielen.

Multi-Sampling (Anti-Aliasing)

Die Aufgabe des Rasterizers ist bekanntlich unter anderem, die exakten Vektorkoordinaten auf das relativ ungenaue Pixelraster abzubilden. Dabei entscheiden oft kleinste Unterschiede in den Vektorkoordinaten, ob zum Beispiel Pixel (100, 50) oder Pixel (101, 50) gezeichnet wird.

Oft wirkt dadurch das Bild vor allem bei niedrigen Auflösungen sehr „pixelig“. Eine Technik namens Multi-Sampling schafft da einen Ausweg: Punkte, die nicht genau in die Mitte eines Pixels treffen, werden dadurch auf die umgebenden Pixel verteilt. Das kann zum Beispiel da-durch erreicht werden, das gesamte Bild in einer höheren Auflösung zu rendern und es dann nachher wieder zu verkleinern (Super-Sampling). Selbst kleinste Details werden dabei sicht-bar, und alles erscheint sehr glatt. Diese Technik ist auch als Anti-Aliasing oder Kantenglät-tung bekannt.

Abbildung 2.19 Der rechte Kreis ist geglättet, der linke nicht.

Wie stark die Glättung ist, wird im Element MultiSampleType der Präsentationsstruktur angege-ben. Der Wert D3DMULTISAMPLE_NONE bedeutet, dass überhaupt keine Glättung durchgeführt wird. D3DMULTISAMPLE_2_SAMPLES bis D3DMULTISAMPLE_16_SAMPLES geben dann die Anzahl der Samples (Durchgänge) an. Dabei gilt: Je höher, desto glätter, und je niedriger, desto schneller.

Es hängt von der Hardware ab, welche Typen verfügbar sind.

Weiterhin gibt es noch D3DMULTISAMPLE_NONMASKABLE. Dieses wird für spezielle hardwarespezifi-sche Multi-Sampling-Verfahren verwendet, die sich nicht in die Kategorien 2 Samples, 3 Samples und so weiter einordnen lassen.

Das zweite Element der Präsentationsstruktur, welches mit Multi-Sampling zu tun hat, ist

MultiSampleQuality vom Typ DWORD. Dadurch wird die Qualität des Multi-Samplings beschrie-ben. Klar ist: Je höher die Qualität, desto langsamer. Nicht alle Grafikkarten unterstützen meh-rere Qualitätsstufen. Wir werden später sehen, wie man alle Möglichkeiten herausfindet.

Mit Multi-Sampling kann man sein Programm übrigens in weitaus niedrigeren Auflösungen laufen lassen als ohne und trotzdem noch eine gute Bildqualität erwarten. Alles erscheint so glatt, dass einzelne Pixel kaum noch sichtbar sind. Ein gutes Beispiel ist das Nintendo 64 – viele Spiele laufen darauf mit einer Auflösung von nur 320 x 240, und trotzdem sehen die Gra-fiken dank Anti-Aliasing sehr gut aus.

Mehrere Bildpuffer?

Wie Sie vielleicht bemerkt haben, lässt sich die Anzahl der Bildpuffer in der Präsentations-struktur angeben. Doch wozu sollen mehrere Bildpuffer gut sein?

Wenn es mehrere Bildpuffer gibt, hat die Anwendung beziehungsweise das Spiel die Möglichkeit, einige Bilder im Voraus zu rendern – sozusagen als Reserve für schlechte Zeiten. Schlechte Zeiten sind in dem Fall Szenen, bei denen es schnell schon mal zu einem kleinen Ruckeln kommen kann.

Man kann dann schon mit dem nächsten Bild beginnen, während das andere noch gar nicht ange-zeigt wurde (weil zum Beispiel der vertikale Strahlrücklauf noch nicht eingetreten ist).

Tauschen und Kopieren der Bildpuffer

Es gibt verschiedene Möglichkeiten, wie man den Bildpuffer sichtbar machen kann. Welche angewandt wird, bestimmt das Element SwapEffect der Präsentationsstruktur. Es gibt folgende Möglichkeiten:

ƒ D3DSWAPEFFECT_DISCARD: Normalerweise wird garantiert, dass der Inhalt des Bildpuffers un-angerührt bleibt, während er sichtbar gemacht wird. Dies zu bewerkstelligen kann jedoch ein wenig Performance kosten. Wenn D3DSWAPEFFECT_DISCARD angegeben wird, sagen wir Direct3D damit, dass es uns völlig egal ist, was mit dem Bildpuffer nach dem Kopieren in den Videospeicher geschieht, und erleichtern damit der Grafikkarte die Arbeit ein wenig.

D3DSWAPEFFECT_DISCARD ist außerdem die einzige Möglichkeit, wenn Multi-Sampling zum Einsatz kommen soll.

ƒ D3DSWAPEFFECT_FLIP: Wenn mehrere Bildpuffer verwendet werden, ist dieses Flag eine gute Wahl. Die Bildpuffer werden in einer Art von Kreislauf organisiert: Wenn der vorderste,

der gerade das aktuelle Bild enthält, sichtbar gemacht wurde, rückt er wieder an die hin-terste Stelle, und alle anderen rücken eine Stelle vorwärts.

ƒ D3DSWAPEFFECT_COPY: Nur für einen einzelnen Bildpuffer geeignet. Direct3D kopiert hier ein-fach den Inhalt des Bildpuffers in den Videospeicher oder in den Zeichenbereich des Ziel-fensters, ohne dass der Bildpuffer verändert wird. Ob dabei vertikale Strahlsynchronisation zum Einsatz kommt, hängt vom Präsentationsintervall (PresentationInterval) ab.