CSDN博客

img shutely

用C# Managed DX渲染一个立方体

发表于2004/10/17 23:13:00  1981人阅读

分类: 技术探讨

已经看Managed DirectX几天了,今天做了第一个程序---旋转的正方体
下面是对今天做的程序的心得体会,加深对程序的理解(望各路高手指点):

1、做D3D程序,首先得在C#中引用其动态联接库Microsoft.DirectX 和Microsoft.DirectX.Direct3D
2、程序首先得安始化硬件设备,这里用InitialGraphics()方法实现:建立一个设备(Device),要建立Device,则需要PresentParameters,这个PresentParameters主要是
相当于设置设备参数的作用。在Device建立后,一定要处理其DeviceReset事件,我在这里面主要对Device.RenderState的属性进行了修改:

device.RenderState.CullMode=Cull.None;// Turn off culling, so we see the front and back of the triangle
device.RenderState.Lighting=false;

在InitialGraphics方法中,还一定要手动调用一次这个DeviceReset事件,以便于第一次初始化。

3.InitialGraphics不仅要建立和初始化设备,还要完成建立VertexBuffer的任务,我把这个任务放在SetVerTex()方法中
在这个方法中,首先建立VertexBuffer:
vertexBuffer=new VertexBuffer(typeof(CustomVertex.PositionNormalColored),18,device,0,CustomVertex.PositionNormalColored.Format,Pool.Default);
//上面实例化第一参数是指定顶点类型,第二个参数是顶点个数。。。
vertexBuffer.Created+=new EventHandler(vertexBuffer_Created);
//以上Created事件,这个事件用来处理,一但VertexBuffer建立后,下一步需要做什么。呵呵。。你说需要做什么?当然是建立顶点啦!!
vertexBuffer_Created(vertexBuffer,null);
//把当前vertexBuffer传到Created 事件中

4.在vertexBuffer_Created事件处理方法中,建立顶点。我要实现的是一个正方体,这里我建立顶点用的是笨办法,并没有采用IndexBuffer的方法(还不会哩...),所以共用了18
个顶点,上面4个,周围10个,下面4个。建立顶点时,应注意使用顺时针方向。

5.设置Camera了,这里我取名为SetCamera()。主要内容是设置device.Transform.world(世界矩阵?),device.Transform.view(观察矩阵),device.Transform.projection(中文叫?)

int iTime=Environment.TickCount%1000;                                  //iTime 的值从(0,999)
float fAngle=iTime*((float)Math.PI*2.0f)/1000.0f;                      //每秒种2PI
device.Transform.World=Matrix.RotationY(fAngle);                       //绕y旋转
device.Transform.View=Matrix.LookAtLH(new Vector3(0.0f,10.0f,-10.0f),new Vector3(0.0f,0.0f,0.0f),new Vector3(0.0f,1.0f,0.0f));//三个参数Look (At,to,up)在哪里看,看哪里,第三个参数相当于是正方向,一般都为(0,1,0)
device.Transform.Projection=Matrix.PerspectiveFovLH((float)Math.PI/4.0f,1,1.0f,100.0f);//第一个参数视野角度,比例,能看到的近点,能看到的远点

6.最后该Render了!首先用设置客户区背景,然后开始场景渲染:1,调用SetCamera()方法 2,指定vertexBuffer 3,vertexFormat 4,画画 5,结速场景
if(device==null)                                                              //看了答案才补全的
    return;
   if(pause)                                                                        //看了答案才补全的
    return;
   device.Clear(ClearFlags.Target,System.Drawing.Color.Black.ToArgb(),1.0f,0);
  
   device.BeginScene();

   SetCamera();                                                                         //先设置观察矩阵等
   device.SetStreamSource(0,vertexBuffer,0);                              //然后是source
   device.VertexFormat= CustomVertex.PositionNormalColored.Format;    //格式
   device.DrawPrimitives(PrimitiveType.TriangleStrip,0,12);            //画画
  
   device.EndScene();
   device.Present();
7.定app的主方法Main了。首先实例化form,然后调InitialGraphics()初始化设备,显示form ,当form没被关团时,循环调用Render(),处理消息队列。
using (MyGame frm=new MyGame())                                                                 //using 语句注意理解
   {
    if(!frm.InitializeGraphics())
    {
     MessageBox.Show("error occurs");
     return;
    }
    frm.Show();
    while(frm.Created)
    {
     frm.Render();
     Application.DoEvents();
    }
   }

注意using 语句,意义是,在 using 语句中创建一个实例,确保退出 using 语句时在对象上调用 Dispose。当到达 using 语句的末尾,或者如果在语句结束之前引发异常并且控制离开语句块,都可以退出 using 语句。


 
写完了,我自己在加深印象的基础上,你看了后,不知我上面的过程没有理解上,或概念上的错误,请各大高手指点。谢谢!

 

 

 

阅读全文
0 0

相关文章推荐

img
取 消
img