需要 d3dx12.h 和 shaders.hlsl
d3dx12.h
https://github.com/Microsoft/DirectX-Graphics-Samples/blob/master/Libraries/D3DX12/d3dx12.h
参考
完整程序
#include <windows.h>
#include <wrl.h>
#include <d3d12.h>
#include <dxgi1_4.h>
#include <vector>
#include <DirectXColors.h>
#include <DirectXMath.h>
#include <memory>
#include <unordered_map>
#include <DirectXCollision.h>
#include <D3Dcompiler.h>
#include <iostream>
#include "d3dx12.h"
#pragma comment(lib,"d3dcompiler.lib")
#pragma comment(lib, "D3D12.lib")
#pragma comment(lib, "dxgi.lib")
using Microsoft::WRL::ComPtr;
using namespace DirectX;
int mWidth = 800;
int mHeight = 600;
int mIndexLastSwapBuf = 0;
int cNumSwapBufs = 2;
ComPtr<IDXGISwapChain> mSwapChain;
// vertex definition
struct VERTEX {
FLOAT X, Y, Z; FLOAT Color[4]; };
// pipeline objects
D3D12_VIEWPORT mViewPort;
D3D12_RECT mRectScissor;
ComPtr<ID3D12Device> mDevice;
ComPtr<ID3D12Resource> mRenderTarget;
ComPtr<ID3D12CommandAllocator> mCommandAllocator;
ComPtr<ID3D12CommandQueue> mCommandQueue;
ComPtr<ID3D12RootSignature> mRootSignature;
ComPtr<ID3D12DescriptorHeap> mDescriptorHeap;
// fence objects
ComPtr<ID3D12Fence> mFence;
UINT64 mCurrentFence;
HANDLE mHandleEvent;
// asset objects
ComPtr<ID3D12PipelineState> mPSO;
ComPtr<ID3D12GraphicsCommandList> mCommandList;
ComPtr<ID3D12Resource> mBufVerts;
D3D12_VERTEX_BUFFER_VIEW mDescViewBufVert;
void InitPipeline(HWND hWnd)
{
// create the device
D3D12CreateDevice(nullptr, D3D_FEATURE_LEVEL_12_0, IID_PPV_ARGS(&mDevice));
// create command queue
D3D12_COMMAND_QUEUE_DESC queueDesc;
ZeroMemory(&queueDesc, sizeof(queueDesc));
queueDesc.Flags = D3D12_COMMAND_QUEUE_FLAG_NONE;
queueDesc.Type = D3D12_COMMAND_LIST_TYPE_DIRECT;
mDevice->CreateCommandQueue(&queueDesc, IID_PPV_ARGS(&mCommandQueue));
// create dxgi factory
ComPtr<IDXGIFactory> pDxgiFactory;
CreateDXGIFactory1(IID_PPV_ARGS(&pDxgiFactory));
// create swap chain descriptor
DXGI_SWAP_CHAIN_DESC descSwapChain;
ZeroMemory(&descSwapChain, sizeof(descSwapChain));
descSwapChain.BufferCount = cNumSwapBufs;
descSwapChain.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
descSwapChain.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
descSwapChain.SwapEffect = DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL;
descSwapChain.OutputWindow = hWnd;
descSwapChain.SampleDesc.Count = 1;
descSwapChain.Windowed = TRUE;
// create the swap chain
pDxgiFactory->CreateSwapChain(mCommandQueue.Get(), &descSwapChain, &mSwapChain);
// create the command allocator object
mDevice->CreateCommandAllocator(D3D12_COMMAND_LIST_TYPE_DIRECT, IID_PPV_ARGS(&mCommandAllocator));
}
void waitForGPU()
{
// signal and increment the fence value
const UINT64 fence = mCurrentFence;
mCommandQueue->Signal(