c# directx编程入门之实现立方体

一、Directx简介
     Directx是微软公司开发的一套功能丰富的底层API ,由C++编写,它可让以Windows为平台的游戏或多媒体程序获得更高的执行效率,加强3d图形和声音效果,并提供设计人员一个共同的硬件驱动标准,让游戏开发者不必为每一品牌的硬件来写不同的驱动程序,也降低用户安装及设置硬件的复杂度。

DirectX并不是一个单纯的图形API,它是由微软公司开发的用途广泛的API,它包含有Direct Graphics(Direct 3D+Direct Draw)、Direct Input、Direct Play、Direct Sound、Direct Show、Direct Setup、Direct Media Objects等多个组件,它提供了一整套的多媒体接口方案。只是其在3D图形方面的优秀表现,让它的其它方面显得暗淡无光。

DirectX的编程方式包括两种1、采用COM接口的方式。2、采用.NET类库的方式。

这里说的是以c#为开发语言和托管direcx类库结合的方式实现的。

二、开始绘制
1、设备初始化,创建设备
        PresentParameters presentParameters = new PresentParameters(); //显示参数private Device device = null;//设备对象    
 private void InitDirectx(){presentParameters.Windowed = true;  //填充显示参数presentParameters.SwapEffect = SwapEffect.Discard;device = new Device(0, DeviceType.Hardware, this, CreateFlags.SoftwareVertexProcessing, presentParameters); //创建设备2、创建顶点缓存和设备缓存vertexBuffer = new VertexBuffer(typeof(CustomVertex.PositionColored), 8, device, 0, CustomVertex.PositionColored.Format, Pool.Default);      //创建顶点缓冲,有8个顶点indexBuffer = new IndexBuffer(typeof(int), 36, device, 0, Pool.Default);   //创建索引缓存 FillVertexBuffer();       //填充顶点和索引信息}  
    
        public void FillVertexBuffer(){CustomVertex.PositionColored[] verts = (CustomVertex.PositionColored[])vertexBuffer.Lock(0, 0); //调用lock方法int[] indexs = (int[])indexBuffer.Lock(0, 0);//立方体顶点verts[0] = new CustomVertex.PositionColored(-10.0f, -10.0f, -10.0f,Color.Red.ToArgb());verts[1] = new CustomVertex.PositionColored(-10.0f, 10.0f, -10.0f, Color.Blue.ToArgb());verts[2] = new CustomVertex.PositionColored(10.0f, 10.0f, -10.0f,  Color.Yellow.ToArgb());verts[3] = new CustomVertex.PositionColored(10.0f, -10.0f, -10.0f, Color.Green.ToArgb());verts[4] = new CustomVertex.PositionColored(-10.0f, -10.0f, 10.0f, Color.Red.ToArgb());verts[5] = new CustomVertex.PositionColored(-10.0f, 10.0f, 10.0f,  Color.Blue.ToArgb());verts[6] = new CustomVertex.PositionColored(10.0f, 10.0f, 10.0f,   Color.Yellow.ToArgb());verts[7] = new CustomVertex.PositionColored(10.0f, -10.0f, 10.0f,  Color.Green.ToArgb());//front sideindexs[0] = 0; indexs[1] = 1; indexs[2] = 2;indexs[3] = 0; indexs[4] = 2; indexs[5] = 3;//backsideindexs[6] = 4; indexs[7] = 6; indexs[8] = 5;indexs[9] = 4; indexs[10] = 7; indexs[11] = 6;//left sideindexs[12] = 4; indexs[13] = 5; indexs[14] = 1;indexs[15] = 4; indexs[16] = 1; indexs[17] = 0;//right side indexs[18] = 3; indexs[19] = 2; indexs[20] = 6;indexs[21] = 3; indexs[22] = 6; indexs[23] = 7;//topindexs[24] = 1; indexs[25] = 5; indexs[26] = 6;indexs[27] = 1; indexs[28] = 6; indexs[29] = 2;//bottomindexs[30] = 4; indexs[31] = 0; indexs[32] = 3;indexs[33] = 4; indexs[34] = 3; indexs[35] = 7;vertexBuffer.Unlock();indexBuffer.Unlock();}
3、绘制前准备(绘制流水线)
这一阶段对绘制前 世界坐标系,观察者坐标系,投影等参数进行设置。同时关闭关照和背面消隐。

        private void SetupCamera(){device.Transform.World = Matrix.RotationY(angel);  // 世界坐标系   沿Y轴旋转  //device.Transform.World = Matrix.RotationX(angel);//沿X轴旋转//device.Transform.World = Matrix.RotationZ(angel);device.Transform.View = Matrix.LookAtLH(new Vector3(0.0f, 0.0f, -40f), new Vector3(0.0f, 0.0f, 0.0f), new Vector3(0.0f, 1.0f, 0.0f));  //观察者坐标系device.Transform.Projection = Matrix.PerspectiveFovLH((float)System.Math.PI*0.5f, 1.0f, 1.0f, 100.0f);                //投影device.RenderState.CullMode = Cull.None;                                                                                  //背面消隐关device.RenderState.Lighting = false;                                                                                 //光照关device.RenderState.FillMode = FillMode.WireFrame;//Viewport vp = new Viewport();//视口变换 将顶点坐标从投影窗口转换到屏幕的一个矩形区域中//vp.Width = 600;//vp.Height = 480;//vp.MaxZ = 1;//device.Viewport = vp;}

4、开始绘制过程

   这里采用的是采用顶点缓存和索引存联合的方式进行绘制的,采用的绘制的基本图元是三角形的列表方式。
        public void Render(){if (device == null)return;SetupCamera();                                                         //设置世界,视野和投影矩阵device.Clear(ClearFlags.Target, System.Drawing.Color.Black, 1.0f, 0);  //清空设备device.BeginScene();                                                   //开始场景device.SetStreamSource(0, vertexBuffer, 0);                            //指定数据输入源device.Indices = indexBuffer;device.SetRenderState(RenderStates.ColorVertex, true);                 //指定渲染方式device.VertexFormat = CustomVertex.PositionColored.Format;device.DrawIndexedPrimitives(PrimitiveType.TriangleList, 0, 0, 8, 0, 12);//device.DrawPrimitives(PrimitiveType.TriangleList, 0, 12);            //绘制图形,使用的方法为三角形列表device.EndScene();                                                     //结束场景device.Present();                                                      //更新场景}

c#/winform Directx编程入门之实现立方体相关推荐

  1. DirectX编程入门

    DirectX编程入门 初始化一个D3D对象 #include <d3d9.h> #pragma comment(lib,"d3d9.lib") int WINAPI ...

  2. 逐梦旅程学习笔记 DirectX开发入门02:旋转的彩色立方体

    本文是 系列笔记DirectX部分的第2篇,上一篇参见 逐梦旅程学习笔记 DirectX开发入门01:应用程序基本框架 这个示例增加了一些实际的内容,首先是绘制一个颜色随机变幻的彩色立方体,其二是显示 ...

  3. winform 判断控件有没有被遮挡_编程入门基础之 winform(2)

    在编程入门1中,我们通过WINFORM等控件画出了登录界面,我们今天写登录界面的登录按钮事件. 装修预算小程序登录按钮事件 在上图中,我们看到了,有几个判断 ,在C#中,if ,else是作为条件判断 ...

  4. DirectX游戏编程入门——前言

    本系列文章由 net_assassin 编写,转载请注明出处. http://blog.csdn.net/net_assassin/article/category/1100363 作者:net_as ...

  5. DirectX游戏编程入门——第一部分(Windows和DirectX游戏编程引言)——认识Windows

    本系列文章由 net_assassin 编写,转载请注明出处. http://blog.csdn.net/net_assassin/article/category/1100363 作者:net_as ...

  6. OpenGL编程入门学习

    OpenGL编程入门学习  非常详细的教程,很适合初学者 本文转自:http://www.cppblog.com/doing5552/archive/2009/01/08/71532.html === ...

  7. 用DirectX绘制使用纹理的立方体

    下面将学习DirectX的3D渲染基础部分,但不会对3D数学或图形理论有太详细的介绍. 首先要了解DirectX中的坐标系,要记住的是DirectX采用左手坐标系. 在Direct3D中渲染一个场景, ...

  8. 游戏编程入门(1) -- 精灵 ISprite

        对于游戏编程而言,我也是个初学者,这个游戏编程入门系列的文章,就当作是我在学习游戏编程的笔记和阶段小结吧.我们先从最简单的"精灵"开始,暂时我们不需要考虑DirectX或是 ...

  9. Android 4游戏编程入门经典

    <Android 4游戏编程入门经典> 基本信息 原书名:Beginning Android 4 Games evelopment 作者: (美)Mario Zechner Robert ...

最新文章

  1. WCF技术剖析之三十二:一步步创建一个完整的分布式事务应用
  2. ADO.NET与XML的结合
  3. 有一整片蓝天 停住时间。
  4. 小程序购物车抛物线(贝塞尔曲线实现)
  5. mysql5.7 设置远程访问
  6. spring 安全模块在jsp中误用引起的问题
  7. asp net服务器虚拟路径,asp.net获取服务器虚拟路径
  8. 实现成长之路——SpringBean三:实例化Bean的姿势都有哪些?
  9. 个人制作的DNN 5.4 API Document
  10. 手机运行慢可以刷机吗_为什么手机卡顿,反应变慢怎么解决?一定要刷机吗?...
  11. python库下载(包括一些pip安装不成功的库下载)
  12. Blender-UV Mapping
  13. B站视频下载方法之--手机下载后再转移至电脑
  14. 迅雷离线下载分享网站
  15. Java验证身份证号
  16. C# winform cefsharp 截取网页元素图片
  17. CentOS6开启BBR加速
  18. glm::quat 四元数,坑了一下午
  19. 迪思杰支持mysql_迪思杰Oracle数据库复制产品
  20. linux中文件大小10,Linux之查看文件大小

热门文章

  1. 科学计算机可以用多久,科学家公布寿命计算器!3分钟算出你还能活多久
  2. 网络工程师入门/底层通讯原理-李强强-专题视频课程
  3. 5.8晚间黄金行情走势分析及短线交易策略
  4. 【商业分析 04 搜索引擎指标CG,DCG,NDCG】
  5. 图形图像处理案例2——勾线画生成器,绕线画生成器
  6. “由于找不到msvcr100d.dll...”和“由于找不到msvcp100d.dll...”的解决方法与相关知识
  7. ubuntu安装显卡驱动记录(未完待续)
  8. Autodesk 的 Inventor API培训教材模块
  9. 值得拥有并收藏的 3个安卓/鸿蒙手机解锁软件
  10. 欢迎大家来增加我的知识