为了制止wind7,在看完ogre教程后发觉还是应该去学习一下图形api,于是看了一个月的d3d11,今天刚好是11月第一天,做一个总结和记录。
d3d系列中最重要的两个东西,一个是设备,device,一个是上下文交互器 context,设备管创建,context管交互,d3d世界中的任何东西,交换链也好,视图也好,都是使用device的某个create函数建立,而建立好之后的工作交给context来做,context是d3d世界的管理者,渲染管线下的每个阶段都有对应的函数可以操作,比如在装配顶点的IA阶段,就使用IASetVertexBuffer与IASetIndexbuffer控制顶点的生成与索引。
D3D中对于顶点的输入有很多格式,你可以输入坐标,法线,纹理坐标,也可以仅仅输入坐标,控制GPU识别这些东西的方法是使用inputLayout,通过指定不同的inputLayout,可以使用不同的装配格式,指定inputLayout非常重要,这直接决定了在着色器中你的输入参数的类型,比如在顶点着色器中,我需要一个拥有pos,tex的类型
“`
struct VertexIn
{
float3 PosL : POSITION;
float2 Tex : TEXCOORD;
};
VertexOut VS(VertexIn)
{
// TODO
}
“`c
那么我必须在inputLayout中指定输入的布局是一个pos,一个tex,否则gpu就会给我的sharder输入我不期望的顶点数据。
还有,让顶点在界面上显示出来,需要将他的本地坐标 * 世界矩阵 * 视图矩阵 * 投影矩阵。视图矩阵和投影矩阵在api中都有一个很方便的实现XMMatrixLookAtLH和XMMatrixPerspectiveFovLH,而世界矩阵则是需要自己去指定的,每一个模型在,不管你是使用3dxmax制作,还是maya制作,导出的是obj还是fbx,里面的每一个顶点都是属于模型的本地坐标系,如果你将世界矩阵定义为单位矩阵,那么模型就会出现在我们的3d世界中心,如果你需要将他平移到别的地方,就要为世界矩阵添加平移的功能。