这本书的第二章花了近80页的篇幅来具体介绍D3D11中的资源,并给出了一些资源创建使用的具体方法,各种资源有些非常相似而又有不同,因此很有必要做一个总结归纳。
资源总览
首先要明确一点,资源的本质就是内存块,这些内存块可以被GPU来读取和操控。
在第一章中已经提到了,D3D11中的资源无非就两类:Buffer和Texture,并且它们各自都有自己的子类,但不同种类的资源的本质都是相同的,它们的不同就在于各自的语义、格式、访问权限、使用方式。
资源的创建:资源的创建是由ID3D11Device来完成的,对于每种不同的资源都提供了不同的方法,但这些方法都遵循相同的模式:它需要接受三个参数,第一个是对资源的描述(resource description),第二个是D3D11_SUBRESOURCE_DATA结构体,它用来提供初始化资源的数据,第三个是一个指向指针的指针,它用来接受返回的最终生成的指向资源的指针。在这些参数中,决定了资源的独特性质的是对资源的描述,之后会详细讲述。
Usage Flags:Usage Flags是一个枚举类型,
enum D3D11_USAGE {
D3D11_USAGE_DEFAULT,
D3D11_USAGE_IMMUTABLE,
D3D11_USA6E_DYNAMIC,
D3D11JJSAGE_STAGING
}
这个类型代表的是CPU和GPU的访问权限。
DEFAULT:表示资源可以被GPU读写,CPU没有读写权限,代表资源有render texture、stream output vertex buffers
IMMUTABLE:表示资源只能被GPU读,不可以被GPU写或被CPU读写,代表资源有静态的顶点、索引数据,例如网格的顶点数据。
DYNAMIC:表示资源可以被GPU读和CPU写,代表资源有变换矩阵等。
STAGING:表示资源可以被GPU和CPU读写,这类资源用到的场合有很多。
CPU Access Flags:一个枚举类型,只有两种取值:
enum D3D11_CPU_ACCESS_FLA6 {
D3D11_CPU_ACCESS_WRITE,
D3D11_CPU_ACCESS_READ
}
表示CPU的访问权限,要与选定的Usage中的规则相对应,例如一个资源如果选定了Default Usage,那么它的CPU Access Flags只能置为0。如果要表示CPU可读写,就用或运算符将这两个枚举值连接点起来。
Bind Flags: Bind Flags表示资源可以绑定在流水线中的哪个位置,它也是一个枚举类型,有八种可能的取值,
enum D3D11_BIND_FLAG {
D3D11_BIND_VERTEX_BUFFER,
D3D11_BIND_INDEX_BUFFER,
D3D11_BIND_C0NSTANT_BUFFER,
D3D11_BIND_SHADER_RES0URCE,
D3D11_BIND_STREAM_OUTPUT,
D3D11_BIND_RENDER_TARGET,
D3D11_BIND_DEPTH_STENCIL,
D3D11_BIND_UNORDERED_ACCESS
}
结合流水线的图来看,这八种类型中,VERTEX_BUFFER和INDEX_BUFFER表示被绑定在输入装配阶段(Input Assembler),代表着资源的数据用作流水线的输入数据;RENDER_TARGET和DEPTH_STENCIL表示被绑定在输出归并阶段(Output Merger), 表示这些资源将用来获取光栅化渲染的最终图像的信息;STREAM_OUTPUT表示被绑定在流输出阶段(Stream Output),表示这些资源将用来获取流水线中间得到的几何信息;剩余的三种CONSTANT_BUFFER、SHADER_RESOURCE、UNORDERED_ACCESS表示资源被绑定在一些管线的一些可编程阶段,但它们之间略有不同,之后会详细讲述。
Miscellaneous Flags:用来表示资源的一些特殊性质,一般都是用在非传统的场合。这个在用到的时候再作具体解释。
enum D3D11_RES0URCE_MISC_FLAG {
D3D11_RESOURCE_MISC_GENERATE_MIPS,
D3D11_RESOURCE_MISC_SHARED,
D3D11_RESOURCE_MISC_TEXTURECUBE,
D3D11_RESOURCE_MISC_DRAWINDIRECT_ARGS,
D3D11_RESOURCE_MISC_BUFFER_ALO0W_RAW_VIEWS,
D3D11_RESOURCE_MISC_BUFFER_STRUCTURED,
D3D11_RESOURCE_MISC_RES0URCE_CLAMP,
D3D11_RESOURCE_MISC_SHARED_KEYEDMUTEX,
D3D11_RESOURCE_MISC_GDI_C0MPATIBLE
}
Resource View
在Bind Flags中一共有八种取值,它们代表着资源要被绑定在哪里,其中有四种表示资源可以直接被绑定到流水线上,它们是Vertex Buffer、Index Buffer、Constant Buffer、Stream Output Buffer,而其他的四种则不能被直接绑定到流水线上,它们需要借助一种适配器——Resource View,Resource View是与Resource绑定在一起的,它表示了资源的一些性质,决定了这些资源可以被执行哪些操作,同时也可以代表一些资源的子集。
Resource View Types
Resource View一共有四种:Render Target View、Depth Stentil View、Shader Resource View、Unordered Access View,下面分别介绍它们的意义。
Render Target View:它用于绑定一个资源来获取流水线的输出,即这个资源是可以被流水线修改的,并且它也会被流水线读取来执行一些操作,一般来说,Render Target View所绑定的资源是一个二维的Texture,但也可以绑定其他类型的资源。
Depth Stencil View:它与Render Target View类似,也是绑定一个资源来获取流水线的输出,不同的是,它绑定的是一个Depth Stencil Buffer,而不是一个带有颜色的Render Target,被Depth Stencil View绑定的资源都是用来作深度测试和模板测试的,它的读写性质是依靠一个额外的Flag来决定的,因为一个Depth Stencil Buffer既有可能用来做深度测试及模板测试和一个Depth Stencil View绑定在一起,同时作为输入数据和一个Shader Resource View绑定在一起,在这种情况下,这两个View都要被设定为只读的。但是当它只用在传统的获取流水线的输出结果时,要将其设置为可写的。
Shader Resource View:提供流水线中可编程着色器阶段的读取权限,它可以被用在所有的可编程着色器阶段。
Unordered Access View:像Shader Resource View一样,它让资源可以被着色器读取获取信息ÿ