DirectX入门之绘图实例

前言:了解windows应用开发过程和Direct3D初始化后。本文中,我将使用DirectX 快速开发框架进行绘图。

必备概念:

顶点(索引)缓存:缓存和平时用的数组基本上一样。我们用缓存来存取数据,是因为缓存可以放到显卡中去,这样一来,存取速度就比系统内存会很多倍。本文中通过两个demo,来说明顶点缓存和索引缓存

投影:投影是指n维图形变成n-1维的过程。

局部坐标系、世界坐标系
DirectX入门之绘图实例_第1张图片

相机

DirectX入门之绘图实例_第2张图片

实例一

DirectX入门之绘图实例_第3张图片
实例一流程图
DirectX入门之绘图实例_第4张图片

代码:

用的是框架,不变的部分就不在此贴出。

//放在头文件里比较好
//定义顶点数据结构
struct Vertex
{
    float x, y, z;
    Vertex(float a ,float b,float c) {
        x = a;
        y = b;
        z = c;
    }
};
#define FVF_Vertex (D3DFVF_XYZ)
bool Setup()
{

    //步骤一
    Device->CreateVertexBuffer(
        //设置顶点缓存可存3个顶点
        4 * sizeof(Vertex),
        //顶点缓存无附加属性
        0,
        //顶点格式
        D3DFVF_XYZ,

        D3DPOOL_MANAGED,
        //顶点缓存指针
        &vb,
        //索引缓存指针
        0
    );

    //访问顶点缓存中的数据
    Vertex *vertexs;
    //先加锁  

    vb->Lock(0, 0, (void**)&vertexs, 0);

    //像缓存区中存顶点数据
    vertexs[0] = Vertex(-1.0f, 0.0f, 2.0f);
    vertexs[1] = Vertex(0.0f, 1.0f, 2.0f);
    vertexs[2] = Vertex(1.0f, 0.0f, 2.0f);
    vertexs[3] = Vertex(0.0f, -1.0f, 2.0f);

    vb->Unlock();

    //步骤二
    D3DXMATRIX proj;

    //设置投影  n维变n-1维
    D3DXMatrixPerspectiveFovLH(
        &proj,
        D3DX_PI*0.5f,
        (float)1000 / (float)800,
        1.0f,
        1000.0f
    );
    Device->SetTransform(D3DTS_PROJECTION, &proj);


    //使用线框模式绘制物体
    //Device->SetRenderState(D3DRS_FILLMODE, D3DFILL_WIREFRAME);

    Device->SetFVF(D3DFVF_XYZ );

    //以上顶点缓存创建并设置完成。
    //将顶点缓存和数据流进行对接
    Device->SetStreamSource(0, vb, 0, sizeof(Vertex));

    Device->SetIndices(ib);




    //世界坐标系
    D3DXMATRIX worldmatrix;

    D3DXMatrixTranslation(&worldmatrix, 0.0f, 0.5f, 0.0f);
    Device->SetTransform(D3DTS_WORLD, &worldmatrix);

    /*
    //设置相机
    D3DXVECTOR3 postiton(0.0f, 0.0f, 0.0f);
    D3DXVECTOR3 target(0.0f, 0.0f, 0.0f);
    D3DXVECTOR3 up(0.0f, 0.5f, 0.0f);

    D3DXMATRIX V;
    D3DXMatrixLookAtLH(&V, &postiton, &target, &up);

    //设置观察相机
    Device->SetTransform(D3DTS_VIEW, &V);



    //视口装换
    D3DVIEWPORT9 vps = { 0,0,640,480,0,1 };
    Device->SetViewport(&vps);

    */
    return true;
}

//步骤三
bool Display(float timeDelta)
{
    if (Device) // Only use Device methods if we have a valid device.
    {

        Device->Clear(0, 0, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, 0xffffffff, 1.0f, 0);


        Device->BeginScene();

        //有三种图元(点,线,三角形 ) 供选择。这里选择三角形
        Device->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 2);

        //Device->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, 0, 0, 4, 0, 2);

        Device->EndScene();
        // Swap the back and front buffers.
        Device->Present(0, 0, 0, 0);
    }
    return true;
}

实例二

DirectX入门之绘图实例_第5张图片
实例二流程图
DirectX入门之绘图实例_第6张图片

代码:

