【翻(xue)译(xi)】3D Game Programming With DirectX11 - 4.2

4.2 初始化Direct3D

初始化Direct3D可以被分成以下步骤:
(1) 使用D3DCreateDevice来创建一个ID3D11Device 和 ID3D11DeviceContextd接口;
(2) 使用ID3D11Device::CheckMultisampleQualityLevels来检查4重采样抗锯齿所支持的质量等级;
(3) 填充一个DXGI_SWAP_CHAIN_DESC 来描述我们将要创建的交换链实例;
(4) 查询我们创建设备时使用的IDXGIFactory实例,然后创建一个IDXGISwapChain实例;
(5) 创建一个渲染对象视图到后台缓存;
(6) 创建 深度/模板缓存,它和 深度/模板视图是对应的
(7) 把渲染对象和深度/模板缓存都绑定到渲染管线的输出阶段,这样一来他们可以被Direct3D使用
(8) 设置一个观看的视角

4.2.1 创建设备和环境
初始化Direct3D首先要创建设备(ID3D11Device)和环境(ID3d11DeviceContext)。这两个接口是Direct3D的主要接口,可以让我们用软件控制物理硬件。比如我们可以在GPU中开辟内存,清除后台缓存,把资源绑定到不同的渲染阶段,画几何体,等。
(1) ID3D11Device接口用来检查我们的版本支持,和为资源开辟内存
(2) ID3D11DeviceContext接口用来设置渲染阶段,绑定资源到图形管线,发出渲染指令
我们使用下面这个函数来创建设备和环境:
HRESULT D3D11CreateDevice( 创建渲染设备和环境
IDXGIAdapter *pAdapter,想要让设备成为的适配器(null为默认)
D3D_DRIVER_TYPE DriverType, 驱动类型(D3D_DRIVER_TYPE_HARDWARE)
HMODULE Software, 软件驱动(常为null因为楼上hardware)
UINT Flags, (可选)创建设备时的标识(可以位运算到一块)
CONST D3D_FEATURE_LEVEL *pFeatureLevels, 特征级的数组(见前文)
UINT FeatureLevels, 上边那个数组的长度。上边null则这里0
UINT SDKVersion, 就是 D3D11_SDK_VERSION
ID3D11Device **ppDevice, 我们的Device接口
D3D_FEATURE_LEVEL *pFetureLevel, 最高支持的特征级
ID3D11DeviceContext **ppImmediateContext, 我们的DeviceContext接口
);
DriverType一般被设置为D3D_DRIVER_TYPE_HARDWARE ,不过也有以下选项:
D3D_DRIVER_TYPE_REFERENCE: 创建一个参考设备。参考设备是用软件渲染的,一般是为了正确性,它十分慢。这个只对开发者开放,不应该用在正式应用中。只有两种情况下会使用这个参考设备:
1) 检查你的硬件是否支持你的代码,比如当你没有Direct3D11图形卡的时候检查你的Direct3D11代码。
2) 检查驱动的bug。如果你的代码在之前的设备运行正常但是这个不行的时候可能你的驱动有问题
3D_DRIVER_TYPE_SOFTWARE: 创建一个软件驱动来模拟3d硬件。为了使用一个一个软件驱动程序,你必须建立一个你自己的或者使用一个第三方的软件驱动。不同于下边将要提到的WARP,Direct3D并不提供一个软件驱动
D3D_DRIVER_TYPE_WARP: 创建一个高表现的Direct3D 10.1 软件驱动。WARP(Windows Advanced Rasterization Platform)。我们不感兴趣因为11不支持啊哈。
Flags 创建设备的标识,常用的有以下:
D3D11_CREATE_DEVICE_DEBUG: 用于debug模式,如果要debug的话这个flag应该被设置。此时Direct3D会发送debug信息到vc++的输出窗口。
D3D_CREATE_DEVICE_SINGLETHREADED: 如果你能保证Direct3D不会被多线程调用的话,这个可以提高性能。如果这个flag被设置了的话,ID3D11Device::CreateDeferredContext 这个功能将会失败。

然后作者举了一个程序的栗子。
Tips: 注意到,我们把我们的设备环境叫做立即的环境。其实,也有一个类似的叫做延期的环境:ID3D11Device::CreateDeferredContext。这是DX11所支持的多线程的一部分。多线程作为高级主题本书中不讲,不过它的基本思想是这样的:
1) 在主线程上使用立即的环境
2) 在独立的其他工作线程上使用延期的环境
每一个工作线程都可以记录图形卡命令到一个命令列表(ID3DCommandList);每个工作线程的命令列表都可以被主渲染线程执行。
如果命令列表的收集需要时间,比如复杂的图形渲染会出现这一情况,那么在平行线程中收集这些命令就有优势了。

