2013-02-11 46 views
2

我对理解DirectX 11.1有点困难。我有兴趣使用它构建传统的Win32桌面程序,但所有文档都适用于metro应用程序。仅适用于地铁应用程序?我认为不是因为支持11.1被添加到Windows 7.DirectX 11.1和Win32 Desktop

在过去我没有任何问题初始化D3D11。有一种新的东西一大堆像ComPtr 11.1现在

ID3D11Device *pDevice; 

ComPtr<ID3D11Device1> pDevice; 

而且一个不创造D3D11这是因为声明的指针,然后在标准C++的方式调用函数一样简单。 1设备,它们使用ComPtr的As()函数将它们从D3D11中转换出来,从而使ComPtr成为强制性要求。

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

如果没有办法绕过它,那么如何为桌面初始化D3D11.1?

谢谢。

+0

?这真的是强制性的吗?我期望它只是一个包装器,可以像ATL的CComPtr一样管理引用计数,而且可以作为QueryInterface的包装器。 – Rup 2013-02-11 01:20:17

+0

但是,您将如何创建11.1设备?我理解它的方式,没有办法直接创建一个,你必须使用As()来转换一个D3D11设备。 – SvalinnAsgard 2013-02-11 01:56:14

回答

4

我想你需要将其从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是没有渲染能力的参考设备,不太可能是原始海报所需的。

他建议你用

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, 

等希望这是有用的附加功能级别的数据并传递到D3D11CreateDevice调用一起 - 我不知道该API不够好,真的发表评论。

+0

谢谢,这是一个很好的答案。我将使用ComPtr--我的问题是我认为它是“地铁SDK”的一部分,因此需要这个愚蠢的许可证,并且必须为地铁编写。 但是,这完全是错误的,它适用于经典的桌面程序。 – SvalinnAsgard 2013-02-11 23:58:30

+0

作为一个方面说明,我有一个应用程序尝试在Windows 7上使用功能级别11_1,并且该驱动程序不断崩溃,因为它不知道该枚举值。顺便说一句,据我所知11_1只适用于Windows 8及以上版本。 – RelativeGames 2013-07-11 07:46:08