绘制流水线大致分为一下9个步骤:
- 局部坐标系:无需考虑位置,大小或相对场景中的其他物体的朝向。
- 世界坐标系:局部坐标系总的物体通过世界变换(workd transform)的运算变换到世界坐标系中,该变换通常包括平移(translation),旋转(rotation)以及比例(scaling)运算。世界变化用一个
矩阵来表示,并有Direct3D通过IDirect3DDevice9::SetTransform方法来加以应用,该方法的第一个参数表示变换的类型,若要进行世界变换,可设为D3DTS_WOLRD,第二个参数表示所采用的世界变换矩阵。例如将一个立方体的中心移到世界坐标系中的点(3,-4,9)。
D3DMATRIX cubeMatrix;
D3DMatirxTranlation(&cubeMatrix, 3, -4, 9);
Device->SetTransform(D3DTS_WORLD, &cubeMatrix)
drawCube() //draw the cube
- 观察坐标系:在世界空间中,几何体和摄像机都是相对世界坐标系定义的。为了简化运算我们将摄像机变换至世界坐标系的原点,并将其旋转,蛇摄像机的光轴与世界坐标系的z轴正方向一致。同时,世界空间中的所有物体随着摄像机一同进行变换,以保证摄像机的视场恒定。这种变换称为取景变换(view space transformation),我们称变换后的几何体位于观察坐标系(view space)中。取景变换矩阵可有如下D3DX函数计算得到:
D3DXMATRIX *D3DXMatrixLookAtLH(
D3DXMATRIX* pOut, //接收视觉矩阵后的结果
CONST D3DVECTOR3* pEye, //摄像机在世界坐标系中的位置
CONST D3DVECTOR3* pAt, //摄像机正在观察的世界坐标系中的点
CONST D3DVECTOR3* pUp //
);例:假设摄像机位于(5,3,-10),其观察点为世界坐标系的原点(0,0,0)。我们可以这样创建取景变换矩阵:
D3DVECTOR3 position(5.0f, 3.0f, -10.0f);
D3DVECTOR3 targetPiont(0.0f, 0.0f, 0.0f);
D3DVECTOR3 worldUp(0.0f, 1.0f, 0.0f);
D3DMATRIX V;
D3DMatirxTranlation(&V,& position,& targetPiont,& worldUp);
Deveice->SetTransform(D3DTS_VIEW,&V);
- 背面消隐:
- 光照
- 裁剪:1完全内部 2完全外部 3部分内部
- 投影:投影是通过投影矩阵来进行变化
D3DXMATRIX *D3DXMatrixPerspectiveFovlLH(
D3DXMATRIX &pOut,
FLOAT fovY,
FLOAT Aspect,
FLOAT zn,
FLOAT zf
);
横纵比Aspect = 屏幕宽度(screen width)/ 屏幕高度(screen height);
本例中视域体的域角为90度,近裁到原点的距离是1,远裁面到原点的距离是1000
D3DXMATRIX proj;
D3DXMatrixPerspectiveFovlLH(&proj, PI*0.5f, (float)width/(float)height,1.0f, 1000.0f);
Device->SetTransform(D3DTS_PROJECTION, &proj);
- 视口变换,视口用结构D3DVIEWPORT9来表示,定义如下:
Typedef struct D3DVIEWPORT9{
DWORD X,
DWORD Y,
DWORD Width,
DWORD Height,
DWORD MinZ,
DWORD MaxZ
} D3DVIEWPORT9
D3DVIEWPORT9 vp = {0,0,640,480,0,1};
Device->SetViewport(&vp);
9.光栅化
浙公网安备 33010602011771号