4.2.2 检查4倍 多重采样反走样的质量等级的支持性
现在我们已经创建了一个设备了。我们可以开始检查多重采样所支持的质量等级了。还记得那年我们讲过的DX11会支持所有渲染目标格式的多重采样吗?不过它支持的质量等级可能不一样。
因为设备总是支持的,所以我们检查出来的质量等级应该总是大于0的。

4.2.3 描述交换链
接下来我们要创建一个交换链。首先我们要填充一个 DXGI_SWAP_CHAIN_DESC 结构体实例。这个实例描述了我们要创建的交换链。
Tips: 如果你想要在运行时改变多重采样的设置,你得重新创建后台缓存了
Tips: 我们使用DXGI_FORMAT_R8G8B8A8_UNORM 这个格式作为后台缓存的像素格式,因为显示器一般不支持24位以上的颜色,所以多余的精度就被浪费了。多余的8位alpha值,不会被显示在显示器上,但是有它我们可以做一些别的事情。

4.2.4 创建交换链
交换链(IDXGISwapChain)是由一个IDXGIFactory实例,通过IDXGIFactory::CreateSwapChain这个方法创建的。
我们可以通过CreateDXGIFactory这个函数获得一个纸箱IDXGIFactory实例的指针。不过,如果我们获得这样的一个IDXGIFactory实例,然后再调用CreateSwapChain,我们会报这个错:
DXGI Warning: IDXGIFactory::CreateSwapChain: 这个函数正在调用的设备是另外一个IDXGIFactory上的。
正确的方法是,使用那个创建设备的IDXGIFactory来创建后处理链。为了得到这个实例,我们通过以下COM查询来得到。

Tips: DXGI(DirectX Graphics Infrastructure )(DX图形基础设施)是一个独立于Direct3D的API,它处理图像相关的东西,比如说交换链、枚举图形硬件、切换全屏模式。之所以把它做成独立的API,是因为其他例如Direct2D也会需要交换链、枚举图形硬件、切换全屏模式。这样一来,多种图形API都可以使用DXGI API。

