Direct X 12 – Character Animation 角色动画

在本章节中,我们将学习如何实现复杂的角色动画,例如人类或者动画。角色动画更为复杂是因为当他们在移动时,其身体的部件也将会运动。假设一个人在奔跑——那么他身上的每一根骨骼都在运动。而创建这一类型的复杂动画,一般需要借助专业的模型与动画工具。假设我们已经拥有了角色模型与相对应的动画数据,本章节中我们将学习如何使用DX12让其成为“动画”。

阅读更多Direct X 12 – Character Animation 角色动画

Direct X 12 – Ambient Occulusion – 环境光遮蔽

由于性能的限制,实时渲染的游戏一般不会将间接光纳入光照模型中(例如,由场景中其他物体反射的光线)。然而,我们在现实世界中看到的许多光都是间接的。在第八章中,我所介绍的环境光等式为:

颜色向量A(L)表示物体表面某一点所接受的所有间接光(环境光),m(d)表示表面的漫反射率。所以,环境光的光照模型只是让物体整体变量,而不至于在阴影中完全变黑变暗——也就是说,完全没有真实的物理计算。其原理基于,间接光在场景中不断散射与反弹,所以当物体接受到环境光时,光线的来自各个方向且强度相同。下图展示了,如果我们只使用环境光模型来绘制一个模型。

在本章节中,我们将学习一些常用的环境光遮蔽技术来改进我们的环境光光照模型。

阅读更多Direct X 12 – Ambient Occulusion – 环境光遮蔽

Direct X 12 – Shadow Mapping 阴影映射

游戏中的阴影将告诉玩家光源的位置并且基于阴影玩家能更好地判断物体在场景中所处的位置。本章节将会告诉大家基本的阴影映射算法,其被广泛应用于模拟场景中的动态阴影。而本书主要作为DX12的参考书,所以作者只介绍了一些基础的阴影算法;如果各位老铁想要了解更为高级的算法,可以去美亚上买一些其他主讲渲染的书籍。

阅读更多Direct X 12 – Shadow Mapping 阴影映射

DirectX 12 – Normal Mapping 法线映射

第九章中,我们介绍了贴图映射,通过该技术,我们可以将图像中的细节映射到网格模型的三角形上。然而,我们的法线向量仍存储在顶点中,之后被插值到三角形的各个像素。在本章节中,我们将学习如何以更高的分辨率来设置物体表面的法线向量。这也意味着物体将拥有更为精细的光影效果,却不需要增加顶点或者三角形数量。

阅读更多DirectX 12 – Normal Mapping 法线映射

Direct X 12 – Picking

在本章节中,我们需要解决的问题是,如何找出用户使用鼠标点击的物体(如下图所示)。换句话说,基于鼠标在2D屏幕坐标系中的坐标,我们是否能找到投影到该像素点的物体呢?为了解决这个问题,我们必须逆向思维;也就是说,我们要将一个屏幕空间中点转换至3D空间。而摆在我们面前的一个小问题是:一个2D屏幕中的点并不能对应一个唯一的3D空间中的点(例如,3D空间中有许多点可以投影至屏幕中同一个点)。因此,用户所点击的点是有歧义性的。但是,一般来说距离camera最近的一个物体就是我们想要的。

阅读更多Direct X 12 – Picking

Direct X 12 – Instancing And Frustum Culling 绘制实例与视锥体剔除

在本章节中,我们将学习instancing(绘制实例)与视锥体剔除。Instancing指的是在场景中多次绘制同一个物体。Instancing在性能上能够提供极大的提升,同时DX12对于instancing的支持也很详细。视锥体剔除指的是,通过一个简单的测试,不让位于视锥体之外的三角形被进一步处理。

阅读更多Direct X 12 – Instancing And Frustum Culling 绘制实例与视锥体剔除

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将其细分为高精度的模型。

阅读更多Direct X 12 – Tessellation Stage 镶嵌阶段

Direct X 12 – Compute Shader

GPU被优化为从单一内存地址或者连续的内存地址来处理大量的内存(其也被称为streaming operation);这正好与CPU相反,CPU被设计为读取随机的内存空间Introduction to Direct Compute。此外,由于顶点和像素能被独立处理,GPU大多为平行架构;例如,NVIDIA的“Fermi”架构支持拥有512个CUDA核心,且32个CUDA核心包含16个多处理器。

阅读更多Direct X 12 – Compute Shader