DirectX基础学习系列2

时间:2021-05-23 21:54:18

补充第一章矩阵内容

向量

1 3D空间向量,包含浮点数类型坐标

D3DXVECTOR-->D3DXVECTOR3

2向量的长度

D3DXVector3Length(const D3DXVECTOR3* );

3向量规范化

D3DXVectorNormalize(D3DXVECTOR3*  , CONST D3DXVECTOR3* )

4 向量点乘

FLOAT D3DXVector3Dot( CONST D3DXVECTOR3*, CONST D3DXVECTOR3* );
5.向量叉乘

D3DXVector3Cross(D3DXVECTOR3*, CONST D3DXVECTOR3*, CONST D3DXVECTOR3* );

矩阵

D3DMATRIX-->D3DXMATRIX

typedef struct D3DXMATRIX

{

FLOAT _11, FLOAT _12, FLOAT _13, FLOAT _14,

FLOAT _21, FLOAT _22, FLOAT _23, FLOAT _24,

FLOAT _31, FLOAT _32, FLOAT _33, FLOAT _34,

FLOAT _41, FLOAT _42, FLOAT _43, FLOAT _44 );

} D3DXMATRIX;

D3DXMATRIX * D3DXMatrixIdentity(__inout  D3DXMATRIX *pOut); 单位矩阵
D3DXMATRIX * D3DXMatrixInverse();矩阵求逆
D3DXMATRIX * D3DXMatrixTranspose();矩阵转置
用于世界变换
D3DXMatrixTranslation:平移矩阵。例如:D3DXMatrixTranslation(x, y, z)将物体平移到(x, y, z)
D3DXMatrixRotationX:绕x轴旋转。类似的有绕Y和Z轴的旋转函数。例如:D3DXMatrixRotationX(&matrix,fAngle)。其中fAngle是旋转弧度
D3DXMatrixRotationAxis:绕任意轴旋转
D3DXMatrixRotationQuaternion:绕四元组旋转。
D3DXMatrixScaling:对物体进行缩放操作

2.1 模型表示

2.1.1 顶点格式

1Vertex  顶点包含空间信息,也包含其他附加属性,如位置、颜色、纹理等

2顶点的格式可以*定制:Flexiable vertex Format (FVF)

struct ColorVertex

{

float x,y,z;

DWORD color ;

}

对应的FVF标志:#define FVF_COLOR (D3DFVF_XYZ | D3DFVF_DIFFUSE),需要注意的是灵活定点格式标记的顺序和

顶点结构中定义的顺序保持一致。

2.1.2 三角形单元

三维中物体都有三角面片构成,由顶点构成,顶点的顺序很重要,即饶序(winding order)

2.1.3 定点列表和索引列表的概念

2.2 虚拟摄像机

2.3 绘制流水线 rendering pipeline

局部坐标系-->世界坐标系-->观察坐标系--> 背面消隐-->光照-->剪裁-->投影-->视口坐标系-->光栅化

2.3.1局部坐标系 ,建模坐标系,

2.3.2世界坐标系,通过世界变换将局部坐标系转换到世界坐标系,包括平移,旋转以及缩放

D3D通过IDirect3DDevice9::SetTransform()进行坐标转换

Deveice->SetTranform(D3DTS_WORLD,D3DDXMATRIX*)

2.3.3观察者坐标系

取景变换 :世界坐标系中的所有几何体随着摄像机一起变换,摄像机原点与世界坐标系原点重合,摄像机的坐标与世界坐标系的Z轴重合
    取景变换矩阵,观察矩阵

 D3DXMATRIX * D3DXMatrixLookAtLH(
__inout D3DXMATRIX *pOut,
__in const D3DXVECTOR3 *pEye, //摄像机所在位置
__in const D3DXVECTOR3 *pAt, //摄像机观察的点
__in const D3DXVECTOR3 *pUp //世界坐标系的方向,一般采用(0,1,0)
);
Device->SetTransform(D3DTS_VIEW, &V);   //取景变换
2.3.4 背面消隐
和绕序winding order相关,顶点排列为顺时针的为正面,逆时针的为背面
HRESULT SetRenderState(
[in] D3DRENDERSTATETYPE State,
[in] DWORD Value
);
state 等于D3DRS_CULLMODE为背面消隐状态
value可以为:D3DCULL_NONE ,D3DCULL_CW , D3DCULL_CCW
2.3.5 光照
2.3.6 剪裁
2.3.7 投影(透视投影)
透视投影定义了视域体,并将视域体中的几何体投影到投影窗口中,获得投影矩阵的函数:
D3DXMATRIX * D3DXMatrixPerspectiveFovLH(
D3DXMATRIX * pOut,
FLOAT fovy,
FLOAT Aspect,
FLOAT zn,
FLOAT zf
);
获得的投影方程如下:
xScale     0          0               0
0 yScale 0 0
0 0 zf/(zf-zn) 1
0 0 -zn*zf/(zf-zn) 0
where:
yScale = cot(fovY/2) xScale = aspect ratio / yScale
投影变换:Device->SetTransform(D3DTS_PROJECTION, &V); 
2.3.8 视口变换
视口(显示窗口)的表达:
typedef struct D3DVIEWPORT9 {
DWORD X;
DWORD Y;
DWORD Width;
DWORD Height;
float MinZ;
float MaxZ;
} D3DVIEWPORT9
设置显示窗口:
D3DViewPort vp  = {0,0,640,480,0,1};
SetViewport(&vp);
2.3.9 光栅化
 
上面算是绘制流水线过程吧 ,和directdraw差异还是挺大的