从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对于学习引擎有非常重要的帮助,可以帮助我们优化引擎,增加模块功能,封装功能模块库等等。

D3D12渲染技术概述相关推荐

  1. D3D12渲染技术之渲染管线

    渲染管线指的是通过虚拟相机看到的内容生成2D图像的整个步骤序列,在博客D3D12渲染技术概述中介绍过渲染管线,本篇博客具体讲解各个模块的作用,先看下图所示: Input Assembler Stage ...

  2. LOD地形渲染技术概述

    参考文章 http://blog.sina.com.cn/s/blog_5e3213f30100zxet.html LOD技术简述 http://blog.sina.com.cn/s/blog_458 ...

  3. 二次元卡通角色渲染技术概述

    ** 概述 ** 好久没写博客了,最近一直在学习二次元卡通渲染技术,自从崩坏三,闪耀暖暖等二次元游戏出来后,作为程序员对他们使用的渲染技术很感兴趣,二次元卡通目前主要分为欧美卡通和日式卡通,我们以日式 ...

  4. D3D12渲染技术之混合

    本篇博客给读者介绍混合,见下图所示, 我们首先绘制地形,然后绘制木箱,然后将地形和木箱像素放在后面的缓冲区上. 我们使用混合将水面绘制到后面的缓冲区,以便水像素与地形混合,并在后面缓冲区上放置像素,使 ...

  5. D3D12渲染技术之初始化流程

    掌握了矩阵向量运算后,接下来我们要做的事情利用D3D12图形库API编程,也就是我们通常说的初始化D3D12,D3D12的初始化工作与以前的D3D9是完全不一样的,D3D12做了大幅的升级.但是每个D ...

  6. D3D12渲染技术之创建和启用纹理

    纹理在任何引擎都有使用,它其实就是为模型提供的纹理材质,既然我们介绍的是D3D12,那就从dds文件介绍说起. 加载DDS文件 Microsoft提供了轻量级源代码来加载DDS文件: https:// ...

  7. D3D12渲染技术之常量缓冲区

    常量缓冲区是GPU资源(ID3D12Resource),其数据内容可以在着色器程序中引用,正如我们将在博客中学到的,纹理和其他类型的缓冲区资源也可以在着色器程序中引用.顶点着色器具有以下代码: cbu ...

  8. D3D12渲染技术之绘制网格

    在前几篇博客中,我们主要关注渲染管道的概念和数学方面. 反过来,从本篇博客开始重点介绍配置渲染管道,定义顶点和像素着色器以及将几何图形提交到渲染管道以进行绘制所需的Direct3D API接口和方法. ...

  9. D3D12渲染技术之编译Shader

    很多人只知道写Shader,但是并不了解DX或者OpenGL是如何编译Shader的,我们写的Shader是一种文本文件,它可以被DX或者OpenGL读取,说明它们提供了接口编译Shader.3D引擎 ...

  10. D3D12渲染技术之顶点着色器

    相信大家以前用过D3D9的或是编写过Shader的对顶点着色器都比较了解,现在我们回顾一下: cbuffer cbPerObject : register(b0) {float4x4 gWorldVi ...

最新文章

  1. TENSORFLOW变量作用域(VARIABLE SCOPE)
  2. linux run文件夹,Linux下运行run文件
  3. 「BZOJ 2342」「SHOI 2011」双倍回文「Manacher」
  4. 因 Redis 分布式锁造成的 P0 级重大事故,整个项目组被扣了绩效。。。
  5. 使用Fiddler监控使用RestTemplate发送网络请求的Java应用
  6. Flume-NG源码阅读之AvroSink
  7. 移动硬盘拒绝访问找到数据的法子
  8. 深入浅出聊Unity3D优化:从Draw Calls到GC
  9. tp1900芯片对比7621a_MT7621A和MT7620A两个芯片各有什么特点?
  10. 【Win10自带录屏工具】
  11. 心电信号越界怎么回事_一种心电信号处理方法
  12. Android 不透明度对应数值
  13. 绿米Aara单火开关,ZigBee智能开关和单火线取电技术, 对于单火取电电源和ZIGBEE缩合分析
  14. 华为OD机试真题 Python 实现【检测热点字符】【2023 Q1 | 100分】
  15. iccv2020论文汇总_2020年计算机视觉与数据挖掘国际学术会议( ICCVDM2020 )
  16. 三个字母的单词颠倒也是单词_世界上最强大的两个字母的单词
  17. php 数字 字母组合,php随机生成数字字母组合的方法_php技巧
  18. 基于顺序表的图书管理系统(C语言)
  19. HM10.1码率控制模块代码详解(1)---------序列级码率控制类TEncRCSeq介绍
  20. 聊聊云原生数据库的一致性

热门文章

  1. 电脑横机服务器维修,三招搞定电脑横机维修
  2. B/S还是C/S? ERP技术的新方向(转)
  3. 操作系统原理实验报告——进程控制与描述
  4. 说说id获取器手机版_怎么提取自己空间说说的ID
  5. linux软盘镜像下载,软盘镜像Image文件制作(WinImage Pro)
  6. php arcsin函数,三角函数计算器
  7. js 操作ntko控件实现编辑文档内容
  8. 大数据Hadoop(五):Hadoop架构
  9. 17张程序员搞笑图片
  10. Flutter封装加载状态视图,加载中、加载成功、加载失败、加载无数据