Das erste Dreieck
So jetzt kommen wir endlich dazu Primitiven auf dem Bildschirm auszugeben. Primitiven werden in DirectX durch Eckpunkte, die sogenannten Vertices, beschreiben (Singular: Vertex). Wir benutzen hier vortransformierte Vertices, die nicht erst noch über die T&L-Pipeline geschickt werden müssen. Dafür lassen sie sich aber auch nicht in skalieren, rotieren oder transformieren. Vortransformierte Vertices lassen sich gut für z.B. GUIs verwenden.
Erstmal deklarieren wir eine Vertexstruktur. Hierfür benutzen wir die von DirectX bereitgestellte Klasse CustomVertex und deklarieren ein Array mit 3 Vertices - für jeden Eckpunkt einen.
D3DWindow.cs:
private CustomVertex.TransformedColored[] m_TriangleVertices = new CustomVertex.TransformedColored[3];
Um die Instanz mit Werten zu füllen schreiben wir uns eine Funktion mit dem Namen InitTriangle, die am in der Hauptfunktion aufgerufen wird.
D3DWindow.cs:
public void InitTriangle() { m_TriangleVertices[0].Position = new Vector4(250f, 100f, 0f, 1f); m_TriangleVertices[0].Color = Color.Red.ToArgb(); m_TriangleVertices[1].Position = new Vector4(350f, 300f, 0f, 1f); m_TriangleVertices[1].Color = Color.Green.ToArgb(); m_TriangleVertices[2].Position = new Vector4(150f, 300f, 0f, 1f); m_TriangleVertices[2].Color = Color.Blue.ToArgb(); }
Die Position wird mit einem 4-Dimensionalen Vektor angegeben. Die Vector4-Klasse wird von DirectX bereitgestellt. Um sie bentzen zu können muss zum Projekt eine Referenz auf die Assembly Microsoft.DirectX hinzugefügt werden und folgende Zeile muss an den Anfang geschrieben werden:
D3DWindow.cs:
using Microsoft.DirectX;
Die ersten beiden Dimensionen beschreiben die X- und Y-Koordinate, die 3 Dimension hat keinen Wert und die 4. beschreibt den Abstand des Vertex zum Bildschirm. Um einen besseren Eindruck zu gewinnen empfiehlt es sich einfach mal ein bisschen mit den Werten zu spielen.
Jetzt muss nurnoch die Renderfunktion verändert werden.
D3DWindow.cs:
public void Render() { if (m_Device == null) return; m_Device.Clear(ClearFlags.Target, Color.Black, 0, 1); m_Device.BeginScene(); m_Device.VertexFormat = CustomVertex.TransformedColored.Format; m_Device.DrawUserPrimitives(PrimitiveType.TriangleList, 1, m_TriangleVertices); m_Device.EndScene(); m_Device.Present(); }
BeginScene() und EndScene() geben an, von wann bis wann in den Backbuffer gerendert wird. Als Vertexformat wird das der von uns benutzen VertexStruktur genommen, damit Direct3D weiß, wie die Vertices zu verarbeiten sind. Die Funktion DrawUserPrimitives() zeichnet das Dreieck in den Backbuffer. Der erste Parameter gibt an wie gezeichnet wird; PrimitiveType.TriangleList zeichnet einzelne Dreiecke. Der zweite Parameter gibt an viel viele Primitiven gezeichnet werden sollen, und der letzte Parameter übergibt schließlich die Daten.
Jetzt noch kompilieren und fertig :)
Downloads
Source & Binaries [Download]