Learning D3D11
看微软教程:https://docs.microsoft.com/en-us/windows/win32/direct3dgetstarted/work-with-dxgi
对这行代码感到很不理解:m_pd3dDevice.As(&dxgiDevice);
它的作用是什么?可以用经典指针代替吗?
获取您之前创建的ID3D11设备引用。将其升级到IDXGIDevice3(如果尚未),然后调用IDXGIDevice::GetAdapter以获取 DXGI 适配器。通过调用IDXGIFactory2::GetParent获取该适配器的父工厂(IDXGIFactory2继承自IDXGIObject)- 现在,您可以使用该工厂通过调用CreateSwapChainForHwnd来创建交换链,如下面的代码示例所示。
DXGI_SWAP_CHAIN_DESC desc;
ZeroMemory(&desc, sizeof(DXGI_SWAP_CHAIN_DESC));
desc.Windowed = TRUE; // Sets the initial state of full-screen mode.
desc.BufferCount = 2;
desc.BufferDesc.Format = DXGI_FORMAT_B8G8R8A8_UNORM;
desc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
desc.SampleDesc.Count = 1; //multisampling setting
desc.SampleDesc.Quality = 0; //vendor-specific flag
desc.SwapEffect = DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL;
desc.OutputWindow = hWnd;
// Create the DXGI device object to use in other factories, such as Direct2D.
Microsoft::WRL::ComPtr<IDXGIDevice3> dxgiDevice;
m_pd3dDevice.As(&dxgiDevice); //这句话在干什么???
// Create swap chain.
Microsoft::WRL::ComPtr<IDXGIAdapter> adapter;
Microsoft::WRL::ComPtr<IDXGIFactory> factory;
hr = dxgiDevice->GetAdapter(&adapter);
if (SUCCEEDED(hr))
{
adapter->GetParent(IID_PPV_ARGS(&factory));
hr = factory->CreateSwapChain(
m_pd3dDevice.Get(),
&desc,
&m_pDXGISwapChain
);
}