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&lt;&gt; 辅助包装器来执行此操作,例如:

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)

win10是32还是64

我的电脑是win7旗舰版32位 sp1(DirectX 11) 下载ie11安装前需要更新,点进页

Win7安装魔兽争霸3后打不开提示“不能初始化DirectX”怎么办

如何在桌面应用程序中使用 DbContext 和 DI?

将我的 DirectX 应用程序移植到其他机器