1) 应用程序框架
启动时加载DirectX
- #region < program.cs >
- //Application.Run(new Form1());
- using (Form1 frm = new Form1())
- {
- if (!frm.InitilizeGraphics())
- {
- MessageBox.Show("Failed To Initilize Directx", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
- return;
- }
- frm.Show();
- while (frm.Created)
- {
- frm.Render();
- Application.DoEvents();
- }
- }
- #endregion
Device设备初始化,只执行一次
- #region InitilizeGraphics
- public virtual bool InitilizeGraphics()
- {
- try
- {
- PresentParameters presentParm = new PresentParameters();
- presentParm.Windowed = true; //窗口中显示,不能全屏
- presentParm.SwapEffect = SwapEffect.Discard; //后备缓存交换方式
- presentParm.EnableAutoDepthStencil = true; //Enable自动深度测试
- presentParm.AutoDepthStencilFormat = DepthFormat.D16;//深度缓冲区但愿:16 bit 二进制
- device = new Device(0, DeviceType.Hardware, this, CreateFlags.SoftwareVertexProcessing, presentParm);
- //建立设备对象
- //要使用窗体控件,this -> panel1
- device.DeviceReset += new EventHandler(OnResetDevice);
- this.OnCreateDevice(device, null);
- this.OnResetDevice(device, null);
- }
- catch (DirectXException)
- {
- return false;
- }
- return true;
- }
- #endregion
Deivce 初始化工作,只调用一次:
- #region OnCreateDevice
- public virtual void OnCreateDevice(object sender, EventArgs e)
- {
- #region eg 3.2
- verts = new CustomVertex.TransformedColored[3];
- float z = 0.5F;
- verts[0].Position = new Vector4(150F, 50F, z, 1F);
- verts[0].Color = Color.Aqua.ToArgb();
- verts[1].Position = new Vector4(250F, 250F, z, 1F);
- verts[1].Color = Color.Brown.ToArgb();
- verts[2].Position = new Vector4(50F, 250F, z, 1F);
- verts[2].Color = Color.LightPink.ToArgb();
- #endregion
- }
- #endregion
窗口发生变化 -> Device 参数变化
- #region OnResetDevice
- public virtual void OnResetDevice(object sender, EventArgs e)
- {
- #region < expample 4.4 Transform >
- Device dev = (Device)sender;
- dev.RenderState.CullMode = Cull.None;
- dev.RenderState.Lighting = false;
- #endregion
- }
- #endregion
渲染,显示过程
- #region < Render 渲染 >
- public virtual void Render()
- {
- if ((device == null))
- return;
- if (pRender)
- return;
- device.Clear(ClearFlags.Target | ClearFlags.ZBuffer, Color.White, 1F, 0);
- //初始化目标窗口和深度缓冲区
- //背景颜色
- //1F,0
- device.BeginScene();//开始
- //渲染代码在这里
- //......
- //device.VertexFormat = CustomVertex.TransformedColored.Format;
- //device.DrawUserPrimitives(PrimitiveType.TriangleList, 1, verts);
- //...
- device.EndScene();//结束
- device.Present();//更新显示区域(一帧)
- }
- #endregion
2) 直接屏幕绘制
TransFormedColored 结构
记录顶点
根据透视原理计算过的
可以直接在显示器上显示
属性 Position, Vector4(x,y,z,1). 同一图形的z应该相同,表示观察者的距离
属性 Color,
CustomVertex.TransformedColored vert = CustomVertex.TransformedColored();
float z = 0.5F;
vert.Position = new Vector4(150F, 50F, z, 1F);
vert.Color = Color.Aqua.ToArgb();
绘制顶点,必须使用 DrawUserPrimitives()
verts = new CustomVertex.TransformedColored[n];
...
device.DrawUserPrimitives(PrimitiveType, 1, verts);
结构 PrimitiveType
-> PointList 绘制顶点
-> LineList 绘制线段,每个线段使用2个顶点
-> LineStrip 绘制线段,中间顶点重复使用
-> TriangleList 绘制三角形,每个三角形使用3个顶点
-> TriangleStrip 绘制三角形,每2个相邻三角形共享中间两个顶点
-> TriangleFan 绘制三角形,每2个相邻三角形共享中间两个顶点,所有三角形共享一个顶点
- public override void Render()
- {
- base.Render();
- device.Clear(ClearFlags.Target | ClearFlags.ZBuffer, Color.White, 1F, 0);
- device.BeginScene();
- device.VertexFormat = CustomVertex.TransformedColored.Format;
- device.DrawUserPrimitives(PrimitiveType.TriangleList, 1, verts);
- device.EndScene();
- device.Present();
- }
3) 使用VertexBuffer
构造函数
#region VertexBuffer
vertexBuffer = new VertexBuffer(typeof(CustomVertex.TransformedColored),
3,//顶点个数
dev,//Device
0,
CustomVertex.TransformedColored.Format,//顶点格式
Pool.Default);//(顶点)参数存放位置
事件 Created
图形卡中的数据在窗口最小,最大化以后,可能丢失,因此需要数据重建。使用Created事件。
vertexBuffer.Created += new EventHandler(OnCreateVertexBuffer);
顶点绘制 DrawPrimitives()
device.DrawPrimitives(PrimitiveType.TriangleList, 0, 1);//绘制.
-> 格式
-> 起始
-> 个数
- #region example: 使用VertexBuffer
- public override void OnCreateDevice(object sender, EventArgs e)
- {
- Device dev = (Device)sender;
- vertexBuffer = new VertexBuffer(typeof(CustomVertex.TransformedColored),
- 3,//顶点个数
- dev,//Device
- 0,
- CustomVertex.TransformedColored.Format,//顶点格式
- Pool.Default);//(顶点)参数存放位置
- vertexBuffer.Created += new EventHandler(OnCreateVertexBuffer);
- OnCreateVertexBuffer(vertexBuffer, null);//创建顶点,并赋值
- }
- public virtual void OnCreateVertexBuffer(object sender, EventArgs e)
- {
- verts = (CustomVertex.TransformedColored[])vertexBuffer.Lock(0, 0);
- float z = 0.5F;
- verts[0].Position = new Vector4(150F, 50F, z, 1F);
- verts[0].Color = Color.Aqua.ToArgb();
- verts[1].Position = new Vector4(250F, 250F, z, 1F);
- verts[1].Color = Color.Brown.ToArgb();
- verts[2].Position = new Vector4(50F, 250F, z, 1F);
- verts[2].Color = Color.LightPink.ToArgb();
- vertexBuffer.Unlock();
- }
- public override void Render()
- {
- base.Render();
- device.Clear(ClearFlags.Target | ClearFlags.ZBuffer, Color.White, 1F, 0);
- device.BeginScene();
- device.SetStreamSource(0, vertexBuffer, 0);//使用VertexBuffer中的顶点
- device.VertexFormat = CustomVertex.TransformedColored.Format;//顶点格式
- device.DrawPrimitives(PrimitiveType.TriangleList, 0, 1);//绘制
- device.EndScene();
- device.Present();
- }
- #endregion