D3D11最基本的工程
2024-11-21
33
0
1.创建Deivce和DeivceContext(ImmediateContet)
HRESULT hr = D3D11CreateDevice(
0, // 使用默认显卡
md3dDriverType, // 一般使用D3D_DRIVER_TYPE_HARDWARE作为参数,不然买来的显卡只能吃灰了
0, // 不使用软件驱动
createDeviceFlags, // Debug下,我们要求Dx输出一些log信息
0, 0, // 默认等级的特性,默认就是11
D3D11_SDK_VERSION, // 我们使用Dx11的SDK
&md3dDevice,
&featureLevel,
&md3dImmediateContext);
2.创建交换链
D3D11Deivce->IDXGIAdapter->IDXGIFactory->IDXGISwapChain
IDXGIDevice2 * pDXGIDevice;
hr = g_pd3dDevice->QueryInterface(__uuidof(IDXGIDevice2), (void **)&pDXGIDevice);
IDXGIAdapter * dxgiAdapter;
hr = pDXGIDevice->GetParent(__uuidof(IDXGIAdapter), (void **)&dxgiAdapter);
IDXGIFactory* dxgiFactory = 0;
HR(dxgiAdapter->GetParent(__uuidof(IDXGIFactory), (void**)&dxgiFactory));
IDXGISwapChain* mSwapChain;
HR(dxgiFactory->CreateSwapChain(md3dDevice, &sd, &mSwapChain)); // 根据设备和切换链描述创建切换链
3.创建目标渲染视图
根据交换链的后台缓冲区创建其对应的目标渲染视图
ID3D11Texture2D* backBuffer;
//获取后台缓冲区
HR(mSwapChain->GetBuffer(0, __uuidof(ID3D11Texture2D), reinterpret_cast<void**>(&backBuffer)));
ID3D11RenderTargetView* mRenderTargetView;
HR(md3dDevice->CreateRenderTargetView(backBuffer, 0, &mRenderTargetView)); // 创建渲染对象
ReleaseCOM(backBuffer);
//设置目标视图
md3dImmediateContext->OMSetRenderTargets(1, &mRenderTargetView, NULL);
4.设置视口
https://www.pnpon.com/article/detail-777.html
D3D11_VIEWPORT mScreenViewport;
mScreenViewport.TopLeftX = 0; // 视窗距窗口的X距离
mScreenViewport.TopLeftY = 0; // 视窗距窗口的Y距离
mScreenViewport.Width = static_cast<float>(mClientWidth); // 视口宽
mScreenViewport.Height = static_cast<float>(mClientHeight); // 视口高
mScreenViewport.MinDepth = 0.0f; // 最小深度
mScreenViewport.MaxDepth = 1.0f; // 最大深度
md3dImmediateContext->RSSetViewports(1, &mScreenViewport); // 重置视窗
5.渲染目标视图
md3dImmediateContext->ClearRenderTargetView(mRenderTargetView, color);
6.提交翻转后台缓冲区为前台绘冲区,进行渲染出图
mSwapChain->Present(0, 0);