1.首先定义一个DX操作类

  1     using System;
  2     using SlimDX;
  3     using SlimDX.Direct3D9;
  4     using System.Windows.Interop;
  5     using System.Windows.Media;
  6
  7     public class DX
  8     {
  9         private enum DirectXStatus
 10         {
 11             Available,
 12             Unavailable_RemoteSession,
 13             Unavailable_LowTier,
 14             Unavailable_MissingDirectX,
 15             Unavailable_Unknown
 16         };
 17
 18         public static Device Device { get; private set; }
 19         public static bool Available { get { return DX.Device != null; } }// = false;
 20
 21         private static DX _dx;
 22         private static DirectXStatus _status = DirectXStatus.Unavailable_Unknown;
 23         private static string _statusMessage = "";
 24
 25         [System.Runtime.InteropServices.DllImport("user32")]
 26         private static extern int GetSystemMetrics(int smIndex);
 27         private const int SM_REMOTESESSION = 0x1000;
 28
 29         // device settings
 30         private const Format _adapterFormat = Format.X8R8G8B8;
 31         private const Format _backbufferFormat = Format.A8R8G8B8;
 32         private const Format _depthStencilFormat = Format.D16;
 33         private static CreateFlags _createFlags = CreateFlags.Multithreaded | CreateFlags.FpuPreserve;
 34
 35         private Direct3D _d3d;
 36
 37
 38         private DX()
 39         {
 40             initD3D();
 41             if (_d3d != null)
 42                 initDevice();
 43             //if (!DX.Available)
 44             //    MessageBox.Show("DirectX硬件加速不可用!\n\n" + _statusMessage, "", MessageBoxButton.OK, MessageBoxImage.Warning);
 45         }
 46
 47         ~DX()
 48         {
 49             if (DX.Device != null)
 50                 if (!DX.Device.Disposed)
 51                     DX.Device.Dispose();
 52             if (_d3d != null)
 53                 if (!_d3d.Disposed)
 54                     _d3d.Dispose();
 55         }
 56
 57         public static void Init()
 58         {
 59             if (_dx == null)
 60                 _dx = new DX();
 61         }
 62
 63         private void initD3D()
 64         {
 65             if (_d3d != null)
 66                 return;
 67
 68             _status = DirectXStatus.Unavailable_Unknown;
 69
 70             //// assume that we can't run at all under terminal services
 71             if (GetSystemMetrics(SM_REMOTESESSION) != 0)
 72             {
 73                 _status = DirectXStatus.Unavailable_RemoteSession;
 74                 return;
 75             }
 76
 77             int renderingTier = (RenderCapability.Tier >> 16);
 78             if (renderingTier < 2)
 79             {
 80                 _status = DirectXStatus.Unavailable_LowTier;
 81                 _statusMessage = "low tier";
 82                 return;//注意:发现某些集成显卡,在这里出去!!
 83             }
 84
 85             try
 86             {
 87                 _d3d = new Direct3DEx();
 88             }
 89             catch
 90             {
 91                 try
 92                 {
 93                     _d3d = new Direct3D();
 94                 }
 95                 catch (Direct3DX9NotFoundException dfe)
 96                 {
 97                     _status = DirectXStatus.Unavailable_MissingDirectX;
 98                     _statusMessage = "Direct3DX9 Not Found\n" + dfe.Message;
 99                     return;
100                 }
101                 catch (Exception e)
102                 {
103                     _status = DirectXStatus.Unavailable_Unknown;
104                     _statusMessage = e.Message;
105                     return;
106                 }
107             }
108
109             bool ok;
110             Result result;
111
112             ok = _d3d.CheckDeviceType(0, DeviceType.Hardware, _adapterFormat, _backbufferFormat, true, out result);
113             if (!ok)
114             {
115                 //Debug.WriteLine("*** failed to CheckDeviceType");
116                 //MessageBox.Show("Failed to CheckDeviceType");
117                 return;
118             }
119
120             ok = _d3d.CheckDepthStencilMatch(0, DeviceType.Hardware, _adapterFormat, _backbufferFormat, _depthStencilFormat, out result);
121             if (!ok)
122             {
123                 //Debug.WriteLine("*** failed to CheckDepthStencilMatch");
124                 _statusMessage = "Failed to CheckDepthStencilMatch";
125                 return;
126             }
127
128             Capabilities deviceCaps = _d3d.GetDeviceCaps(0, DeviceType.Hardware);
129             if ((deviceCaps.DeviceCaps & DeviceCaps.HWTransformAndLight) != 0)
130                 _createFlags |= CreateFlags.HardwareVertexProcessing;
131             else
132                 _createFlags |= CreateFlags.SoftwareVertexProcessing;
133
134             _status = DirectXStatus.Available;
135         }
136
137         private void initDevice()
138         {
139             if (_status != DirectXStatus.Available)
140                 return;
141
142             HwndSource hwnd = new HwndSource(0, 0, 0, 0, 0, 0, 0, "SlimDX_Wnd", IntPtr.Zero);
143             PresentParameters pp = new PresentParameters();
144             //pp.SwapEffect = SwapEffect.Copy;
145             //pp.DeviceWindowHandle = hwnd.Handle;
146             pp.Windowed = true;
147             pp.PresentFlags = PresentFlags.Video;
148             pp.SwapEffect = SwapEffect.Discard;
149             //pp.BackBufferCount = 1;
150             //pp.BackBufferWidth = 320;
151             //pp.BackBufferHeight = 240;
152             //pp.BackBufferFormat = _backbufferFormat;
153             //pp.AutoDepthStencilFormat = _depthStencilFormat;
154             try
155             {
156                 DeviceType deviceType = DeviceType.Hardware;
157                 if (_d3d is Direct3DEx)
158                     DX.Device = new DeviceEx((Direct3DEx)_d3d, 0, deviceType, hwnd.Handle, _createFlags, pp);
159                 else
160                     DX.Device = new Device(_d3d, 0, deviceType, hwnd.Handle, _createFlags, pp);
161             }
162             catch (Exception ex)
163             {
164                 //Debug.WriteLine("Exception in Direct3DReset " + ex.StackTrace);
165                 //Debug.WriteLine("Exception in Direct3DReset " + ex.Message);
166             }
167         }
168     }