4.2.5 创建渲染目标视图
如前所述,我们不需要把资源直接绑定到管线的某个阶段。我们需要创建一个资源视图给这个资源,然后把这个资源视图绑定到这个管线阶段。准确的说,为了把后台缓存绑定到管线的输出阶段(从而Direct3D可以渲染它),我们需要给后台缓存创建一个渲染目标视图。例子如下。
ID3D11RenderTargetView *mRenderTargetView;
ID3D11Texture2D *backBuffer;
mSwapChain->GetBuffer(0, __uuidof(ID3D11Texture2D),
reinterpret_cast

翻译存疑:

reference device: 参考设备
WARP(Windows Advanced Rasterization Platform):?
This function is being called from a device from a different IDXGIFactory.:这个函数正在调用的设备是另外一个IDXGIFactory上的
mipmap level: 多纹理映射的级别/多分辨率纹理
usage flag: 用途标签
CPU access flag: CPU 权限标志
output merger state: 输出混合阶段
viewpoint: 视窗

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Introduction to 3D Game Programming with DirectX 9.0,中文书名为《DirectX 9.0 3D 游戏开发编程基础》,资源是这本书的英文原版,配有详细的书签目录 最后附上其中文目录 目录 第Ⅰ部分 基础知识 必备的数学知识 3 3D空间中的向量 3 向量相等 7 计算向量的长度 7 向量的规范化 8 向量加法 9 向量减法 9 数乘 10 点积 11 叉积 11 矩阵 12 矩阵相等、矩阵数乘和矩阵加法 13 矩阵乘法 14 单位矩阵 15 逆矩阵 15 矩阵的转置 16 D3DX矩阵 16 基本变换 19 平移矩阵 20 旋转矩阵 21 比例变换矩阵 23 几何变换的组合 24 向量变换的一些函数 25 平面(选读) 26 D3DXPLANE 27 点和平面的空间关系 27 平面的创建 28 平面的规范化 29 平面的变换 29 平面中到某一点的最近点 30 射线(选读) 31 射线 31 射线与平面的相交 32 小结 32 第Ⅱ部分 Direct3D基础 第1章 初始化Direct3D 37 1.1 Direct3D概述 37 1.1.1 REF设备 38 1.1.2 D3DDEVTYPE 38 1.2 COM(组件对象模型) 38 1.3 预备知识 39 1.3.1 表面 39 1.3.2 多重采样 41 1.3.3 像素格式 42 1.3.4 内存池 42 1.3.5 交换链和页面置换 43 1.3.6 深度缓存 44 1.3.7 顶点运算 45 1.3.8 设备性能 45 1.4 Direct3D的初始化 46 1.4.1 获取接口IDirect3D9的指针 47 1.4.2 校验硬件顶点运算 47 1.4.3 填充D3DPRESENT_PARAMETER结构 48 1.4.4 创建IDirect3DDevice9接口 50 1.5 例程:Direct3D的初始化 51 1.5.1 d3dUtility.h/cpp 52 1.5.2 例程框架 53 1.5.3 例程:D3D初始化 54 1.6 小结 56 第2章 绘制流水线 58 2.1 模型表示 59 2.1.1 顶点格式 60 2.1.2 三角形单元 60 2.1.3 索引 61 2.2 虚拟摄像机 62 2.3 绘制流水线 63 2.3.1 局部坐标系 64 2.3.2 世界坐标系 64 2.3.3 观察坐标系 65 2.3.4 背面消隐 67 2.3.5 光照 68 2.3.6 裁剪 68 2.3.7 投影 69 2.3.8 视口变换 70 2.3.9 光栅化 72 2.4 小结 72 第3章 Direct3D中的绘制 73 3.1 顶点缓存与索引缓存 73 3.1.1 创建顶点缓存和索引缓存 73 3.1.2 访问缓存内容 76 3.1.3 获取顶点缓存和索引缓存的信息 77 3.2 绘制状态 78 3.3 绘制的准备工作 78 3.4 使用顶点缓存和索引缓存进行绘制 79 3.4.1 IDirect3DDevice9::DrawPrimitive 79 3.4.2 IDirect3DDevice9::DrawIndexedPrimitive 80 3.4.3 Begin/End Scene 81 3.5 D3DX几何体 81 3.6 例程:三角形、立方体、茶壶、D3DXCreate* 83 3.7 小结 87 第4章 颜色 89 4.1 颜色表示 89 4.2 顶点颜色 92 4.3 着色 92 4.4 例程:具有颜色的三角形 93 4.5 小结 95 第5章 光照 97 5.1 光照的组成 97 5.2 材质 98 5.3 顶点法线 100 5.4 光源 102 5.5 例程:光照 105 5.6 一些附加例程 108 5.7 小结 108 第6章 纹理映射 109 6.1 纹理坐标 110 6.2 创建并启用纹理 111 6.3 纹理过滤器 112 6.4 多级渐进纹理 113 6.4.1 多级渐进纹理过滤器 114 6.4.2 使用多级渐进纹理 114 6.5 寻址模式 114 6.6 例程:纹理四边形 116 6.7 小结 118 第7章 融合技术 119 7.1 融合方程 119 7.2 融合因子 121 7.3 透明度 122 7.3.1 Alpha通道 122 7.3.2 指定Alpha来源 123 7.4 用DirectX Texture Tool创建Alpha通道 123 7.5 例程:透明效果 125 7.6 小结 127 第8章 模板 128 8.1 模板缓存的使用 129 8.1.1 模板缓存格式的查询 129 8.1.2 模板测试 130 8.1.3 模板测试的控制 130 8.1.4 模板缓存的更新 132 8.1.5 模板写掩码 132 8.2 例程:镜面效果 133 8.2.1 成像中的数学问题 133 8.2.2 镜面效果实现概述 134 8.2.3 代码解析 135 8.3 例程:Planer Shadows 139 8.3.1 平行光阴影 139 8.3.2 点光源产生的阴影 140 8.3.3 阴影矩阵 141 8.3.4 使用模板缓存防止二次融合 142 8.3.5 代码解析 143 8.4 小结 144 第Ⅲ部分 Direct3D的应用 第9章 字体 149 9.1 ID3DXFont接口 149 9.1.1 创建一个ID3DXFont接口对象 149 9.1.2 绘制文本 150 9.1.3 计算每秒绘制的帧数 151 9.2 CD3DFont 152 9.2.1 创建CD3DFont类的实例 152 9.2.2 绘制文本 152 9.2.3 清理 153 9.3 D3DXCreateText函数 153 9.4 小结 155 第10章 网格(一) 156 10.1 几何信息 156 10.2 子集和属性缓存 157 10.3 绘制 159 10.4 网格优化 159 10.5 属性表 161 10.6 邻接信息 163 10.7 克隆 164 10.8 创建网格(D3DXCreateMeshFVF) 165 10.9 例程:网格的创建与绘制 167 10.10 小结 172 第11章 网格(二) 174 11.1 ID3DXBuffer 174 11.2 XFile 175 11.2.1 加载XFile文件 175 11.2.2 XFile材质 176 11.2.3 例程:XFile 177 11.2.4 生成顶点法线 180 11.3 渐进网格 181 11.3.1 生成渐进网格 182 11.3.2 顶点属性权值 183 11.3.3 ID3DXPMesh接口方法 183 11.3.4 例程:Progressive Mesh 184 11.4 外接体 187 11.4.1 一些新的特殊常量 189 11.4.2 外接体的类型 189 11.4.3 例程:Bounding Volumes 190 11.5 小结 192 第12章 设计一个灵活的Camera类 193 12.1 Camera类的设计 193 12.2 实现细节 195 12.2.1 观察矩阵(取景变换矩阵,View Matrix)的计算 195 12.2.2 绕任意轴的旋转 198 12.2.3 俯仰、偏航和滚动 199 12.2.4 行走、扫视和升降 201 12.3 例程:Camera 202 12.4 小结 205 第13章 地形绘制基础 206 13.1 高度图 207 13.1.1 创建高度图 207 13.1.2 加载RAW文件 208 13.1.3 访问和修改高度图 209 13.2 创建地形几何信息 210 13.2.1 顶点的计算 212 13.2.2 索引的计算 214 13.3 纹理映射 216 13.4 光照 219 13.4.1 概述 219 13.4.2 坐标方格的明暗度计算 220 13.4.3 对地形进行着色 222 13.5 在地形中“行走” 222 13.6 例程:Terrain 226 13.7 一些改进 228 13.8 小结 229 第14章 粒子系统 230 14.1 粒子和点精灵 230 14.1.1 结构格式 230 14.1.2 点精灵的绘制状态 231 14.1.3 粒子及其属性 233 14.2 粒子系统的组成 234 14.2.1 绘制一个粒子系统 238 14.2.2 随机性 243 14.3 具体的粒子系统 243 14.3.1 例程:Snow System 244 14.3.2 例程:Firework 246 14.3.3 例程:Particle Gun 248 14.4 小结 250 第15章 拾取 251 15.1 屏幕到投影窗口的变换 253 15.2 拾取射线的计算 254 15.3 对射线进行变换 255 15.4 射线/物体相交判定 256 15.5 例程:Picking 258 15.6 小结 259 第Ⅳ部分 着色器和效果 第16章 高级着色语言(HLSL)入门 263 16.1 HLSL着色器程序的编制 264 16.1.1 全局变量 266 16.1.2 输入和输出结构 266 16.1.3 入口函数 267 16.2 HLSL着色器程序的编 268 16.2.1 常量表 268 16.2.2 HLSL着色器程序的编 272 16.3 变量类型 274 16.3.1 标量类型 274 16.3.2 向量类型 274 16.3.3 矩阵类型 275 16.3.4 数组 277 16.3.5 结构体 277 16.3.6 关键字typedef 277 16.3.7 变量的前缀 278 16.4 关键字、语句及类型转换 279 16.4.1 关键字 279 16.4.2 基本程序流程 279 16.4.3 类型转换 280 16.5 运算符 281 16.6 用户自定义函数 282 16.7 内置函数 284 16.8 小结 286 第17章 顶点着色器入门 287 17.1 顶点声明 288 17.1.1 顶点声明的描述 288 17.1.2 顶点声明的创建 291 17.1.3 顶点声明的启用 291 17.2 顶点数据的使用 291 17.3 使用顶点着色器的步骤 293 17.3.1 顶点着色器的编写与编 294 17.3.2 顶点着色器的创建 294 17.3.3 顶点着色器的设置 294 17.3.4 顶点着色器的销毁 295 17.4 例程:Diffuse Lighting 295 17.5 例程:Cartoon Rendering 302 17.5.1 卡通着色 303 17.5.2 卡通着色的顶点着色器代码 304 17.5.3 轮廓的勾勒 307 17.5.4 实现轮廓勾勒的顶点着色器代码 310 17.6 小结 312 第18章 像素着色器入门 313 18.1 多重纹理概述 313 18.1.1 启用多重纹理 315 18.1.2 多重纹理坐标 316 18.2 像素着色器的输入和输出 317 18.3 使用像素着色器的步骤 318 18.3.1 像素着色器的编写和编 318 18.3.2 像素着色器的创建 318 18.3.3 像素着色器的设置 319 18.3.4 像素着色器的销毁 319 18.4 HLSL采样器对象 319 18.5 例程:像素着色器中的多重纹理 321 18.6 小结 329 第19章 效果框架 331 19.1 手法与路径 331 19.2 更多HLSL的内置对象 333 19.2.1 纹理对象 333 19.2.2 采样器对象与采样器状态 333 19.2.3 顶点着色器对象和像素着色器对象 334 19.2.4 字符串 335 19.2.5 注释 335 19.3 效果文件中的设备状态 336 19.4 创建一种效果 337 19.5 常量的设置 338 19.6 使用一种效果 340 19.6.1 效果句柄的获取 341 19.6.2 效果的激活 341 19.6.3 效果的启用 341 19.6.4 当前绘制路径的设置 342 19.6.5 效果的终止 342 19.6.6 一个例子 342 19.7 例程:效果文件中的光照和纹理 343 19.8 例程:雾效 349 19.9 例程:卡通效果 352 19.10 EffectEdit 353 19.11 小结 354 附录 Windows编程入门 355 参考文献 372
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值