XNAGame-016form1.cs
  •  
using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Windows.Forms;using Microsoft.DirectX;using Microsoft.DirectX.Direct3D;
namespace XNAGame_016{ public partial class Form1 : Form { /* * 1.编写Direct3D程序,首先需要安装direct3d sdk程序。 * 2.项目引用中,需要添加Microsoft.DirectX,Microsoft.DirectX.Direct3D,Microsoft.Direct3DX, * 3.上面的引用,我的电脑的路径是C:\Windows\Microsoft.NET\DirectX for Managed Code\1.0.2902.0 * 4.vs项目属性中,引用路径要把C:\Program Files (x86)\Microsoft DirectX SDK (June 2010)\Include\, * 和C:\Program Files (x86)\Microsoft DirectX SDK (June 2010)\Lib\,都包含进来。 * 5.在form1.cs中,需要引用 using Microsoft.DirectX,using Microsoft.DirectX.Direct3D; * 6.非常重要的一点,此点不解决,窗体不显示,在App.config配置文件中,加入<startup useLegacyV2RuntimeActivationPolicy="true"> * * */ //设备类 private Device device1 = null;
// bool pause = false;
//显卡缓存,增加这个变量 第一步 VertexBuffer buffer1 = null; public Form1() { InitializeComponent(); }
public bool InitializeGraphics() { try { PresentParameters param1 = new PresentParameters(); param1.Windowed = true; // 非全屏模式,即窗口模式 param1.SwapEffect = SwapEffect.Discard; // 后备缓存模式,新帧显示,旧帧丢弃 param1.EnableAutoDepthStencil = true; //自动深度测试 param1.AutoDepthStencilFormat = DepthFormat.D16; //深度缓存区单元为16位二进制
device1 = new Device(0, DeviceType.Hardware, this, CreateFlags.SoftwareVertexProcessing, param1); device1.DeviceReset += new System.EventHandler(this.OnResetDevice); this.OnCreateDevice(device1, null); this.OnResetDevice(device1, null);
return true; } catch (DirectXException ex) { return false; }
}
public void Render() { if (device1 == null) return; // 设备类没有初始化,为空,不渲染 if (pause) return; // 暂停,窗体最小化,不可见,不渲染 device1.Clear(ClearFlags.Target | ClearFlags.ZBuffer, Color.Blue, 1.0f, 0); device1.BeginScene();
//第六步 device1.SetStreamSource(0,buffer1,0); device1.VertexFormat = CustomVertex.PositionColored.Format; device1.DrawPrimitives(PrimitiveType.TriangleList, 0, 1); // device1.EndScene(); device1.Present(); }
private void Form1_Paint(object sender, PaintEventArgs e) { this.Render(); }
//增加这个方法的内容 ,第二步 public void OnCreateDevice(object sender, EventArgs e) { Device dev = (Device)sender; buffer1 = new VertexBuffer(typeof(CustomVertex.PositionColored),3,dev,0,CustomVertex.PositionColored.Format,Pool.Default); buffer1.Created += new System.EventHandler(this.OnCreateVertexBuffer); this.OnCreateVertexBuffer(buffer1, null); }
//第五步,修改此方法 public void OnResetDevice(object sender, EventArgs e) { Device dev = (Device)sender; dev.RenderState.CullMode = Cull.None; //取消背面剔除 dev.RenderState.Lighting = false; // 取消灯光 SetupMatrices(); //变换 }
private void Form1_Resize(object sender, EventArgs e) { pause = ((this.WindowState == FormWindowState.Minimized) || !this.Visible); } //增加这个方法 ,第三步 public void OnCreateVertexBuffer(object sender, EventArgs e) { CustomVertex.PositionColored[] verts = (CustomVertex.PositionColored[])buffer1.Lock(0,0);
verts[0].Position = new Vector3(-1.0f,-1.0f,0.0f); verts[0].Color = Color.Aqua.ToArgb(); verts[1].Position = new Vector3(1.0f, -1.0f, 0.0f); verts[1].Color = Color.Brown.ToArgb(); verts[2].Position = new Vector3(0.0f, 1.0f, 0.0f); verts[2].Color = Color.LightPink.ToArgb();
buffer1.Unlock(); //显卡缓存,设定点时,先锁定,再解锁。 }
//增加这个方法,第四步,实现世界坐标,观察坐标,和投影坐标的变换 private void SetupMatrices() { device1.Transform.World = Matrix.RotationY(0); //世界变换矩阵 device1.Transform.View = Matrix.LookAtLH(new Vector3(0.0f,3.0f,-5.0f), new Vector3(0.0f,0.0f,0.0f),new Vector3(0.0f,1.0f,0.0f)); // 观察变换矩阵 device1.Transform.Projection = Matrix.PerspectiveFovLH((float)Math.PI/4,1.0f,1.0f,100.0f); //投影变换矩阵 } }}
program.cs
  •  
using System;using System.Collections.Generic;using System.Linq;using System.Threading.Tasks;using System.Windows.Forms;
namespace XNAGame_016{ static class Program { /// <summary> /// 应用程序的主入口点。 /// </summary> [STAThread] static void Main() { //Application.EnableVisualStyles(); //Application.SetCompatibleTextRenderingDefault(false); //Application.Run(new Form1()); using (Form1 frm = new Form1()) { if (frm.InitializeGraphics() == false) { MessageBox.Show("无法初始化Direct 3D,退出"); return; } frm.Show(); while (frm.Created == true) { frm.Render(); Application.DoEvents(); } } } }}
app.config
  •  
<?xml version="1.0" encoding="utf-8" ?><configuration>    <startup useLegacyV2RuntimeActivationPolicy="true">         <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />    </startup></configuration>
form1.designer.cs
  •  
namespace XNAGame_016{    partial class Form1    {        /// <summary>        /// 必需的设计器变量。        /// </summary>        private System.ComponentModel.IContainer components = null;
/// <summary> /// 清理所有正在使用的资源。 /// </summary> /// <param name="disposing">如果应释放托管资源,为 true;否则为 false。</param> protected override void Dispose(bool disposing) { if (disposing && (components != null)) { components.Dispose(); } base.Dispose(disposing); }
#region Windows 窗体设计器生成的代码
/// <summary> /// 设计器支持所需的方法 - 不要 /// 使用代码编辑器修改此方法的内容。 /// </summary> private void InitializeComponent() { this.SuspendLayout(); // // Form1 // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.ClientSize = new System.Drawing.Size(284, 262); this.Name = "Form1"; this.Text = "Form1"; this.Paint += new System.Windows.Forms.PaintEventHandler(this.Form1_Paint); this.Resize += new System.EventHandler(this.Form1_Resize); this.ResumeLayout(false);
}
#endregion }}