Direct3D学习笔记(1) 初始化Device
Direct3D学习笔记(1) 初始化Device
by rockin
我觉得这个步骤应该算是HelloWorld之前的步骤. 之前用过OpenGL, 觉得相比起OpenGL的初始化来说, Direct3D的初始化简单容易很多, 没有OpenGL的那些令初学者摸不着头脑的DC, RC等等这些比较基础的东西. 所以第一个程序就觉得简单的很:
1. 打开Visual Studio 2005, 新建一个winform project
2. 添加如下两个引用
Microsoft.DirectX
Microsoft.DirectX.Direct3D
Microsoft.DirectX.Direct3D
3. 写一个InitGraphics()函数来初始化Device. 一个Device对象就是用来画图的吧我想, 我觉得简单的理解就是只要有了device, 就可以胡乱的画了. 初始化Device用到的参数也不复杂, 现在还不是完全的理解, 不过没关系, 只要顺利的有了device, 就可以往下学习了.
4. 重写OnPaint函数, 添加一个我们用来画图的函数 Render(). 我想到这里, 一个最简单的Framework就搭建好了, 想画什么东西就直接在Render()函数里面写代码就成了, Oh Yeah!
5. 练习一下清屏的函数, _device.Clear(...), 相当与glClearColor(..)
就这样, 第一个练习就顺利完成了, 在这个练习中, 我们得到了device, 以后就用它在这个窗口上画东西了! 代码就在下面.
1 public partial class FrmInitDirect3D : Form
2 {
3 Device _device;
4
5 public FrmInitDirect3D()
6 {
7 InitializeComponent();
8 this.Text = "初始化Direct3D Device";
9 }
10
11 public bool InitGraphics()
12 {
13 try
14 {
15 PresentParameters presentParams = new PresentParameters();
16 presentParams.Windowed = true;
17 presentParams.SwapEffect = SwapEffect.Discard;
18 _device = new Device(0, DeviceType.Hardware, this, CreateFlags.SoftwareVertexProcessing, presentParams);
19 return true;
20 }
21 catch (DirectXException)
22 {
23 return false;
24 }
25 }
26
27 protected override void OnPaint(PaintEventArgs e)
28 {
29 Render();
30 }
31
32 private void Render()
33 {
34 if (_device == null){
35 return;
36 }
37
38 _device.Clear(ClearFlags.Target, Color.Red, 1.0F, 0);
39 _device.BeginScene();
40
41 _device.EndScene();
42 _device.Present();
43 }
44
45 [STAThread]
46 static void Main()
47 {
48 Application.EnableVisualStyles();
49 Application.SetCompatibleTextRenderingDefault(false);
50
51 FrmInitDirect3D frmInit3D = new FrmInitDirect3D();
52 if (frmInit3D.InitGraphics()) {
53 Application.Run(frmInit3D);
54 }
55 }
56 }
57
2 {
3 Device _device;
4
5 public FrmInitDirect3D()
6 {
7 InitializeComponent();
8 this.Text = "初始化Direct3D Device";
9 }
10
11 public bool InitGraphics()
12 {
13 try
14 {
15 PresentParameters presentParams = new PresentParameters();
16 presentParams.Windowed = true;
17 presentParams.SwapEffect = SwapEffect.Discard;
18 _device = new Device(0, DeviceType.Hardware, this, CreateFlags.SoftwareVertexProcessing, presentParams);
19 return true;
20 }
21 catch (DirectXException)
22 {
23 return false;
24 }
25 }
26
27 protected override void OnPaint(PaintEventArgs e)
28 {
29 Render();
30 }
31
32 private void Render()
33 {
34 if (_device == null){
35 return;
36 }
37
38 _device.Clear(ClearFlags.Target, Color.Red, 1.0F, 0);
39 _device.BeginScene();
40
41 _device.EndScene();
42 _device.Present();
43 }
44
45 [STAThread]
46 static void Main()
47 {
48 Application.EnableVisualStyles();
49 Application.SetCompatibleTextRenderingDefault(false);
50
51 FrmInitDirect3D frmInit3D = new FrmInitDirect3D();
52 if (frmInit3D.InitGraphics()) {
53 Application.Run(frmInit3D);
54 }
55 }
56 }
57