はい、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については、コメントできるほどよく知りません。