2.定义准备显卡硬件,和释放显卡硬件方法

定义一些变量

       /// <summary>/// 离屏表面/// </summary>private Surface _offscrn;/// <summary>/// 交换链/// </summary>private SwapChain _swapChain;private D3DImage _d3dImage = null;    

 1      /// <summary>
 2         /// 准备DirectX显卡硬件
 3         /// </summary>
 4         private bool prepareHardware(VideoFormat videoFormat, int videoWidth, int videoHeight)//, VideoFormat videoFormat)
 5         {
 6             if (!DX.Available)
 7                 return true;
 8
 9             try
10             {
11                 SlimDX.Direct3D9.Format format = SlimDX.Direct3D9.Format.A8R8G8B8;
12                 if (videoFormat == VideoFormat.Yuv420)
13                     format = (SlimDX.Direct3D9.Format)0x32315659;
14                 if (_offscrn != null)
15                     if (videoWidth == _offscrn.Description.Width && videoHeight == _offscrn.Description.Height && _offscrn.Description.Format == format)
16                         return true;
17
18                 releaseHardware();
19                 _offscrn = Surface.CreateOffscreenPlain(DX.Device, videoWidth, videoHeight, format, Pool.Default);
20                 PresentParameters pp = new PresentParameters();
21                 pp.Windowed = true;
22                 pp.PresentFlags = PresentFlags.Video;
23                 pp.SwapEffect = SwapEffect.Discard;
24                 pp.BackBufferCount = 1;
25                 pp.BackBufferWidth = videoWidth;
26                 pp.BackBufferHeight = videoHeight;
27                 _swapChain = new SwapChain(DX.Device, pp);
28                 return true;
29             }
30             catch
31             {
32                 return false;
33             }
34         }
35         /// <summary>
36         /// 释放DirectX显卡硬件
37         /// </summary>
38         private void releaseHardware()
39         {
40             if (!DX.Available)
41                 return;
42             if (_offscrn != null)
43                 if (!_offscrn.Disposed)
44                     _offscrn.Dispose();
45             _offscrn = null;
46             if (_swapChain != null)
47                 if (!_swapChain.Disposed)
48                     _swapChain.Dispose();
49             _swapChain = null;
50         }

