www.jammni.de

Logo - Kleiner Drache

Logo - Drache3. Primitive zeichnen

Home >> Tutorials >> DirectX 9−Tutorial
  In diesem Kapitel werden die ersten beiden Dreiecke auf den Bildschirm gezaubert. Dreicke deshalb, weil man alle Objekte aus Dreiecken zusammenstellen kann - Linien und Punkte gibts aber selbstverständlich auch. Ein Quadrat besteht zum Beispiel aus zwei gleichen Dreiecken - wobei die Schenkellängen gleich sind. Außerdem verpassen wir den Dreiecken gleich noch einen Farbverlauf - damit es etwas bunter wird.

Zunächst gibt es aber für die Ungeduldigen erstmal wieder den kompletten Quellcode und ein kleines Bild, wie das Ergebnis später aussehen soll.

 
Bild von der Ausgabe des DirectX-Programms mit einem Viereck
Listing 5 - VertexBuffer.cs:
1:    using System;
2:    using System.Drawing;
3:    using System.Windows.Forms;
4:    using Microsoft.DirectX;
5:    using Microsoft.DirectX.Direct3D;
6:    
7:    public class VertexBufferForm : Form
8:    {
9:      // Globale Variablen
10:      Device device = null; // Das Rendering-Device
11:      VertexBuffer vertexBuffer = null;
12:    
13:      public VertexBufferForm()
14:      {
15:        // Anfangsgröße des Fensters setzen
16:        this.ClientSize = new System.Drawing.Size(300,300);
17:        // Titel des Fensters setzen
18:        this.Text = "DirectX Tutorial - VertexBuffer";
19:      }
20:    
21:      public bool InitializeGraphics()
22:      {
23:        try
24:        {
25:          // Die Hardware initialisieren und ein paar Parameter setzen
26:          PresentParameters presentParams = new PresentParameters();
27:          presentParams.Windowed=true;
28:          presentParams.SwapEffect = SwapEffect.Discard;
29:          device = new Device(0, DeviceType.Hardware, this, CreateFlags.SoftwareVertexProcessing, presentParams);
30:          vertexBuffer = new VertexBuffer(typeof(CustomVertex.TransformedColored), 6, device, 0, CustomVertex.TransformedColored.Format, Pool.Default);
31:          vertexBuffer.Created += new System.EventHandler(this.OnCreateVertexBuffer);
32:          this.OnCreateVertexBuffer(vertexBuffer, null);
33:          return true;
34:        }
35:        catch (DirectXException)
36:        {
37:          return false;
38:        }
39:      }
40:    
41:      public void OnCreateVertexBuffer(object sender, EventArgs e)
42:      {
43:        VertexBuffer vertexBuffer = (VertexBuffer)sender;
44:        GraphicsStream stm = vertexBuffer.Lock(0, 0, 0);
45:        CustomVertex.TransformedColored[] verts = new CustomVertex.TransformedColored[6];
46:    
47:        verts[0].X = 50;
48:        verts[0].Y = 50;
49:        verts[0].Z = 0.5f;
50:        verts[0].Rhw = 1;
51:        verts[0].Color = System.Drawing.Color.Blue.ToArgb();
52:        verts[1].X = 250;
53:        verts[1].Y = 50;
54:        verts[1].Z = 0.5f;
55:        verts[1].Rhw = 1;
56:        verts[1].Color = System.Drawing.Color.Red.ToArgb();
57:        verts[2].X = 50;
58:        verts[2].Y = 250;
59:        verts[2].Z = 0.5f;
60:        verts[2].Rhw = 1;
61:        verts[2].Color = System.Drawing.Color.Lime.ToArgb();
62:        verts[3].X = 250;
63:        verts[3].Y = 50;
64:        verts[3].Z = 0.5f;
65:        verts[3].Rhw = 1;
66:        verts[3].Color = System.Drawing.Color.Red.ToArgb();
67:        verts[4].X = 250;
68:        verts[4].Y = 250;
69:        verts[4].Z = 0.5f;
70:        verts[4].Rhw = 1;
71:        verts[4].Color = System.Drawing.Color.Yellow.ToArgb();
72:        verts[5].X = 50;
73:        verts[5].Y = 250;
74:        verts[5].Z = 0.5f;
75:        verts[5].Rhw = 1;
76:        verts[5].Color = System.Drawing.Color.Lime.ToArgb();
77:        stm.Write(verts);
78:        vertexBuffer.Unlock();
79:      }
80:    
81:      private void Render()
82:      {
83:        if (device == null)
84:          return;
85:    
86:        // Backbuffer löschen und gleichzeitig die Zeichenfläche blau einfärben
87:        device.Clear(ClearFlags.Target, System.Drawing.Color.Black, 1.0f, 0);
88:        // Anfang der Szene
89:        device.BeginScene();
90:    
91:        device.SetStreamSource( 0, vertexBuffer, 0);
92:        device.VertexFormat = CustomVertex.TransformedColored.Format;
93:        device.DrawPrimitives(PrimitiveType.TriangleList, 0, 2);
94:    
95:        // Ende der Szene
96:        device.EndScene();
97:        device.Present();
98:      }
99:      protected override void OnPaint(System.Windows.Forms.PaintEventArgs e)
100:      {
101:        this.Render(); // Rendern
102:      }
103:      protected override void OnKeyPress(System.Windows.Forms.KeyPressEventArgs e)
104:      {
105:        if ((int)(byte)e.KeyChar == (int)System.Windows.Forms.Keys.Escape)
106:          this.Close(); // Esc wurde gedrückt
107:      }
108:      protected void DisposeGraphics()
109:      {
110:      }
111:    
112:      // Einstiegspunkt des Programms
113:      static void Main()
114:      {
115:    
116:        using (VertexBufferForm frm = new VertexBufferForm())
117:        {
118:          if (!frm.InitializeGraphics()) // Direct3D initialisieren
119:          {
120:            MessageBox.Show("Konnte Hardware nicht initialisieren.");
121:            return;
122:          }
123:          frm.Show();
124:    
125:          // Solange das Fenster noch gültig ist, die Szene rendern und Eingaben verarbeiten
126:          while(frm.Created)
127:          {
128:            frm.Render();
129:            Application.DoEvents();
130:          }
131:          frm.DisposeGraphics();
132:        }
133:      }
134:    }

 
  Das sieht zwar nach einer Menge Arbeit aus, aber so kompliziert ist es natürlich nicht.
Im ersten Unterkapitel werden dazu die Grundlagen für VertexBuffer besprochen. Im Wesentlichen wird es dort um die InitializeGraphics()-Methode und die OnCreateVertexBuffer()-Methode gehen. Und natürlich wird auch erklärt, was überhaupt ein Vertex überhaupt ist.
Das zweite Unterkapitel befasst sich dann mit dem Rendern des VertexBuffers - also noch einmal ein kleiner Einblick in die Render-Methode.