我在理解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?
谢谢。
答案 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,不能发表评论。