文章目录
一、概要
DXGI(DirectX Graphics Infrastructure)图像截取是一种技术,用于从图形设备接口(Graphics Device Interface)中捕获屏幕上的图像数据。它是基于 DirectX 和 DXGI 接口的截取方法。
二、DXGI 图像截取的实现步骤
1. 获取 DXGI 设备和适配器: 首先,通过调用 CreateDXGIFactory 来创建一个 DXGI 工厂对象。然后使用工厂对象的 EnumAdapters 方法来获取系统上的适配器(显示适配器)。可以根据需求选择适配器。
2. 创建 DXGI 输出(Output)对象: 使用选定的适配器调用 EnumOutputs 方法来获取适配器上的输出(显示器)。可以选择某个输出,或者使用默认输出(通常是主显示器)。
3. 创建 DXGI 输出复制(Output Duplication)对象: 调用 IDXGIOutput1 接口的 DuplicateOutput 方法来创建一个 DXGI 输出复制对象。输出复制对象用于捕获屏幕上的图像数据。
4. 获取桌面帧: 使用输出复制对象的 AcquireNextFrame 方法来获取下一个桌面帧(Desktop Frame)。这个桌面帧包含了屏幕上的图像数据。
5. 访问桌面帧数据: 可以通过输出复制对象的 MapDesktopSurface 方法将桌面帧数据映射到内存中。然后可以使用指针来访问图像数据。
6. 释放桌面帧和输出复制对象: 使用 IDXGIOutputDuplication 接口的 ReleaseFrame 方法来释放桌面帧。最后调用 Release 方法释放输出复制对象。
三、DXGI常用接口介绍
1. D3D11CreateDevice
D3D11CreateDevice是 DirectX 11 中用于创建 D3D 设备的函数
HRESULT D3D11CreateDevice(
IDXGIAdapter *pAdapter,
D3D_DRIVER_TYPE DriverType,
HMODULE Software,
UINT Flags,
const D3D_FEATURE_LEVEL *pFeatureLevels,
UINT FeatureLevels,
UINT SDKVersion,
ID3D11Device **ppDevice,
D3D_FEATURE_LEVEL *pFeatureLevel,
ID3D11DeviceContext **ppImmediateContext
);
接口参数说明
pAdapter: 指向 DXGI 适配器(IDXGIAdapter)的指针,用于指定使用的图形适配器。可以为 nullptr,表示使用默认适配器。
DriverType: 指定驱动类型,如 D3D_DRIVER_TYPE_HARDWARE、D3D_DRIVER_TYPE_WARP 或 D3D_DRIVER_TYPE_REFERENCE。
Software: 指定一个可选的软件模块的句柄,用于软件驱动。一般情况下可以传入 nullptr。
Flags: 配置标志,用于配置设备创建的行为。可以是 D3D11_CREATE_DEVICE_FLAG 枚举值的组合,如D3D11_CREATE_DEVICE_DEBUG 用于启用调试模式。
pFeatureLevels: 指向 D3D 特性级别(D3D_FEATURE_LEVEL)数组的指针,指定所需的 D3D 特性级别。可以为 nullptr,表示使用默认的特性级别。
FeatureLevels: 数组 pFeatureLevels 中的特性级别个数。
SDKVersion: DirectX SDK 版本号。通常使用 D3D11_SDK_VERSION 宏。
ppDevice: 输出参数,返回创建的 D3D 设备对象的指针。
pFeatureLevel: 输出参数,返回实际创建的 D3D 设备的特性级别。
ppImmediateContext: 输出参数,返回与设备关联的即时渲染上下文(ID3D11DeviceContext)的指针。
D3D_DRIVER_TYPE常见类型
D3D_DRIVER_TYPE 枚举类型定义了在 Direct3D 中可用的驱动程序类型。下面是 D3D_DRIVER_TYPE 中所有枚举值的含义:
D3D_DRIVER_TYPE_HARDWARE: 表示使用硬件加速的图形驱动程序。它指示 Direct3D 使用可用的硬件加速功能来执行图形渲染操作。通常用于具有独立显卡的系统。
D3D_DRIVER_TYPE_WARP: 表示使用 WARP(Windows Advanced Rasterization Platform)软件渲染器进行图形渲染。WARP 是一种在不具备独立显卡的系统上进行软件渲染的选择。它可以提供基本的图形渲染功能,但性能相对较低。
D3D_DRIVER_TYPE_REFERENCE: 表示使用参考软件渲染器进行图形渲染。参考渲染器是一种纯软件实现的渲染器,不依赖于硬件加速,适用于调试和开发目的。它通常用于验证和测试渲染代码,但性能较低。
D3D_DRIVER_TYPE_NULL: 表示使用空驱动程序类型。它不执行任何图形渲染操作,主要用于模拟或测试环境中。
D3D_DRIVER_TYPE_SOFTWARE: 表示使用软件驱动程序进行图形渲染。这是一种在没有硬件加速的系统上进行软件渲染的选择。它通常性能较低,仅用于特殊情况。
以上是 D3D_DRIVER_TYPE 中的所有枚举值及其含义。根据具体的系统配置和需求,你可以选择适合的驱动类型来执行 Direct3D 图形渲染操作。通常情况下,硬件加速的图形驱动程序(D3D_DRIVER_TYPE_HARDWARE)是首选的,以获得最佳性能和图形质量。
D3D_FEATURE_LEVEL 枚举类型定义了在 Direct3D 中可用的功能级别(Feature Level)。它表示硬件或驱动程序所支持的图形功能和功能集合。
D3D11CreateDevice 函数的使用示例
bool ScreenCapture::InitD3D11Device()
{
D3D_DRIVER_TYPE driverTypes[] = {
D3D_DRIVER_TYPE_HARDWARE,
D3D_DRIVER_TYPE_WARP,
D3D_DRIVER_TYPE_REFERENCE,
};
UINT numDriverTypes = std::extent<decltype(driverTypes)>::value;
D3D_FEATURE_LEVEL featureLevels[] = {
D3D_FEATURE_LEVEL_11_0,
D3D_FEATURE_LEVEL_10_1,
D3D_FEATURE_LEVEL_10_0,
D3D_FEATURE_LEVEL_9_1
};
UINT numFeatureLevels = std::extent<decltype(featureLevels)>::value;
D3D_FEATURE_LEVEL featureLevel;
for (UINT i = 0; i < numDriverTypes; ++i)
{
HRESULT hr = D3D11CreateDevice(nullptr, driverTypes[i], nullptr, 0, featureLevels, numFeatureLevels, D3D11_SDK_VERSION, &m_pDevice, &featureLevel, &m_pDeviceContext);
if (SUCCEEDED(hr)) {
break;
}
}
if (m_pDevice == nullptr || m_pDeviceContext == nullptr) {
qDebug() << __FILE__ << __FUNCTION__ << __LINE__ << "InitD3D11Device Failed";
return false;
}
return true;
}