windows graphics - DXGI 介绍(DirectX Graphics Infrastructure)

DXGI 概述

Microsoft DirectX 图形基础结构 (DXGI) 认识到,某些图形部分的发展速度比其他部分更慢。 DXGI 的主要目的是管理可独立于 DirectX 图形运行时的低级别任务。 DXGI 为未来图形组件提供了通用框架;使用 DXGI 的第一个组件是 Microsoft Direct3D 10。

在以前版本的 Direct3D 中,诸如一下功能,等底层任务都包含在 Direct3D 运行时中。 这些任务现在在 DXGI 中实现。

  • 硬件设备的枚举、
  • 将呈现的帧呈现到输出、
  • 控制伽玛
  • 管理全屏转换

DXGI 的用途是与内核模式驱动程序和系统硬件进行通信,如下图所示。
在这里插入图片描述
应用程序可以直接访问 DXGI,或调用 D3D11 D3D11、D3D10 和 D3D10 中的 Direct3D Api, _ _ 后者可处理与 DXGI 通信的情况。 如果你的应用程序需要枚举设备或控制向输出显示数据的方式,你可能想要直接使用 DXGI。

总结

在以前图形子系统都归D3D,结果D3D8/D3D9分别有一套代码用来管理swap chain。图形API越来越多,D3D9/D3D10/D3D11/D3D12,都来一套swap chain太没意义了。于是重构成所有API可以共享一份swap chain的代码,这就放在DXGI。除此之外,窗口全屏化之类的事情也都归DXGI了,你可以认为屏幕输出的部分都归DXGI。

不论是 OGL 还是 D3D,都没有包含与窗口(HWND&

在C#中使用DirectX Graphics InfrastructureDXGI)截取屏幕上的特定位置图像通常涉及到以下几个步骤: 1. 引入必要的库:首先,你需要引用Windows API和DirectX相关的NuGet包,例如`System.Windows.Forms`, `Microsoft.DirectX` 和 `Microsoft.DirectX.Direct3D`. ```csharp using System.Drawing; using Microsoft.DirectX; using Microsoft.DirectX.Direct3D; ``` 2. 初始化Direct3D:创建一个`Device`实例,这将用于渲染到屏幕。 ```csharp Graphics graphics = Graphics.FromHwnd(WindowHandle); // 确保WindowHandle是你窗口的句柄 Direct3D direct3D = new Direct3D(graphics); ``` 3. 创建设备:设置兼容模式,并获取`DeviceContext`用于绘制。 ```csharp presentParams := PresentParameters(); presentParams.Windowed = true; // 设置为窗口模式 device := direct3D.CreateDevice(DriverType.Hardware, DeviceType.Presentation, WindowHandle, presentParams); device.ClearColor = Color.Black; // 清除背景颜色 deviceContext := device.GetFrontBufferContext(); // 获取绘图上下文 ``` 4. 屏幕截图:通过绘制一个全屏的矩形区域来截取屏幕。然后从内存缓冲区复制到一个Bitmap对象上。 ```csharp // 获取屏幕尺寸 Rectangle screenRect = graphics.ClipBounds; int width = screenRect.Width; int height = screenRect.Height; // 绘制全屏透明矩形 deviceContext.ClearDepthStencilView(0, ClearFlags.DepthBufferAndStencil, 1.0f, 0); deviceContext.ClearRenderTargetView(0, Color.Transparent); deviceContext.DrawIndexed(3, 0, 0); // 使用三角形绘制一个全透明矩形 // 拷贝屏幕到内存缓冲区 byte* pBackBufferData = IntPtr.Zero; deviceContext.MapResource(device.GetBackBuffer(0), MapMode.Read, 0, out _, out pBackBufferData, 0, 0); var screenshotData = new byte[width * height * 4]; // 假设Bgra格式 Marshal.Copy(pBackBufferData, screenshotData, 0, screenshotData.Length); deviceContext.UnmapResource(); // 创建Bitmap并保存图片 Bitmap bitmap = new Bitmap(width, height, PixelFormat.Format32bppArgb); using (MemoryStream ms = new MemoryStream(screenshotData)) { bitmap.LoadImage(ms); } bitmap.Save("screenshot.png", ImageFormat.Png); // 或者其他你需要的格式 ``` 5. 关闭资源:记得释放所有创建的资源。 ```csharp deviceContext.Dispose(); device.Dispose(); direct3D.Dispose(); graphics.Dispose(); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值