博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

绘制流水线

Posted on 2011-02-21 16:51  +石头+  阅读(340)  评论(0)    收藏  举报

绘制流水线大致分为一下9个步骤:

  1. 局部坐标系:无需考虑位置,大小或相对场景中的其他物体的朝向。
  2. 世界坐标系:局部坐标系总的物体通过世界变换(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

  1. 观察坐标系:在世界空间中,几何体和摄像机都是相对世界坐标系定义的。为了简化运算我们将摄像机变换至世界坐标系的原点,并将其旋转,蛇摄像机的光轴与世界坐标系的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);

  2. 背面消隐:
  3. 光照
  4. 裁剪:1完全内部    2完全外部 3部分内部
  5. 投影:投影是通过投影矩阵来进行变化

    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);

  1. 视口变换,视口用结构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.光栅化