C# 使用DirectX中的Device类实现3D渲染
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渲染相关推荐
- DirectX中文文档系列:二、Direct3D设备(device)
一.介绍 Direct3D device 是 D3D的渲染组件,他封装并保存了渲染状态(rendering state).D3D device负责模型转换和光照操作,并将最终结果光栅化(rasteri ...
- 使用 Microsoft .NET Framework 精简版中的 MessageWindow 类
使用 Microsoft .NET Framework 精简版中的 MessageWindow 类 收藏 Alex Yakhnin IntelliProg, Inc. 2003年3月 适用于: ...
- MFC中的CAsyncSocket类实现网络通信
近年来,利用Internet进行网际间通讯,在WWW浏 览.FTP.Gopher这些常规服务,以及在网络电话.多媒体会议等这些对实时性要求严格 的应用中成为研究的热点,而且已经是必需的了.Window ...
- JAVA语言中 文本框类的类名是_这是什么?
[简答题]设计一个Printer类继承Output和Product接口,实现数据的获取和输出 (25.0分) [多选题]一般Java程序的类主体由哪两部分组成( ). [多选题]如果子类中的( )与父 ...
- DIRECTX中独占模式与窗口模式的切换(译)
<script language="javascript" type="text/javascript">document.title=" ...
- python中的新式类与旧式类的一些基于descriptor的概念(下)
3. Descriptor介绍 3.1 Descriptor代码示例 3.2 定义 3.3 Descriptor Protocol(协议) 3.4 Descriptor调用方法 4. 基于Descri ...
- python中的新式类与旧式类的一些基于descriptor的概念(上)
python中基于descriptor的一些概念(上) 1. 前言 2. 新式类与经典类 2.1 内置的object对象 2.2 类的方法 2.2.1 静态方法 2.2.2 类方法 2.3 新式类(n ...
- java 中常用的类
java 中常用的类 Math Math 类,包含用于执行基本数学运算的方法 常用API 取整 l static double abs(double a) 获取double 的绝对值 l sta ...
- python创建类的实例方法-Python中动态创建类实例的方法
简介 在Java中我们可以通过反射来根据类名创建类实例,那么在Python我们怎么实现类似功能呢? 其实在Python有一个builtin函数import,我们可以使用这个函数来在运行时动态加载一些模 ...
最新文章
- 设置centos默认启动命令行(不启动图形界面)
- python加绝对值_python如何使用绝对值
- Django之Xadmin
- SQL Server 2005 在只有MDF文件的情况下恢复(丢失日志文件)
- bzoj 2535: [Noi2010]Plane 航空管制2【拓扑排序+堆】
- 季枫老师java全集_PHP冒泡排序,摘取季枫老师视频的冒泡排序内容!
- 20165231 2017-2018-2 《Java程序设计》第8周学习总结
- windeployqt.exe 发布windows下qt产生的exe程序
- 5输入的多数表决器(结构化建模)
- 数字证书及 CA 的扫盲介绍
- XSS靶场练习手工注入(1)
- OCR表格识别—(一)
- onclick和onfocus的区别
- ECC的“点加”和“点乘”
- debugger在js中是什么
- laravel 构建后台package Voyager 使用笔记
- C语言小例子【基础】
- 辗转相除法c++_欧冠尤文被黑马,C罗太可惜了,他错失了一次千载难逢的机会...
- 文字图片滚动scrollbox插件
- python中tuple、list以及array(numpy的数据格式)的相互转换