本系列笔记主要写DirectX 12的概念和API,和图形学相关的内容(包括数学、光照等)大多会略过,大家想学习可以自己看原书~
第一节:介绍了下向量与坐标系。
第二节至第四节:向量的长度,单位向量,点积和叉积。
第五节:点在坐标系下的描述。
第六节:
DirectX有自己的3D数学库DirectXMath,利用SSE2指令集,可以用128位的SIMD寄存器计算4个32位float或int类型的数据。
如果是32位平台,要使用这个库,还需要在 配置属性 > C/C++ > 代码生成 > 启用增强指令集 中选择开启SSE2。并且在 配置属性 > C/C++ > 代码生成 > 浮点模型中启用快速模式。而所有64位的CPU是支持SSE2的。
typedef __m128 XMVECTOR;
XMVECTOR就是DirectX Math的主要向量类型。__m128 是SIMD的特殊类型,会被自动分配为16个字节的字长,映射到SIMD硬件寄存器上,进行SIMD操作。
具体介绍了以下几点:
1.n维向量(只有2-4)可以用XMFLOATn类型,但直接用这些类型计算无法利用SIMD,所以需要Loading和Storage函数对数据进行和XMVECTOR类型转换。一般类的成员变量声明为这几种类型。
2.为了提高效率,可以将XMVECTOR值作为参数传递给SSE/SSE2寄存器中的函数,而不是传递给堆栈。通过这种方式传递参数的数量取决于平台和编辑器,因此再封装一层,对于不同数量的参数,即不同的寄存器用不同的类型传递XMVECTOR参数。
- 前三个参数用FXMVECTOR
- 第四个用GXMVECTOR
- 第五和六用HXMVECTOR
- 额外的都用CXMVECTOR
3.如果是常量,用XMVECTORF32和XMVECTORU32替代XMVECTOR。
4.DirectX Math也自带一些常用的数学常量,如PI,并且定义了一些常用数学函数,如角度和弧度的相互转换,最大最小值。
5.介绍setter函数和向量函数,其中为了有效的保证使用SIMD计算,如向量的点积会返回XMVECTOR类型。
6.提供了一些高效的求近似值的函数。
7.注意浮点数误差。