DirectX12 helloworld
时间: 2023-07-31 11:05:04 浏览: 163
以下是使用 DirectX 12 编写的 "Hello World" 示例代码:
```cpp
#include <windows.h>
#include <d3d12.h>
#include <dxgi1_4.h>
#pragma comment(lib, "d3d12.lib")
#pragma comment(lib, "dxgi.lib")
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
// 创建窗口
HWND hWnd = CreateWindowEx(0, L"static", L"DirectX12 HelloWorld", WS_OVERLAPPEDWINDOW, 0, 0, 640, 480, nullptr, nullptr, hInstance, nullptr);
// 初始化 DirectX 12
IDXGIFactory4* dxgiFactory = nullptr;
HRESULT hr = CreateDXGIFactory1(IID_PPV_ARGS(&dxgiFactory));
if (FAILED(hr)) return 1;
IDXGIAdapter1* adapter = nullptr;
for (UINT adapterIndex = 0; DXGI_ERROR_NOT_FOUND != dxgiFactory->EnumAdapters1(adapterIndex, &adapter); ++adapterIndex)
{
DXGI_ADAPTER_DESC1 adapterDesc;
adapter->GetDesc1(&adapterDesc);
if (adapterDesc.Flags & DXGI_ADAPTER_FLAG_SOFTWARE)
{
continue;
}
// 创建设备
hr = D3D12CreateDevice(adapter, D3D_FEATURE_LEVEL_11_0, IID_PPV_ARGS(&device));
if (FAILED(hr)) return 1;
// 退出循环
break;
}
// 创建命令队列
D3D12_COMMAND_QUEUE_DESC queueDesc = {};
queueDesc.Type = D3D12_COMMAND_LIST_TYPE_DIRECT;
hr = device->CreateCommandQueue(&queueDesc, IID_PPV_ARGS(&commandQueue));
if (FAILED(hr)) return 1;
// 创建交换链
DXGI_MODE_DESC backBufferDesc = {};
backBufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
backBufferDesc.Width = 640;
backBufferDesc.Height = 480;
backBufferDesc.RefreshRate.Numerator = 60;
backBufferDesc.RefreshRate.Denominator = 1;
backBufferDesc.Scaling = DXGI_MODE_SCALING_UNSPECIFIED;
backBufferDesc.ScanlineOrdering = DXGI_MODE_SCANLINE_ORDER_UNSPECIFIED;
DXGI_SWAP_CHAIN_DESC swapChainDesc = {};
swapChainDesc.BufferCount = 2;
swapChainDesc.BufferDesc = backBufferDesc;
swapChainDesc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
swapChainDesc.OutputWindow = hWnd;
swapChainDesc.SampleDesc.Count = 1;
swapChainDesc.Windowed = TRUE;
IDXGISwapChain* swapChain = nullptr;
hr = dxgiFactory->CreateSwapChain(commandQueue, &swapChainDesc, &swapChain);
if (FAILED(hr)) return 1;
// 创建渲染目标视图
ID3D12Resource* backBuffer = nullptr;
hr = swapChain->GetBuffer(0, IID_PPV_ARGS(&backBuffer));
if (FAILED(hr)) return 1;
D3D12_DESCRIPTOR_HEAP_DESC heapDesc = {};
heapDesc.NumDescriptors = 1;
heapDesc.Type = D3D12_DESCRIPTOR_HEAP_TYPE_RTV;
heapDesc.Flags = D3D12_DESCRIPTOR_HEAP_FLAG_NONE;
ID3D12DescriptorHeap* rtvHeap = nullptr;
hr = device->CreateDescriptorHeap(&heapDesc, IID_PPV_ARGS(&rtvHeap));
if (FAILED(hr)) return 1;
CD3DX12_CPU_DESCRIPTOR_HANDLE rtvHandle(rtvHeap->GetCPUDescriptorHandleForHeapStart());
device->CreateRenderTargetView(backBuffer, nullptr, rtvHandle);
// 渲染循环
MSG msg = {};
while (msg.message != WM_QUIT)
{
if (PeekMessage(&msg, nullptr, 0, 0, PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else
{
// 清除后台缓冲区
float clearColor[] = { 0.0f, 0.2f, 0.4f, 1.0f };
commandList->ClearRenderTargetView(rtvHandle, clearColor, 0, nullptr);
// 切换后台缓冲区
hr = swapChain->Present(1, 0);
if (FAILED(hr)) return 1;
}
}
return 0;
}
```
这段代码创建了一个包含一个后台缓冲区的窗口,并在该缓冲区内清除颜色并显示它。
阅读全文