三角形回った
http://www.atelier-blue.com/program/mdirectx/3d/3d01-10.htm
Macbookではハードウェアで頂点処理できないっぽい
device = new Device(0, DeviceType.Hardware, this, CreateFlags.SoftwareVertexProcessing, // softwareで頂点処理 presentParam);
あと頂点形式をCustomVertex.PositionColoredじゃなくてCustomVertex.TransformedColordにしててMatrix変換が適応できなくて間違ってた。
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; MinimumSize = new Size(60, 60); MaximizeBox = false; Text = "D3D Test"; } public bool dx_init() { try { presentParam = new PresentParameters(); presentParam.Windowed = true; presentParam.SwapEffect = SwapEffect.Discard; device = new Device(0, DeviceType.Hardware, this, CreateFlags.SoftwareVertexProcessing, // softwareで頂点処理 presentParam); createVertex(); return true; } catch(Exception ex) { Console.Error.WriteLine(ex.Message); return false; } } private void resetDevice() { int devicestate; if (!device.CheckCooperativeLevel(out devicestate)) { switch (devicestate) { case (int)ResultCode.DeviceLost: Thread.Sleep(10); break; case (int)ResultCode.DeviceNotReset: device.Reset(presentParam); break; } } } public void createVertex() { vertexBuf = new VertexBuffer(typeof(CustomVertex.PositionColored), 3, device, 0, CustomVertex.PositionColored.Format, Pool.Managed); // 3点、プール自動管理 CustomVertex.PositionColored[] verts = new CustomVertex.PositionColored[3]; verts[0].Position = new Vector3(0, 2.0f, 0); verts[0].Color = System.Drawing.Color.LightPink.ToArgb(); verts[1].Position = new Vector3(1.0f, 0, 0); verts[1].Color = System.Drawing.Color.Aqua.ToArgb(); verts[2].Position = new Vector3(-1.0f, 0, 0); verts[2].Color = System.Drawing.Color.Brown.ToArgb(); GraphicsStream gs = vertexBuf.Lock(0, 0, 0); // 全体ロック、フラグとりあえず0 gs.Write(verts); vertexBuf.Unlock(); } public void Render() { if (device == null) return; if (WindowState == FormWindowState.Minimized) return; //device.Transform.World = Matrix.Translation(2, 2, 2); // 移動 device.Transform.World = Matrix.RotationZ(Environment.TickCount / 300f) * Matrix.RotationY(Environment.TickCount / 1000f); // 回転 device.Transform.View = Matrix.LookAtLH( // カメラ視点 new Vector3(0.0f, 0.0f, -5.0f), // position new Vector3(0.0f, 0.0f, 0.0f), // target new Vector3(0.0f, 1.0f, 0.0f)); // 上方向 device.Transform.Projection = Matrix.PerspectiveFovLH( // 投影 (float)Math.PI / 4, // 横の視野をラジアンで (float)ClientSize.Width / (float)ClientSize.Height, // アスペクト比 3.0f, 15.0f); // 前-後方投影面までの距離 device.RenderState.Lighting = false; // 色を付ける device.Clear(ClearFlags.Target, Color.Blue, 1.0f, 0); device.BeginScene(); // 描画処理 device.SetStreamSource(0, vertexBuf, 0); device.VertexFormat = CustomVertex.PositionColored.Format; device.DrawPrimitives(PrimitiveType.TriangleList, 0, 3); // 型、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); } Console.WriteLine("Renderd"); } } class Program { public static void Main() { using (D3dForm form = new D3dForm()) { if (!form.dx_init()) { MessageBox.Show("Direct3D初期化失敗", "Error"); return; } form.ClientSize = new Size(800, 600); form.Show(); while (form.Created) { form.Render(); Application.DoEvents(); } } } } }