Direct3D initalisieren

Zuerst müssen wir ein Device initalisieren. Ein Device ist die Schnittstelle mit dem wir mit der Grafikkarte kommunizieren können. Um DirectX, bzw. in diesem Fall Direct3D nutzen zu können muss eine Referenz zur Microsoft.DirectX.Direct3D-Assembly in der IDE erstellt werden.

Dann müssen wir Direct3D nutzbar machen. Dazu wird am Anfang der D3DWindow.cs folgende Codezeile hinzugefügt:

D3DWindow.cs:

using Microsoft.DirectX.Direct3D;

Jetzt müssen wir als erstes ein Device in unserer D3DWindow-Klasse deklarieren.

D3DWindow.cs:

private Device m_Device = null;

Jetzt werden wir eine Funktion erstellen um das Device zu initalisieren.

D3DWindow.cs:

public void InitalizeDevice() { PresentParameters pParams = new PresentParameters(); pParams.Windowed = true; pParams.SwapEffect = SwapEffect.Discard; m_Device = new Device(0, DeviceType.Hardware, this, CreateFlags.SoftwareVertexProcessing, pParams); }

In der ersten Zeile wird eine Instanz der PresentParameters-Klasse erstellt. Diese Klasse beschreibt die Parameter zur Darstellung.

Die nächsten beiden Zeilen füllen die Klasse mit Inhalt. Erstmal wollen wir Direct3D im Fenstermodus nutzen. SwapEffect legt fest wie der Backbuffer gezeichnet wird. Discard bewirkt, dass der Treiber der Grafikkarte den Backbuffer auf die schnellstmöglichste Art anzeigt.

Dann wird ein neues Device erstellt. Der erste Parameter gibt die ID der Grafikkarte an. 0 ist hier der Defaultparameter, der auf die primäre Grafikkarte zugreift.

Der nächste Parameter gibt an, wie Direct3D die Bilder berechnen soll: Per Software, per Referenzrastarizer oder per Hardware, spricht Grafikkarte. Wir entscheiden uns hier für die schnellste Möglichkeit: Die Hardware.

Der dritte Parameter nimmt einen Zeiger auf die Komponente die von Direct3D benutzt wird entgegen, in diesem Fall unser Fenster.

Der vorletzte Parameter gibt an ob Hardwareseitiges T&L verwendet werden soll. Leider unterstützen nicht alle Grafikkarten dieses Feature, deswegen wird hier vorerst das Flag SoftwareVertexProcessing verwendet.

Im letzten Parameter übergeben wir eine Referent auf unsere PresentParameter-Klasse.

 

Jetzt müssen wir diese Methode in Main() aufrufen.

Main.cs

m_AppWnd.InitalizeDevice();

Das einzige was wir jetzt noch zu tun haben ist das Rendering. Zum Anfang wollen wir uns damit begnügen, dass Direct3D das Fenster in einer Farbe löscht. Zu diesem Zweck schreiben wir uns eine Funktion Render().

D3DWindow.cs

public void Render() { if(m_Device == null) return; m_Device.Clear(ClearFlags.Target, Color.DodgerBlue, 0, 1); m_Device.Present(); }

Damit diese Funktion immer beim Neuzeichen aufgerufen wird, wird sie in der Main() vor Application.DoEvents() aufgerufen.

Main.cs

while(m_AppWnd.Created) { m_AppWnd.Render(); Application.DoEvents(); }

Und Fertig.

Downloads

Source & Binaries [Download]