(一)、前言

相比Introduction to Directx11,Introduction to Directx12由于页面的问题(目前已经是900余页),删除了Terrain Rendering、Particle System and StreamOut、Meshes、Displacement Mapping相关内容。因为Directx12底层架构的巨大变化,因此,很多章节都重新进行了编写,并不是对Introduction to Directx11的一个简单调整,作者还重写了整个代码框架。由于架构调整,程序员需要对几乎所有内存管理、GPU与CPU同步,资源转换等底层工作自行进行管理,因此学习Introduction to Directx12学习曲线还是比较陡峭的。
接下来的本系列就是对这本书的的编程类习题解答。我们的代码基于Win10 + VS2015编译通过,目标平台版本是10.0.10586.0,所有习题路径放于原Chapter目录下,我们力争将所有资源放于各习题目录下,但由于部分习题需要修改Common文件下内容,我们将Common文件夹打包附于本文后,之后章节将只附相关习题而不再打包Common文件夹。为顺利运行代码,请读者自行下载本书附带源码,地址附于本文后。
(二)、习题解答
1、Exercise2
本习题主要是让读者明白,Directx12支持对不同一结构数据从不同数据槽输入,本习题修改了COMMOM中的 BoxApp.cpp MeshGeometry,因其为特例,已将Common放于习题同目录。

2、Exercise2
本习题需要先定义好Vertex位置,其他就是修改PrimitiveTopology的问题,直接上答案。





3、Exercise4
本习题也主要是定义Vertex

4、Exercise6
本习题有误,公式应该如下:
vin.PosL.xy += 0.5f *sin(vin.PosL.x) *sin(3.0f*gTime)
vin.PosL.z += 0.6f * sin(2.0f*gTime)

5、Exercise7
本习题的中合并Vertex和Index不是太大问题,但分开放置两个物体是难点,解题思路是在DescriptorHeap中放置两个Descriptor指向不同的CBuffer,在DrawCall时切换不同的cbv,使之对应到不同的CBuffer。在本题中,尝试在Update中更新mObjectCB是不对的,因为CommandList的缘故,最后一次更新的结果会覆盖前一次的值,使之无法区分两个不同矩阵。这也是与Directx11不同的地方。

6、Exercise8、Exercise9、Exercise10
没什么难点,请直接看代码。
7、Exercise11
本习题说明,Layout与 Vertex Structure的顺序并不会影响数据的获取。
8、其他习题
Exercise12、Exercise13主要是体验一下Viewport、Scissor的作用。Exercise14、Exercise16体验一下使用时间达到动画的效果。Exercise15主要是体验一下Clip函数的作用。效果如下:





(三)、代码下载
1、Introduction to 3D Game Programming with Directx12 附带源码 Introduction to 3D Game Programming with Directx12 附带源码
2、Common文件夹 Common文件夹
3、本章习题源码 本章习题源码