DirectX 11.1和Win32桌面

时间:2013-02-11 01:17:18

标签: visual-c++ directx directx-11

我在理解DirectX 11.1时遇到了一些麻烦。我有兴趣用它构建传统的Win32桌面程序,但所有文档都适用于metro应用程序。 11.1仅适用于地铁应用吗?我认为并不是因为Windows 7中添加了对11.1的支持。

过去我在初始化D3D11时没有问题。它就像声明指针然后以标准C ++方式调用函数一样简单:

ID3D11Device *pDevice;

现在有了11.1,有很多新东西,如ComPtr:

ComPtr<ID3D11Device1> pDevice;

一个人没有创建D3D11.1设备,他们使用ComPtr的As()函数从D3D11转换它们,因此使ComPtr成为强制性要求。

假设桌面可以进行DX11.1开发,有没有办法使用传统的初始化而没有这种转换废话?

如果无法绕过它,如何为桌面初始化D3D11.1?

谢谢。

1 个答案:

答案 0 :(得分:4)

我认为你确实需要从DirectX11对象转换它,是的,但你可以在不使用普通COM ComObj<>的{​​{1}}辅助包装器的情况下执行此操作,例如:

QueryInterface

或者你可以使用帮助包装器,然后从中获取指针

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();
}

但在任何情况下使用辅助包装器可能更容易。


我的回答主要是关于COM引用计数处理,我的代码片段是基于MSDN的一个样本我认为。但是anonymous user points out并不是创建其中一个对象的一个​​很好的实际例子:

  

创建D3D11.1设备需要指定要素级别数组。请参阅D3D11CreateDevice上的MSDN页面。此外,D3D_DRIVER_TYPE_NULL是一个没有渲染功能的参考设备,不太可能是原始海报想要的。

他建议您添加功能级别数据并将其与

一起传递到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(); } 调用中
D3D11CreateDevice

等。希望这很有用 - 我不太了解API,不能发表评论。

相关问题