编程
项目配置:
C/C++ – 代码生成
头文件:
<windows.h> : 为了使用XMVerifyCPUSupport函数检查CPU是否支持SEE2指令集
<DirectXMath.h> : 3D数学库
<DirectXPackedVector.h> : 引入一些相关数据类型
<wrl.h> : 引入Microsoft::WRL::ComPtr(坑爹官方文档写的client.h)
命名空间:
DirectX ---------对应<DirectXMath.h>
DirectX::PackedVector ----------对应<DirectXPackedVector.h>
链接:
#pragma comment(lib,“d3dcompiler.lib”)
#pragma comment(lib, “D3D12.lib”)
#pragma comment(lib, “dxgi.lib”)
变换
- 所有旋转矩阵都是规范正交矩阵
- M为正交矩阵,则必有MT = M-1
- 要获得从标架(frame)A到标架B的坐标变换矩阵,需要获取的情报有:标架A的原点在标架B的坐标QB,标架A的基向量在标架B中的表示(uB,vB,wB)
pA = (x, y, z, w)
pB = xuB + yvB + zwB + wQB
(上述公式点和向量皆适用)
- 对于点p,有 p = a1p1 + …+anpn(a1+…+an = 1)
则称(a1,…,an)为p的重心坐标(barycentric oordinate)
- 使用矩阵A对一个标架的基向量进行变换,此时A的行列式的值反应的是标架中体积(或2D下的面积)的变化。
注意到旋转矩阵的行列式的值都为1,便是因为旋转矩阵对体积(面积)没有影响
- 对于矩阵A,B
|AB| = |A|*|B|
- 空间中有向量a,b,现要使a与b平行
1.叉乘获得旋转轴(要规范化)
2.点乘获取角度
3.计算获得通用旋转矩阵
宏
IID_PPV_ARGS(ppType) : 本质是把ppType强转成 void** 类型,D3D12的创建接口实例的API大多都有一个参数类型为void**的待创接口
一定
在调用ID3D12CommandQueue::ExecuteCommandLists方法提交命令列表前
一定要调用ID3D12GraphicsCommandList::Close来结束命令的记录
命令队列可能会引用命令分配器中的数据,因此在没有确定GPU执行完命令分配器中的所有命令之前,一定不要使用 ID3D12CommandAllocator::Reset(void) 重置命令分配器
枚举类型
D3D12_COMMAND_LIST_TYPE
D3D12_COMMAND_LIST_TYPE_DIRECT
接受可以供GPU直接执行的命令
D3D12_COMMAND_LIST_TYPE_BUNDLE
将命令列表打包,减少CPU建立命令列表的开销,驱动会对其进行预处理,使其在渲染期间的执行过程得到优化。
but, 因为Direct3D 12的绘制API效率很高,所以一般不会用到打包技术
D3D12_COMMAND_LIST_TYPE_COMPUTE
仅接受与通用计算有关的命令
D3D12_COMMAND_LIST_TYPE_COPY
仅接受与复制操作有关的命令
类型转化
string to LPCSTR
用c_str()把string 转成const char*就行