3.

 private void drawFrame(VideoFormat videoFormat, int width, int height, IntPtr Y, IntPtr U, IntPtr V){if (!prepareHardware(videoFormat, width, height))return;if (_swapChain == null)return;DataRectangle dr = _offscrn.LockRectangle(LockFlags.None);//在离屏表面上锁定一个矩形drawYuv420(width, height, Y, U, V, dr.Data.DataPointer, dr.Pitch);//DataPointer 内部指针指向当前流的存储备份; Pitch 两个连续的行之间的数据的字节数_offscrn.UnlockRectangle();//解锁矩形using (Surface bb = _swapChain.GetBackBuffer(0))//从交换链中检索一个后台缓冲区
            {System.Drawing.Rectangle rect = new System.Drawing.Rectangle(0, 0, bb.Description.Width, bb.Description.Height);_swapChain.Device.StretchRectangle(_offscrn, rect, bb, rect, TextureFilter.None);//将后台缓冲区的内容交换到前台缓冲区_swapChain.Device.Present();//呈现后台缓冲区序列中下一个后台缓冲区的内容
_d3dImage.Lock();_d3dImage.SetBackBuffer(D3DResourceType.IDirect3DSurface9, bb.ComPointer);_d3dImage.AddDirtyRect(new Int32Rect(0, 0, _d3dImage.PixelWidth, _d3dImage.PixelHeight));_d3dImage.Unlock();}}private void drawYuv420(int width, int height, IntPtr Y, IntPtr U, IntPtr V, IntPtr dest, int pitch){IntPtr py = dest;IntPtr pv = py + (pitch * height);IntPtr pu = pv + ((pitch * height) / 4);int w2 = width / 2, pitch2 = pitch / 2;for (int y = 0; y < height; y++){CopyMemory(py, Y + y * width, (uint)width);py += pitch;if ((y & 1) != 0)continue;int offset = y / 2 * w2;CopyMemory(pu, U + offset, (uint)w2);CopyMemory(pv, V + offset, (uint)w2);pu += pitch2;pv += pitch2;}}
[DllImport("kernel32.dll", EntryPoint = "RtlMoveMemory")]private static extern void CopyMemory(IntPtr Destination, IntPtr Source, uint Length);

转载于:https://www.cnblogs.com/smartsensor/p/4815381.html

