DX12中comptr对象中getaddressof与取地址运算符的区别是:com的&会把管理的对象reset掉的,之后取指针地址。getaddressof就是单纯取指针地址。对于dx12来说,都只是初始化的时候用一下,基本只对空com用。
一、DX12中comptr对象中getaddressof与取地址运算符的区别
com的&会把管理的对象reset掉的,之后取指针地址。getaddressof就是单纯取指针地址。对于dx12来说,都只是初始化的时候用一下,基本只对空com用。
DirectX 12是微软最新的图形API库,只在Win10系统上提供支持(如果不是Win10必须要升级成Win10才能用)。对这套API,我最大的感触就是特别复杂,因为它暴露了很多底层的方法。即便是我学过DX9,但是面对DX12的时候依旧会是一脸懵逼的状态,不仅是因为DX12暴露了太多方法,还有就是它封装方法的思路。好了,闲话就说到这里,下面我会用我理解的思路来介绍DX12绘制流程,并且给出一套可运行的代码。
DX12的绘制流程大概是这样的:
首先,绘制需要一个绘制的环境。绘制环境是在代码层对硬件环境的一种抽象,所有的绘制都是在这个绘制环境中完成的,可以说绘制环境才是我们的“硬件”。DX12对绘制环境的抽象是ID3D12Device。
然后,绘制自然需要资源。这里的资源就包括用来暂存渲染结果的缓冲区,包括渲染缓冲区和深度缓冲区。
最后,绘制需要绘制指令。必须让GPU知道我们想怎么样绘制才行。
DX12使用的COM技术,什么是COM技术,简单的理解就是从一个统一的公共基类继承出来的子类,用这种技术最大的好处就是资源的分配和释放可以不用太操心。
延伸阅读:
二、创建交换链
交换链是一种资源,但它比较特殊,它是当前正在显示的数据和下一帧将显示的数据的保存地。现代的绘制方式通常是这样,一个交换链有2个缓冲区,分别是前缓冲区和后缓冲区,前缓冲区中的数据是当前显示(能看到的)数据,后缓冲区的数据是下一帧要显示的数据,当需要显示后缓冲区中的数据时,将后缓冲区设置为“前”缓冲区就行了,这是一个非常巧妙的设定。
创建交换链的难点在于要描述创建什么样的交换链,这个描述结构的成员很多很繁杂,可以参考官方的[说明文档](DXGI_SWAP_CHAIN_DESC)。创建交换链的流程非常简单,只有三步:1、释放已有的交换链。
2、填充描述结构,指明要创建什么样的交换链。
3、调用Factory的CreateSwapChain函数创建交换链。