用DirectX 12进行3D游戏编程入门「3」——第一个三角形显示程序

这篇博客介绍了使用DirectX 12进行3D游戏编程的基础,通过引用d3dx12.h库和shaders.hlsl着色器文件,展示了创建并运行显示第一个三角形的完整程序。参考了Intel的教程,适合初学者入门。
摘要由CSDN通过智能技术生成

需要 d3dx12.h 和 shaders.hlsl
d3dx12.h
https://github.com/Microsoft/DirectX-Graphics-Samples/blob/master/Libraries/D3DX12/d3dx12.h
参考

  1. https://software.intel.com/zh-cn/articles/tutorial-migrating-your-apps-to-directx-12-part-1?utm_source=CnBlogs&utm_medium=Social+Media&utm_campaign=GameDev_PRC_Q116_Syndication

完整程序

#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(
  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值