SlimDX和WPF的合作应用相关推荐

  1. WPF自学入门(十一)WPF MVVM模式Command命令 WPF自学入门(十)WPF MVVM简单介绍...

    WPF自学入门(十一)WPF MVVM模式Command命令 在WPF自学入门(十)WPF MVVM简单介绍中的示例似乎运行起来没有什么问题,也可以进行更新.但是这并不是我们使用MVVM的正确方式.正 ...

  2. WPF——微软的UI革命

    作者:Tony Qu (本文未经许可不得转载) 上次我写了一篇<WPF简介>,当时我仅仅是对WPF有初步认识,但通过近期的学习之后,我开始逐步领会WPF的真正意义,它不仅仅是一项技术而已, ...

  3. wpf 图表控件_LightningChart为外汇衍生品交易商提供数据可视化图表支持

    今天,我在这里介绍一下Arction的LightningChart图表控件在外汇和外汇衍生品交易中的应用. FXVolQuant作为外汇交易商的前沿数据驱动平台,由kuma.capital开发和维护, ...

  4. WPF企业内训全程实录(中)

    摘要 WPF企业内训全程实录由于文章比较长,所以一共拆分成了三篇,上篇WPF企业内训全程实录(上)主 要讲了基础,这篇作为该实录的中篇,起着承上启下的作用,主要讲解开发模式.团队协作及应用框架.其实如 ...

  5. C# WPF MVVM模式Prism框架从零搭建(经典)

    01 - 前言 目前最新的PRISM的版本是8.1.97,本节以6.3.0.0 讲解,可以在Github上获取PRISM的源码. Prism Github地址:https://github.com/P ...

  6. ML.NET 示例:对象检测-ASP.NET Core Web和WPF桌面示例

    ML.NET 版本 API 类型 状态 应用程序类型 数据类型 场景 机器学习任务 算法 v1.5.0 动态API 最新 端到端应用 图像文件 对象检测 深度学习 ONNX: Tiny YOLOv2 ...

  7. 【招聘(上海)】 坚果云 招聘Windows客户端(WPF方向)

    岗位职责: 1.负责坚果云在Windows 10平台上WPF应用的开发与维护: 2.负责基于WPF的Windows平台核心客户端产品开发,维护与测试: 3.WPF桌面应用将具备丰富的文件展示和文件管理 ...

  8. 怎样实现WPF Prism Module的国际化和本地化?

    English | 简体中文 上一篇有简单介绍主工程的国际化,使用的资源字典(XAML)实现的.这几天我添加了几个Prism模块(Module),发现子模块使用资源字典的方式实现国际化和本地化不好做, ...

  9. C#/.Net Core/WPF框架初建(国际化、主题色)

    English | 简体中文 作为 TerminalMACS 的一个子进程模块 - WPF管理端,目前搭建框架部分功能:本地化.国际化.主题色修改等. 导航目录 1.框架已添加功能说明 1.1. 国际 ...

最新文章

  1. SpringBoot-web开发(二): 页面和图标定制(源码分析)
  2. linux文件 i节点结构,Linux 文件描述符 文件表项 i节点结构
  3. uniapp处理IOS底部横条安全区域
  4. 下面关于微型计算机控制技术的叙述,(微型计算机控制技术选择题.docx
  5. windows的键盘输入重定向
  6. 最长回文子序列(LPS)
  7. 构造函数与折构函数(c++细节篇五)
  8. mysql切换到使用openssl,MySQL主从复制+OpenSSL
  9. 【转】Unix环境高级程序设计入门----文件系统的相关编程(上)
  10. Struts2 + MySQL 实现分页
  11. (转)软件开发和团队”最小模式”初探2-6人模型(下)
  12. Python入门学习笔记(9)
  13. mysql 常用计算函数_关于MySQL常用的一些函数以及一些计算
  14. 在propreties文件中引用另一个properties文件中的内容
  15. 快速的mysql导入导出数据(load data和outfile)
  16. tomcat设置context不生效_后端服务:关于Tomcat相关面试题,看懂这篇就够了(有深度)...
  17. verilog语法学习心得
  18. 基于PHP的汽车租赁网站,基于SSM汽车租赁管理系统
  19. 罗技鼠标M330拆解
  20. 复盘:霍夫曼编码平均长度计算方式,信源符号a1-a6概率为:0.1,0.4,0.06,0.1,0.04,0.3,霍夫曼编码平均长度是

热门文章

  1. python自学-class24-进程线程练习Plus
  2. 七个让人顿悟的人生哲理寓言
  3. matlab中imfilter函数的使用
  4. Java项目中高并发问题的简单解决方案
  5. 《机器人爱好者(第2辑)》——Robart III机器人
  6. 与运算、或运算以及异或运算
  7. 【Nodejs博客项目开发】之原生nodejs实现博客系统(一)
  8. Java环境变量(Windows 10 Enterprise 2016 LTSB (x64) )
  9. 光纤光缆基础知识二十问
  10. Windchill配置远程Oracle数据库连接