在本章节中,我们将学习如何实现复杂的角色动画,例如人类或者动画。角色动画更为复杂是因为当他们在移动时,其身体的部件也将会运动。假设一个人在奔跑——那么他身上的每一根骨骼都在运动。而创建这一类型的复杂动画,一般需要借助专业的模型与动画工具。假设我们已经拥有了角色模型与相对应的动画数据,本章节中我们将学习如何使用DX12让其成为“动画”。
Introduction To 3D Game Programming With Direct X
Direct X 12 – Ambient Occulusion – 环境光遮蔽
由于性能的限制,实时渲染的游戏一般不会将间接光纳入光照模型中(例如,由场景中其他物体反射的光线)。然而,我们在现实世界中看到的许多光都是间接的。在第八章中,我所介绍的环境光等式为:
颜色向量A(L)表示物体表面某一点所接受的所有间接光(环境光),m(d)表示表面的漫反射率。所以,环境光的光照模型只是让物体整体变量,而不至于在阴影中完全变黑变暗——也就是说,完全没有真实的物理计算。其原理基于,间接光在场景中不断散射与反弹,所以当物体接受到环境光时,光线的来自各个方向且强度相同。下图展示了,如果我们只使用环境光模型来绘制一个模型。
在本章节中,我们将学习一些常用的环境光遮蔽技术来改进我们的环境光光照模型。
Direct X 12 – Instancing And Frustum Culling 绘制实例与视锥体剔除
在本章节中,我们将学习instancing(绘制实例)与视锥体剔除。Instancing指的是在场景中多次绘制同一个物体。Instancing在性能上能够提供极大的提升,同时DX12对于instancing的支持也很详细。视锥体剔除指的是,通过一个简单的测试,不让位于视锥体之外的三角形被进一步处理。
Direct X 12 – First Person Camera And Dynamic Indexing 第一人称摄像机与动态索引
在本章节中,我们将学习两个知识点。首先,我们将设计一个camera系统,其表现形式与FPS游戏中的camera类似。在之后的demo中,我们将使用这个camera系统来代替之前的camear。之后,我们将学习一种新的DX12技术,其被称为动态索引(dynamic indexing,其在shader model 5.1中被引入)并且支持通过索引来读取一组贴图数据(Texture2D gDiffuseMap[n])。其类似于第12章中的贴图数组对象(Texture2DArray),但是不同于Texture2DArray,新的动态索引技术可以将不同尺寸不同格式的贴图存储在一个贴图数组中,很明显该技术的灵活性远高于Texture2DArray。
阅读更多Direct X 12 – First Person Camera And Dynamic Indexing 第一人称摄像机与动态索引
Direct X 12 – Tessellation Stage 镶嵌阶段
tessellation阶段指的是渲染管线中三个将几何体进行细分的阶段。简单来说,tessellation指的就是将几何体细分为更小的三角形并且以某种方式移动新生成的顶点。而增加三角形的数量就是为了增加网格模型的细节。但是,我们为什么不直接创建细节程度更高的网格模型呢?以下为我们使用tessellation的三个理由。
1. 在GPU端使用动态LOD(level of detail)。我们可以动态调整网格模型的细节程度,例如,基于模型到camera的距离或者其他因素等等。如果一个模型距离camera非常远,那么仍然以高精度的模型进行渲染显然是没有意义的。随着模型距离camera越来越近,我们可以不断增加模型的细节程度。
2. 物理以及动画的效率。在物理以及动画计算时,我们使用低精度的模型,之后再细分为高精度的模型。这将节省相关的运算能力。
3. 节省内存。我们可以将低精度的模型存储在内存中(硬盘,系统内存以及显存),之后通过GPU将其细分为高精度的模型。