2

我在理解 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?

谢谢你。

4

1 回答 1

4

我认为您确实需要将其从 DirectX11 对象转换,是的,但是您可以在不使用ComObj<>使用普通 COM 的辅助包装器的情况下执行此操作,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();
}

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

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 的一个示例。然而,一位匿名用户指出,创建这些对象之一并不是一个很好的实际示例:

创建 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 的了解还不够好,无法真正发表评论。

于 2013-02-11T13:45:59.687 回答