DrawPrimitivesでVertex描画
ここの解説が超わかりやすい。 http://www.atelier-blue.com/program/mdirectx/3d/3d01-08.htm
VisualStudio2008(C#3.0)だと微妙に関数/アクセサ名が違うのがあって、調べながらちょっとずつ変えながらやってる
using System; using System.Windows.Forms; using System.Drawing; using Microsoft.DirectX; using Microsoft.DirectX.Direct3D; using System.Threading; namespace D3DTest { public class D3dForm : Form { private Device device; private PresentParameters presentParam; private VertexBuffer vertexBuf; public D3dForm() : base() { FormBorderStyle = FormBorderStyle.FixedSingle; MaximizeBox = false; Text = "D3D Test"; PresentParameters pp = new PresentParameters(); } public bool dx_init() { try { presentParam = new PresentParameters(); presentParam.Windowed = true; presentParam.SwapEffect = SwapEffect.Discard; device = new Device(0, DeviceType.Hardware, this.Handle, CreateFlags.SoftwareVertexProcessing, // softwareで頂点処理 presentParam); createVertex(); return true; } catch(Exception ex) { Console.Error.WriteLine(ex.Message); return false; } } private void resetDevice() { int device_state; if (!device.CheckCooperativeLevel(out device_state)) { switch (device_state) { case (int)ResultCode.DeviceLost: Thread.Sleep(10); break; case (int)ResultCode.DeviceNotReset: device.Reset(presentParam); break; } } } public void createVertex() { vertexBuf = new VertexBuffer(typeof(CustomVertex.TransformedColored), // 色つき 3, device, 0, CustomVertex.TransformedColored.Format, Pool.Managed); // 3点、プール自動管理 GraphicsStream gs = vertexBuf.Lock(0, 0, 0); // 全体ロック、フラグとりあえず0 CustomVertex.TransformedColored[] verts = new CustomVertex.TransformedColored[3]; verts[0].X = 150; verts[0].Y = 50; verts[0].Z = 0.5f; verts[0].Rhw = 1; verts[0].Color = System.Drawing.Color.Aqua.ToArgb(); verts[1].X = 250; verts[1].Y = 250; verts[1].Z = 0.5f; verts[1].Rhw = 1; verts[1].Color = System.Drawing.Color.Brown.ToArgb(); verts[2].X = 50; verts[2].Y = 250; verts[2].Z = 0.5f; verts[2].Rhw = 1; verts[2].Color = System.Drawing.Color.LightPink.ToArgb(); gs.Write(verts); vertexBuf.Unlock(); } public void Render() { if (device == null) return; if (WindowState == FormWindowState.Minimized) return; device.Clear(ClearFlags.Target, Color.AliceBlue, 1.0f, 0); device.BeginScene(); // 描画処理 device.SetStreamSource(0, vertexBuf, 0); device.VertexFormat = CustomVertex.TransformedColored.Format; device.DrawPrimitives(PrimitiveType.TriangleFan, 0, 1); // 型、vertex開始点、個数 device.EndScene(); try { device.Present(); // 画面更新 (front/back bufferの切り替え) } catch (DeviceLostException ex) { Console.Error.WriteLine(ex.Message); resetDevice(); } catch (Exception ex) { Console.Error.WriteLine(ex.Message); } } } class Program { public static void Main() { using (D3dForm form = new D3dForm()) { form.MinimumSize = new Size(60, 60); form.ClientSize = new Size(800, 600); form.Show(); if (!form.dx_init()) { MessageBox.Show("Direct3D初期化失敗", "Error"); return; } form.Show(); while (form.Created) { Application.DoEvents(); form.Render(); } } } } }