D3D12渲染技术概述

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/jxw167/article/details/81905522

从D3D9到D3D12逐步提升,现在很多以前的引擎还是停留在D3D9,D3D12用的比较少,相信不久的将来,引擎使用的D3D API都会更新到D3D12,为了普及D3D API的开发,会做一个系列文章用于介绍D3D12的特色和应用。由浅入深,逐步讲解,不论做游戏还是做VR,AR都会涉及到渲染,市场上很多公司会针对自己的项目封装一些图形接口用于渲染,掌握D3D12渲染技术是必须的,回到正题,现在市面上或者自研引擎已经进行了DX API的升级,比如Unity引擎已经更新到了D3D11,下面我们先将D3D11和D3D12做一个对比,通过比较从总体上先对D3D12渲染技术有大概的认识,它们最大的区别还是渲染管线。

渲染管线

先看看D3D11的渲染管线:
这里写图片描述

再看看D3D12的渲染管线:
这里写图片描述

二者最大区别是:多了一个Root signature,它表示的是CBV/SRV/UAV/Sampler的布局,比如一组VS/PS,VS用了2个CBV,PS用了1个CBV、2个SRV、1个Sampler,这样的布局就能生成一个专用的root signature。root signature和view的值无关,只和布局有关,所以其实是可以共享的。 另外,Heap是D3D12新增的概念,不管是CBV、SRV还是UAV,都可以把handle放到heap里。如此一来,只要通过设置heap就能一次切换一批CBV/SRV/UAV/Sampler,而不需要一个一个设置,降低了CPU开销,就好像普通程序里常见指针数组。在此给读者介绍一下关于CBV/SRV/UAV/Sampler,如下图所示:
这里写图片描述
其中SRV表示的是shader-resource views,这些都是一些缩写。

多线程

我们先看看多线程资源的处理方式,如下图所示:
这里写图片描述
对于GPU的提升也是非常明显的,如下图所示:
这里写图片描述
为了解释上面的内容,我们看看D3D12的另一个功能 Command List,它的作用见下图所示:
这里写图片描述
CPU向GPU中加入一组Command到Queue中,GPU并不是立即执行,因为GPU可能忙于处理以前的Command,如果Command的Queue空了,那GPU也是处于空闲等待状态,如果Command的Queue太慢了,CPU要在某个点处于等待状态,等GPU去执行Command,这种情况是我们不愿意看到的,我们还是希望CPU和GPU能够协同工作,充分调动起来,这里就要用到D3D12的另一个特性Fence,专门用于协调CPU与GPU的,CPU 等待 GPU 处理完所有在隔离点之前的指令,然后刷新指令队列。

Draw Call 模型

我们测试游戏通常会看Draw Call的运行时显示的数量,D3D12有自己的Draw Call 模型,它跟以前相比最大的区别是:

  • 之前的多线程渲染模型是由一个单独的渲染线程用来提交Draw/Dispatch调用,其他一个或多个线程处理游戏逻辑。
  • 新的多线程模型,每个线程都可以提交Draw/Dispatch调用。

它的模型如下图所示:
这里写图片描述

提交Draw Call的具体执行步骤:
1、创建一个或多个3D/计算队列
2、创建一个或多个命令列表
3、为每个命令列表记录Draw Call
4、执行命令列表

  • 小结:

    学习D3D12我们要先了解它的一些特性,后面我们会先从基础方面谈起,逐步深入,学习D3D API对于学习引擎有非常重要的帮助,可以帮助我们优化引擎,增加模块功能,封装功能模块库等等。

猜你喜欢

转载自blog.csdn.net/jxw167/article/details/81905522
今日推荐