The Beauty of DirectX 11 (1) --- Device & Resource
作者:clayman
仅供个人学习使用,请勿转载,勿用于任何商业用途。
这是一系列关于DirectX 11的文章中的第一篇,部分内容来自于<<Practical Rendering & Computation with Direct3D 11>>一书(我没有电子版,不要找我要电子版@_@!!如果你感兴趣,这里可以找到此书的源码),但不是翻译。文章不会介绍常见的基本概念,并且假定读者已经有DirectX9/10或者xna使用经验,并对图形学有一定了解。此外,也不会有太多示例代码,我将会着重介绍DirectX 11中API的新特性和用法,整个pipeline流程以及HLSL 5.0, 文章将不定期更新,但不保证最后一定能写完:)
当使用DirectX 11时,首先要清楚的就是device拆分为了2个类:device和device context。ID3D11Device负责资源创建,查询硬件功能一些和debug相关的操作。ID3D11Device还引入了一个称为feature levels的概念(和dx9中的Caps类似),允许DirectX11运行在早期硬件上,比如DX9/10级别的GPU。这意味着开发者可以使用一组统一的接口来开发运行在不同代硬件上的程序。因此,如果你正考虑更新引擎的话,可以直接跳过DirectX10,升级到DirectX11。
所有使用资源,管理渲染流水线的功能,则属于device context的职责,包括绑定资源,shader,设置render state,执行渲染命令等等。Device context的功能通过ID3D11DeviceContext接口实现, 为了支持多线程,又分为immediate context和deferred context两种。前者和之前的DX device类似,每个程序只允许有一个immediate context,它所发出的所有命令都直接由runtime提交到到驱动执行。Dferred context所发出的命令则先缓存在一块command list缓冲中,提交整块缓冲时,才会依次执行其中的指令。这部分会在讲多线程的时候详细讨论。可以通过D3D11CreateDevice和D3D11CreateDeviceAndSwapChain创建设备,SDK对这两个函数,以及所有参数的用法有详细文档,这里不再重复。
接下来,我们将详细讨论DX11中的资源(Resource),因为它们是所有操作的最基本元素。DX11中的资源分为两类:buffer和texture,每种又有各自的子类型,以及不同的配置参数,基本类关系如下:
ID3D11Resource
|
|---- ID3DBuffer
|---- ID3D11Texture1D
|---- ID3D11Texture2D
|---- ID3D11Texture3D
如前所述,所有资源都必须通过ID3D11Device创建,所创建的资源可以直接或者间接通过resource view绑定到pipleline的某个阶段。虽然每种创建每种资源的方法不一样,但模式是相同的:所有创建函数都接受3个参数 1. 包含了对所创建资源各种选项描述的结构(resource description), 2. 指向D3D11_SUBRESOURCE_DATA结构,用来初始化资源数据的指针, e.g 用来初始化vertex buffer的顶点数据。如果希望稍后再填充数据,可以使用null;3,所创建的资源对象。每种资源的resource description都不一样,接下来,我介绍一些常用参数和选项:
Resource Usage Flags(D3D11_USAGE)
资源可以存放在显存和系统内存,可以作为复制操作的数据源或者目标。DX根据这个枚举来选择放置资源的位置以及内部如何操作,e.g 把只有GPU能操作的资源放到显存中,这个参数类似于之前的memory pool,区别在于memory pool是直接指定了资源位置。D3D11_USAGE有四个值,每种的访问级别也不一样
GPU-Read GPU-Write CPU-Read CPU-Write
Default yes yes
Dynamic yes yes
Immutable yes
Staging yes yes yes yes
Immutable 最简单的类型,一旦创建之后数据就不可改变。适合储存静态数据,比如静态常量,顶点索引缓冲等。
Default 对于只需要被GPU操作(读写)的数据来说,这是最优的选项,适合于render target, stream ouput vertex buffer等。这种类型资源通常存在于显存中,效率非常高。
Dynamic 这是一种CPU可以访问的资源,允许CPU写入数据,之后由GPU读取,注意CPU是不能访问已写入输入的,适合于shader constant buffer.
Staging 这种类型的资源提供了一种特别的访问模式,允许GPU写入数据,之后由CPU读出。它存在的主要作用是提供其他3种资源之间的交换,对于GPGPU和stream output 特别有用
下一部分讲继续讨论与资源相关的内容.....
-------------------------------------to be continue----------------------------------
嗯嗯,我还活着,又打算开始写东西了.......