我认为您确实需要将其从 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 的了解还不够好,无法真正发表评论。