C# 使用DirectX中的Device类实现3D渲染

1.Device类进行简单介绍
Device类把真实的图形卡从具体的硬件中抽象出来,在类中定义一组通用函数,这些函数将直接操作图形卡硬件。

函数原型:

(1)public Device(IntPtr unmanagedObject);
(2)public Device(int adapter, DeviceType deviceType, Control renderWindow, CreateFlags behaviorFlags, params PresentParameters[] presentationParameters);
(3)public Device(int adapter, DeviceType deviceType, IntPtr renderWindowHandle, CreateFlags behaviorFlags, params PresentParameters[] presentationParameters);

2.对第2个构造函数进行参数说明

public Device(int adapter, DeviceType deviceType, Control renderWindow, CreateFlags behaviorFlags, params PresentParameters[] presentationParameters)

参数简析:
adapter:表示要使用哪个图形卡,默认的图形卡为0。
deviceType:表示要创建的设备类型。

  • DeviceType.Hardware,创建直接控制图形卡硬件的设备(要求图形卡支持DirectX)
  • DeviceType.Reference,设备类型为参考光栅器,软件模拟,运行速度慢
  • DeviceType.Software,自定义软件光栅器

renderWindow:表示在图形显示的窗口
behaviorFlags

  • CreateFlags.SoftwareVertexProcessing,3D图形所有顶点计算用软件处理
  • CreateFlags.HardwareVertexProcessing,所有顶点计算用GPU处理
  • CreateFlags.MixedVertexProcessing,根据最佳效果原则,进行选择
    以上互斥,只能选其一,可以与以下参数组合

    • FPU_Preserve,使用双精度浮点数计算,速度减慢
    • MultiThreaded,使用多线程
    • PureDevice,要求所有计算尽可能使用GPU,只能和CreateFlags.HardwareVertexProcessing

PresentParameters类常用属性:

  • Windowed,false为全屏模式,true为窗口模式,使用Form类创建的Direct 3D程序,只能工作于窗口模式;
  • SwapEffect,用于控制后备缓存区和屏幕显示区交换的方式;
  • SwapEffect.Flip:在图形卡的显存中建立多个和屏幕显示区同样大小的后备缓存区,修改了后备缓存区的数据后,指定其为屏幕显示区,就可以显示,只使用全屏模式;
  • SwapEffect.Copy:只有一个后备缓存区,为了显示,需要复制后备缓存区数据到屏幕显示区;
  • SwapEffect.Discard:与SwapEffect.Copy基本相同,但新帧到来后,后备缓存区中未处理完的数据将被丢弃;
  • BackBufferCount,后备缓存的数量(1到3) ;
  • BackBufferFormat,记录颜色的格式;
  • BackBufferWidth,每行单元数 BackBufferHeight,总行数 ;
  • AutoDepthStencilFormat,指定深度缓存区单元的位数及格式,如DepthFormat.D16;
  • EnableAutoDepthStencil,设置是否允许自动使用深度测试;
  • DeviceWindowHandle,使用的窗口句柄,取值为null表示使用当前激活窗口。

