DirectX 11.1 和 Win32 桌面
Posted
技术标签:
【中文标题】DirectX 11.1 和 Win32 桌面【英文标题】:DirectX 11.1 and Win32 Desktop 【发布时间】:2013-02-11 01:17:17 【问题描述】:我在理解 DirectX 11.1 时遇到了一些问题。我有兴趣用它构建一个传统的 Win32 桌面程序,但所有文档都是针对 Metro 应用程序的。 11.1 仅适用于 Metro 应用程序吗?我不认为 Windows 7 中添加了对 11.1 的支持。
过去我在初始化 D3D11 时没有问题。就像声明指针然后以标准 C++ 方式调用函数一样简单:
ID3D11Device *pDevice;
现在有了 11.1,有很多新东西,比如 ComPtr:
ComPtr<ID3D11Device1> pDevice;
并且不创建 D3D11.1 设备,他们使用 ComPtr 的 As() 函数从 D3D11 转换它们,因此使 ComPtr 成为强制性要求。
假设桌面可以DX11.1开发,有没有办法不用这种转换废话,使用传统的初始化?
如果没有办法,如何为桌面初始化 D3D11.1?
谢谢。
【问题讨论】:
?这真的是强制性的吗?我希望它只是像 ATL 的 CComPtr 一样为您管理引用计数的包装器,而 .As 将是 QueryInterface 的包装器。 但是您将如何创建 11.1 设备?按照我的理解,没有办法直接创建,必须使用 As() 转换 D3D11 设备。 【参考方案1】:我认为您确实需要将其从 DirectX11 对象转换,是的,但您可以使用普通 COM QueryInterface
不使用 ComObj<>
辅助包装器来执行此操作,例如:
ID3D11Device* device = NULL;
D3D_FEATURE_LEVEL level;
ID3D11DeviceContext* context = NULL;
HRESULT hr = D3D11CreateDevice(NULL,
D3D_DRIVER_TYPE::D3D_DRIVER_TYPE_NULL,
NULL,
0,
NULL,
0,
D3D11_SDK_VERSION,
&device,
&level,
&context);
if (SUCCEEDED(hr))
ID3D11Device1* device1 = NULL;
// This is equivalent to the ComPtr<>.As<>()
hr = device->QueryInterface(IID_ID3D11Device1, (void**)&device1);
if (SUCCEEDED(hr) && (device1 != NULL))
// device1 now ready
// when finished with device1
// (this would be handled automatically by the ComPtr<> destructor)
device1->Release();
device->Release();
context->Release();
或者,您可以使用辅助包装器,然后从中获取指针
ID3D11Device1* pDevice1 = device.As<ID3D11Device1>().Detach();
if (pDevice1 != NULL)
// use as before
// you'll then need to release manually since we detached the reference
pDevice1->Release();
但在任何情况下使用辅助包装器可能会更容易。
我的回答主要是关于 COM 引用计数处理,我认为我的代码片段基于 MSDN 中的示例。然而anonymous user points out 说这不是创建这些对象之一的一个很好的实际示例:
创建 D3D11.1 设备需要指定功能级别数组。请参阅 D3D11CreateDevice 上的 MSDN 页面。此外,D3D_DRIVER_TYPE_NULL 是一个没有渲染能力的参考设备,不太可能是原始发布者想要的。
他建议您添加功能级别数据并将其与 D3D11CreateDevice
调用一起传递
D3D_FEATURE_LEVEL pFeatureLevels[]=D3D_FEATURE_LEVEL_11_1;
UINT nFeatureLevels=ARRAY_SIZE(pFeatureLevels);
HRESULT hr = D3D11CreateDevice(NULL,
D3D_DRIVER_TYPE::D3D_DRIVER_TYPE_HARDWARE, /* was NONE in example I copied */
NULL,
0,
pFeatureLevels, /* was NULL */
nFeatureLevels, /* was 0 */
D3D11_SDK_VERSION,
等等。希望这很有用 - 我不太了解 API,无法真正发表评论。
【讨论】:
谢谢,这是一个很好的答案。我将使用 ComPtr——我的问题是我认为它是“metro SDK”的一部分,因此需要那个愚蠢的许可证并且必须为 metro 编写。但这完全是错误的,它适用于经典的桌面程序。 附带说明,我有一个应用程序试图在 Windows 7 上使用功能级别 11_1,并且驱动程序不断崩溃,因为它不知道该枚举值。顺便说一句,据我所知 11_1 仅适用于 Windows 8 及更高版本。以上是关于DirectX 11.1 和 Win32 桌面的主要内容,如果未能解决你的问题,请参考以下文章
c++ - Win32 窗口在第一次绘制后冻结(directx 11)
我的电脑是win7旗舰版32位 sp1(DirectX 11) 下载ie11安装前需要更新,点进页