环境配置 龙书dx12_DX12龙书系列一:DX的初始化(1)

42c91e89-1a2a-eb11-8da9-e4434bdf6706.png

从今天开始我们就会开始进行DX12龙书的学习,主要还是为了能够熟悉它的接口,并可以使用它进行编程,这样为我们未来的渲染器打好基础。

以前我们提到过COM技术,有个例子是这样,在Office文档中,可以放入一个视频,然后这个东西就会显示成一张静态的图片。我们双击这个图片,就会启用支持这个的软件对其进行播放。然后后台程序会启动,但窗口被隐藏。Office当中的一小块客户区域传递给这个后台程序,让其负责处理这块区域的绘制和用户输入。也就是说,Office程序的WM_PAINT事件处理当中,将Office窗口的整个客户区域分割为由自己绘制和由OLE绘制的部分。由OLE绘制的部分通过COM技术传递给后台应用进行绘制。COM的全称是Component Object Model,它让DX称为独立的编程语言并且向下兼容。我们通常使用特定的函数或者其它COM接口来获取COM接口引用的指针。另外,COM对接口是引用计数的,使用完毕后,需要调用Release方法来释放它们。为了管理COM对象的生命周期,Windows Runtime Library提供了wrl.h来管理COM对象的智能指针。龙书中主要用到了ComPtr三个方法:

1.Get:返回其包含的COM接口。

2.GetAddressOf:返回其包含的COM接口的指针指向的地址。

3.Reset:将ComPtr接口设置为空指针,并且减少其包含的COM接口的引用计数。

我们可以查看官方文档的说明:

ComPtr Class​docs.microsoft.com

可以看到,ComPtr是一个模板类,里面有一个成员ptr_,它是一个指针,指向了和这个ComPtr类关联的接口。这里要注意,&会释放它指向的接口,并返回ComPtr对象的地址。

GPU资源并不是像OpenGL里面那样直接绑定,而是通过descriptor对象来引用,也就是我们以前提到的各种描述符。这样做的原因是因为GPU资源本质上就是一堆普通的内存块,所以它们可以在渲染管线中不同阶段被使用。甚至GPU资源可以创建成无类型的,所以GPU可能不知道资源的类型,所以需要使用描述符来描述资源。

一个描述符堆是一个描述符的数组,它用来保存特定类型的描述符。Descriptors应该在初始化的时候创建,因为它需要做一些类型检查和验证。

然后是DXGI,他是和Direct3D一起使用的API,它的基本思想是:一些图形任务对于一些图形API是相同的,例如swap chain和page filpping在2D和3D情况下是相同的,所以交换链接口SwapChain就是DXGI API的一部分。他还有其他功能,例如全屏切换,遍历系统信息,它也定义了各种支持的表面格式。

这里我们还看到了transition resource barriers,也就是转换资源屏障,它提供了一种GPU之间的同步原语,可以一定程度上控制并发性。

好了,接下来我们就可以开始写代码了。

在此之前,先要弄好开发环境。只是DX12程序的话,用VS就好了,我选择的是2019版本,毕竟都2020年了。安装的时候,记得勾上C++游戏开发模块和通用Windows平台开发,如果你安装的是企业版,那么可以看到DX12的项目模板,会方便很多。而且DX12某种程度上和动态库类似,所以我们不必纠结到底是哪些头文件和库文件,能用就行(狗头)。然而我是个穷人,所以我不得不自己去拷贝文件,当然微软也是个好人,给我提供了文档:

Direct3D 12 programming environment setup - Win32 apps​docs.microsoft.com
43c91e89-1a2a-eb11-8da9-e4434bdf6706.png

我们这样创建一个空的Windows项目:

45c91e89-1a2a-eb11-8da9-e4434bdf6706.png

然后我们需要把D3D12文件引用进来。

48c91e89-1a2a-eb11-8da9-e4434bdf6706.png

按照我的理解,我只需要引入头文件就好了,因为dll以及在System32里面,这是一个系统目录,而我们使用D3D12 API也是通过对dll进行查询来获得的。

然后我们看下WindowsSdkDir的值,我们需要通过项目属性的VC++目录,然后可以看到具体的目录。里面最新版本下面,我们看到这个文件,然后,因为很多项目都需要用到它,于是我们单独建立一个Common文件夹放这些公用文件。

49c91e89-1a2a-eb11-8da9-e4434bdf6706.png

然后我们新建一个文件作为函数入口,windows平台的函数入口稍微有点麻烦:

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE prevInstance, PSTR cmdLine, int showCmd)
{
	return 0;
}

然后我们需要一些头文件,我们先全部放到上面。

#include <windows.h>
#include <wrl.h>
#include <dxgi1_4.h>
#include <d3d12.h>
#include <D3Dcompiler.h>
#include <DirectXMath.h>
#include <DirectXPackedVector.h>
#include <DirectXColors.h>
#include <DirectXCollision.h>
#include <string>
#include <memory>
#include <algorithm>
#include <vector>
#include <array>
#include <unordered_map>
#include <cstdint>
#include <fstream>
#include <sstream>
#include <cassert>
#include "../Common/d3d12.h"
#inclu
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值