一、Direct3D 11 知识
1. Direct3D 11资源
1.1 Direct3D资源简介
Direct3D 11利用资源来存储输入输出数据。资源分为:几何、纹理、着色数据。资源可以是有类型的,也可以是无类型的;可以控制资源的读写访问方式,也可以限定是被CPU还是GPU访问。在图形管道阶段最多可以创建128个资源。
一个Direct3D资源的生命周期分为:
(1)利用ID3D11Device接口创建资源;
(2)利用ID3D11DeviceContext接口,及利用上下文将资源绑定到图形管线;
(3)通过Realse方法释放资源。
1.2 Direct3D资源类型
(1)缓存资源:一组指定类型的数据的集合
分为顶点缓存(vetex buffer)、索引缓存(index buffer)和常量缓存(contant buffer)。顶点缓存常用于存储顶点数据,包括顶点的位置、法线、纹理坐标。索引缓存用于存储顶点的在其它顶点缓存中的索引(即偏移量),一个索引缓存可以指向多个顶点缓存。常量缓存用于存储常量数据。
(2)纹理资源:一种结构资源,用于存储纹理
一维纹理:纹理只在某一方向上变化,而在另一个方向上没有变化,相当于高度为1的二维纹理。使用ID3D11Texture1D接口来定义一维纹理。二维纹理:二维纹理是指纹理在相互垂直的两个方向发生变化。每个纹理单元可用u, v向量来表示,使用ID3D11Texture2D接口来定义二维纹理。
三维纹理:每个纹理单元可用u, v, w向量来表示,如下图所示。使用ID3D11Texture3D接口来定义三维纹理。
多重纹理:事先指定一系列分辨率逐渐减小的纹理图像。
纹理数组(texture arrays)是指包含相同结构的一组纹理数据,也就是说数组中的纹理必须有相同的数据结构(维度)和大小(纹理单元个数)。
注意 Direct3D 11 支持多重纹理和纹理数组,但是不能构建三维纹理数组。
1.3 资源的用法
D3D11_USAGE值 |
描述 |
CPU访问 |
GPU访问 |
D3D11_USAGE_IMMUTABLE |
资源创建后不能改变 |
不能 |
只读 |
D3D11_USAGE_DEFAULT |
资源内容改变速度最快每帧改变一次 |
不能 |
读/写 |
D3D11_USAGE_DYNAMIC |
资源内容可每帧改变多次 |
写 |
读 |
D3D11_USAGE_STAGING |
资源用於从GPU传递出入数据 |
读/写 |
拷贝 |
视图资源
资源接口 |
描述 |
ID3D11DepthStencilView |
深度/模板测试时访问资源 |
ID3D11RenderTargetView |
用于访问最终绘制目标的纹理资源 |
ID3D11ShaderResourceView |
访问着色器资源,例如:常量缓存、纹理缓存、纹理采样器等 |
ID3D11UnorderedAccessView |
在像素着色器或者计算着色器中访问随机资源 |
1.4 Direct3D 11 工程属性设置
Visual Studio 的工程属性的VC++ Directories中加入
Excutable Directories: $(DXSDK_DIR)Utilities\bin\x86
Include Directories: $(DXSDK_DIR)Include
Library Directories: $(DXSDK_DIR)Lib\x86
如果是Effect框架,则还需要在Include Directories中加入 $(DXSDK_DIR)Samples\C++\Effects11\Inc, 在Library Directories 中加入 $(DXSDK_DIR)Samples\C++\Effects11\Debug 或 $(DXSDK_DIR)Samples\C++\Effects11\Release。并且在$(DXSDK_DIR)Samples\C++\Effects11目录下,打开工程Effects11_*.sln,分别在Debug和Release模式下编译整个工程,分别得到Debug和Release模式下的两个lib库文件。
Linker Input 加入d3d11.lib, d3dcompiler.lib, d3dx11d.lib, d3dx9d.lib, dxerr.lib, dxguid.lib, winmm.lib,comctl32.lib, 以上lib也可以在源文件中通过 #pragma comment加入。
2. 初始化Direct3D 11步骤
2.1 描述交换链并创建设备、交换链和立即执行环境
2.2 创建目标视图并绑定到渲染管线