C# WinForm构架下的DirectX框架

 1) 应用程序框架

 

  启动时加载DirectX

  

[c-sharp]  view plain copy
  1. #region < program.cs >  
  2.   //Application.Run(new Form1());  
  3.   using (Form1 frm = new Form1())  
  4.   {  
  5.       if (!frm.InitilizeGraphics())  
  6.       {  
  7.           MessageBox.Show("Failed To Initilize Directx""Error", MessageBoxButtons.OK, MessageBoxIcon.Error);  
  8.           return;  
  9.       }  
  10.       frm.Show();  
  11.       while (frm.Created)  
  12.       {  
  13.           frm.Render();  
  14.           Application.DoEvents();  
  15.       }  
  16.   }  
  17.   #endregion  
 

Device设备初始化,只执行一次

[c-sharp]  view plain copy
  1. #region InitilizeGraphics  
  2.   public virtual bool InitilizeGraphics()  
  3.   {  
  4.       try  
  5.       {  
  6.           PresentParameters presentParm = new PresentParameters();  
  7.           presentParm.Windowed = true;                        //窗口中显示,不能全屏  
  8.           presentParm.SwapEffect = SwapEffect.Discard;        //后备缓存交换方式  
  9.           presentParm.EnableAutoDepthStencil = true;          //Enable自动深度测试  
  10.           presentParm.AutoDepthStencilFormat = DepthFormat.D16;//深度缓冲区但愿:16 bit 二进制  
  11.           device = new Device(0, DeviceType.Hardware, this, CreateFlags.SoftwareVertexProcessing, presentParm);  
  12.           //建立设备对象  
  13.           //要使用窗体控件,this -> panel1  
  14.           device.DeviceReset += new EventHandler(OnResetDevice);  
  15.           this.OnCreateDevice(device, null);  
  16.           this.OnResetDevice(device, null);  
  17.       }  
  18.       catch (DirectXException)  
  19.       {  
  20.           return false;  
  21.       }  
  22.       return true;  
  23.   }  
  24.   #endregion  

 

 Deivce 初始化工作,只调用一次:

[c-sharp]  view plain copy
  1. #region OnCreateDevice     
  2.    public virtual void OnCreateDevice(object sender, EventArgs e)  
  3.    {  
  4.         #region eg 3.2  
  5.         verts = new CustomVertex.TransformedColored[3];  
  6.         float z = 0.5F;  
  7.         verts[0].Position = new Vector4(150F, 50F, z, 1F);  
  8.         verts[0].Color = Color.Aqua.ToArgb();  
  9.         verts[1].Position = new Vector4(250F, 250F, z, 1F);  
  10.         verts[1].Color = Color.Brown.ToArgb();  
  11.         verts[2].Position = new Vector4(50F, 250F, z, 1F);  
  12.         verts[2].Color = Color.LightPink.ToArgb();  
  13.         #endregion  
  14.    }  
  15.    #endregion  

 

 窗口发生变化 -> Device 参数变化

[c-sharp]  view plain copy
  1. #region OnResetDevice     
  2.    public virtual void OnResetDevice(object sender, EventArgs e)  
  3.    {  
  4.        #region < expample 4.4 Transform >  
  5.        Device dev = (Device)sender;  
  6.        dev.RenderState.CullMode = Cull.None;  
  7.        dev.RenderState.Lighting = false;  
  8.        #endregion  
  9.    }  
  10.    #endregion  
 

渲染,显示过程

[c-sharp]  view plain copy
  1. #region < Render 渲染 >    
  2.    public virtual void Render()  
  3.    {  
  4.        if ((device == null))  
  5.            return;  
  6.        if (pRender)  
  7.            return;  
  8.        device.Clear(ClearFlags.Target | ClearFlags.ZBuffer, Color.White, 1F, 0);  
  9.                    //初始化目标窗口和深度缓冲区  
  10.                    //背景颜色  
  11.                    //1F,0  
  12.        device.BeginScene();//开始  
  13.         //渲染代码在这里  
  14.         //......  
  15.         //device.VertexFormat = CustomVertex.TransformedColored.Format;  
  16.         //device.DrawUserPrimitives(PrimitiveType.TriangleList, 1, verts);  
  17.         //...  
  18.        device.EndScene();//结束  
  19.        device.Present();//更新显示区域(一帧)  
  20.    }  
  21.    #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个相邻三角形共享中间两个顶点,所有三角形共享一个顶点

[c-sharp]  view plain copy
  1. public override void Render()  
  2.     {  
  3.         base.Render();  
  4.         device.Clear(ClearFlags.Target | ClearFlags.ZBuffer, Color.White, 1F, 0);  
  5.         device.BeginScene();  
  6.         device.VertexFormat = CustomVertex.TransformedColored.Format;  
  7.         device.DrawUserPrimitives(PrimitiveType.TriangleList, 1, verts);  
  8.         device.EndScene();  
  9.         device.Present();  
  10.     }  
 

 

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);//绘制. 

-> 格式

-> 起始

-> 个数

 

 

[c-sharp]  view plain copy
  1. #region example:  使用VertexBuffer  
  2.    public override void OnCreateDevice(object sender, EventArgs e)  
  3.    {  
  4.         Device dev = (Device)sender;  
  5.         vertexBuffer = new VertexBuffer(typeof(CustomVertex.TransformedColored),  
  6.             3,//顶点个数  
  7.             dev,//Device  
  8.             0,   
  9.             CustomVertex.TransformedColored.Format,//顶点格式  
  10.             Pool.Default);//(顶点)参数存放位置  
  11.         vertexBuffer.Created += new EventHandler(OnCreateVertexBuffer);  
  12.         OnCreateVertexBuffer(vertexBuffer, null);//创建顶点,并赋值  
  13.    }  
  14.    public virtual void OnCreateVertexBuffer(object sender, EventArgs e)  
  15.    {  
  16.        verts = (CustomVertex.TransformedColored[])vertexBuffer.Lock(0, 0);  
  17.        float z = 0.5F;  
  18.        verts[0].Position = new Vector4(150F, 50F, z, 1F);  
  19.        verts[0].Color = Color.Aqua.ToArgb();  
  20.        verts[1].Position = new Vector4(250F, 250F, z, 1F);  
  21.        verts[1].Color = Color.Brown.ToArgb();  
  22.        verts[2].Position = new Vector4(50F, 250F, z, 1F);  
  23.        verts[2].Color = Color.LightPink.ToArgb();  
  24.        vertexBuffer.Unlock();  
  25.    }  
  26.    public override void Render()  
  27.    {  
  28.         base.Render();  
  29.         device.Clear(ClearFlags.Target | ClearFlags.ZBuffer, Color.White, 1F, 0);  
  30.         device.BeginScene();  
  31.         device.SetStreamSource(0, vertexBuffer, 0);//使用VertexBuffer中的顶点  
  32.         device.VertexFormat = CustomVertex.TransformedColored.Format;//顶点格式  
  33.         device.DrawPrimitives(PrimitiveType.TriangleList, 0, 1);//绘制  
  34.         device.EndScene();  
  35.         device.Present();  
  36.    }  
  37.    #endregion  
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值