C#窗体程序中使用DirectX进行3D渲染的示例程序:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using Microsoft.DirectX;
using Microsoft.DirectX.Direct3D;namespace Demo_3D
{public partial class MainFrm : Form{Device device = null;//定义绘图设备public MainFrm(){InitializeComponent();this.ClientSize = new Size(300, 300);//指定窗体尺寸this.Text = "DirectX示例程序";       //指定窗体标题}public bool InitializeDirect3D(){try{PresentParameters presentParams = new PresentParameters();//定义对象presentParams.Windowed = true;                            //指定以Windows窗体形式显示,使用Form类创建的Direct 3D程序,只能工作于窗口模式presentParams.SwapEffect = SwapEffect.Discard;            //当前屏幕绘制后它将自动从内存中删除device = new Device(0, DeviceType.Hardware, this, CreateFlags.HardwareVertexProcessing, presentParams); //实例化device对象return true;}catch (DirectXException e){MessageBox.Show(e.ToString(), "Error"); //处理异常return false;}}public void Render(){if (device == null)                                                                  //如果device为空则不渲染{return;}device.Clear(ClearFlags.Target, Color.DarkGreen, 1.0f, 0);                           //清除windows界面为深绿色device.BeginScene();//在此添加渲染图形代码CustomVertex.TransformedColored[] vertices = new CustomVertex.TransformedColored[3]; //定义顶点vertices[0].Position = new Vector4(10f, 300f, 1f, 1f);vertices[0].Color = Color.Red.ToArgb();vertices[1].Position = new Vector4(this.Width / 2, 50f, 0f, 1f);vertices[1].Color = Color.Green.ToArgb();vertices[2].Position = new Vector4(this.Width - 150f, 100f, 10f, 1f);vertices[2].Color = Color.Blue.ToArgb();device.VertexFormat = CustomVertex.TransformedColored.Format;device.DrawUserPrimitives(PrimitiveType.TriangleList, 1, vertices);device.EndScene();device.Present();}static void Main(){MainFrm basicForm = new MainFrm();           //创建窗体对象if (basicForm.InitializeDirect3D() == false) //检查Direct3D是否启动{MessageBox.Show("无法启动Direct3D!", "Error");return;}basicForm.Show();            //如果一切都初始化成功,则显示窗体while (basicForm.Created)    //设置一个循环用于实时更新渲染状态{basicForm.Render();      //保持device渲染,直到程序结束Application.DoEvents();  //处理键盘鼠标等输入事件}}}
}

参考Demo链接https://download.csdn.net/download/CXYLVCHF/14022457

C# 使用DirectX中的Device类实现3D渲染相关推荐

  1. DirectX中文文档系列:二、Direct3D设备(device)

    一.介绍 Direct3D device 是 D3D的渲染组件,他封装并保存了渲染状态(rendering state).D3D device负责模型转换和光照操作,并将最终结果光栅化(rasteri ...

  2. 使用 Microsoft .NET Framework 精简版中的 MessageWindow 类

     使用 Microsoft .NET Framework 精简版中的 MessageWindow 类 收藏 Alex Yakhnin IntelliProg, Inc. 2003年3月 适用于:    ...

  3. MFC中的CAsyncSocket类实现网络通信

    近年来,利用Internet进行网际间通讯,在WWW浏 览.FTP.Gopher这些常规服务,以及在网络电话.多媒体会议等这些对实时性要求严格 的应用中成为研究的热点,而且已经是必需的了.Window ...

  4. JAVA语言中 文本框类的类名是_这是什么?

    [简答题]设计一个Printer类继承Output和Product接口,实现数据的获取和输出 (25.0分) [多选题]一般Java程序的类主体由哪两部分组成( ). [多选题]如果子类中的( )与父 ...

  5. DIRECTX中独占模式与窗口模式的切换(译)

    <script language="javascript" type="text/javascript">document.title=" ...

  6. python中的新式类与旧式类的一些基于descriptor的概念(下)

    3. Descriptor介绍 3.1 Descriptor代码示例 3.2 定义 3.3 Descriptor Protocol(协议) 3.4 Descriptor调用方法 4. 基于Descri ...

  7. python中的新式类与旧式类的一些基于descriptor的概念(上)

    python中基于descriptor的一些概念(上) 1. 前言 2. 新式类与经典类 2.1 内置的object对象 2.2 类的方法 2.2.1 静态方法 2.2.2 类方法 2.3 新式类(n ...

  8. java 中常用的类

    java 中常用的类 Math Math 类,包含用于执行基本数学运算的方法 常用API 取整 l  static double abs(double  a) 获取double 的绝对值 l  sta ...

  9. python创建类的实例方法-Python中动态创建类实例的方法

    简介 在Java中我们可以通过反射来根据类名创建类实例,那么在Python我们怎么实现类似功能呢? 其实在Python有一个builtin函数import,我们可以使用这个函数来在运行时动态加载一些模 ...

最新文章

  1. 设置centos默认启动命令行(不启动图形界面)
  2. python加绝对值_python如何使用绝对值
  3. Django之Xadmin
  4. SQL Server 2005 在只有MDF文件的情况下恢复(丢失日志文件)
  5. bzoj 2535: [Noi2010]Plane 航空管制2【拓扑排序+堆】
  6. 季枫老师java全集_PHP冒泡排序,摘取季枫老师视频的冒泡排序内容!
  7. 20165231 2017-2018-2 《Java程序设计》第8周学习总结
  8. windeployqt.exe 发布windows下qt产生的exe程序
  9. 5输入的多数表决器(结构化建模)
  10. 数字证书及 CA 的扫盲介绍
  11. XSS靶场练习手工注入(1)
  12. OCR表格识别—(一)
  13. onclick和onfocus的区别
  14. ECC的“点加”和“点乘”
  15. debugger在js中是什么
  16. laravel 构建后台package Voyager 使用笔记
  17. C语言小例子【基础】
  18. 辗转相除法c++_欧冠尤文被黑马,C罗太可惜了,他错失了一次千载难逢的机会...
  19. 文字图片滚动scrollbox插件
  20. python中tuple、list以及array(numpy的数据格式)的相互转换

热门文章

  1. 电子游戏设计与制作 第一章 计算机游戏概述
  2. 综合日语第一册第五课
  3. 据说99%的程序猿都不懂得这样表白
  4. java计算机毕业设计计算机专业招聘网站MyBatis+系统+LW文档+源码+调试部署
  5. html转word样式出问题
  6. 树莓派python语音唤醒_唤醒DuerOS Python SDK(解决声音切回树莓派的问题)
  7. 前端实现简单的loding效果
  8. 做PPT只会用黑体和宋体?这些可商用字体瞬间提升你的PPT档次
  9. Js基础——变量类型和计算
  10. 文件夹里面的文件批量改名字