用的是框架,不变的部分就不在此贴出。

//放在头文件里比较好
//定义顶点数据结构
struct Vertex
{
    float x, y, z;
    Vertex(float a ,float b,float c) {
        x = a;
        y = b;
        z = c;
    }
};
#define FVF_Vertex (D3DFVF_XYZ)
bool Setup()
{

    //步骤一:
    Device->CreateVertexBuffer(
        //设置顶点缓存可存4个顶点
        4 * sizeof(Vertex),
        //顶点缓存无附加属性
        0,
        //顶点格式
        D3DFVF_XYZ,
        D3DPOOL_MANAGED,
        //顶点缓存指针
        &vb,
        //索引缓存指针
        0
    );
    //步骤二
    Device->CreateIndexBuffer(
        36 * sizeof(WORD),
        D3DUSAGE_WRITEONLY,
        D3DFMT_INDEX16,
        D3DPOOL_MANAGED,
        &ib,
        0
    );

    //访问顶点缓存中的数据
    Vertex *vertexs;
    //先加锁  

    vb->Lock(0, 0, (void**)&vertexs, 0);

    //像缓存区中存顶点数据
    vertexs[0] = Vertex(-1.0f, 0.0f, 2.0f);
    vertexs[1] = Vertex(0.0f, 1.0f, 2.0f);
    vertexs[2] = Vertex(1.0f, 0.0f, 2.0f);
    vertexs[3] = Vertex(0.0f, -1.0f, 2.0f);

    vb->Unlock();

    //三角形列表
    WORD * index = 0;
    ib->Lock(0, 0, (void**)&index, 0);

    index[0] =  0 ;
    index[1] =  1 ;
    index[2] =  2 ;

    index[3] = 0 ;
    index[4] = 2 ;
    index[5] = 3 ;
    ib->Unlock();


    //步骤三
    D3DXMATRIX proj;

    //设置投影  n维变n-1维
    D3DXMatrixPerspectiveFovLH(
        &proj,
        D3DX_PI*0.5f,
        (float)1000 / (float)800,
        1.0f,
        1000.0f
    );
    Device->SetTransform(D3DTS_PROJECTION, &proj);


    //使用线框模式绘制物体
    //Device->SetRenderState(D3DRS_FILLMODE, D3DFILL_WIREFRAME);

    Device->SetFVF(D3DFVF_XYZ );

    //以上顶点缓存创建并设置完成。
    //将顶点缓存和数据流进行对接
    Device->SetStreamSource(0, vb, 0, sizeof(Vertex));

    Device->SetIndices(ib);




    //世界坐标系
    D3DXMATRIX worldmatrix;

    D3DXMatrixTranslation(&worldmatrix, 0.0f, 0.5f, 0.0f);
    Device->SetTransform(D3DTS_WORLD, &worldmatrix);

    /*
    //设置相机
    D3DXVECTOR3 postiton(0.0f, 0.0f, 0.0f);
    D3DXVECTOR3 target(0.0f, 0.0f, 0.0f);
    D3DXVECTOR3 up(0.0f, 0.5f, 0.0f);

    D3DXMATRIX V;
    D3DXMatrixLookAtLH(&V, &postiton, &target, &up);

    //设置观察相机
    Device->SetTransform(D3DTS_VIEW, &V);



    //视口装换
    D3DVIEWPORT9 vps = { 0,0,640,480,0,1 };
    Device->SetViewport(&vps);

    */
    return true;
}

void Cleanup()
{
    // Nothing to cleanup in this sample.
}


//步骤四
bool Display(float timeDelta)
{
    if (Device) // Only use Device methods if we have a valid device.
    {

        Device->Clear(0, 0, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, 0xffffffff, 1.0f, 0);


        Device->BeginScene();

        //有三种图元(点,线,三角形 ) 供选择。这里选择三角形
        Device->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, 0, 0, 4, 0, 2);

        Device->EndScene();
        // Swap the back and front buffers.
        Device->Present(0, 0, 0, 0);
    }
    return true;
}

小结:

单使用顶点缓存画图是不行的,如果你想画些复杂图形,比如正方体,你就得重复很多个顶点。所以最好将顶点缓存和索引缓存结合起来使用

参考书籍
《DirectX 9.0 3D游戏开发基础》

你可能感兴趣的:(DirectX快速入门)