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

对Directc初始化及渲染的封装

Posted on 2011-02-25 11:37  +石头+  阅读(306)  评论(0)    收藏  举报

#include "StdAfx.h"

#include "D3DUtil.h"

 

const int Width = 640;

const int Height = 480;

 

LPDIRECT3D9 g_pD3D;

LPDIRECT3DDEVICE9 g_pD3DDevice;

ID3DXMesh* g_teapot;

 

HRESULT InitD3D(HWND hWnd)

{

    //创建IDirect3D9接口,IDirect3D9主要功能是初始化等。。

    g_pD3D = Direct3DCreate9(D3D_SDK_VERSION);

    if(!g_pD3D)

    {

        MessageBox(NULL, "Direct3DCreate9 -- FAILE", NULL, NULL);

        return E_FAIL;

    }

    //检测硬件顶点运算

    D3DCAPS9 cap;

    if(FAILED(g_pD3D->GetDeviceCaps(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, &cap)))

    {

        MessageBox(NULL, "GetDeviceCaps -- FAILE", NULL, NULL);

        return E_FAIL;

    }

    DWORD vertexProcess = 0;

    if(cap.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT)

    {

        vertexProcess = D3DCREATE_HARDWARE_VERTEXPROCESSING;

    }

    else

        vertexProcess = D3DCREATE_SOFTWARE_VERTEXPROCESSING;

    //填充D3DPRESENT_PARAMETERS

    D3DDISPLAYMODE d3dmd;

    if(FAILED(g_pD3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &d3dmd)))

    {

        MessageBox(NULL, "GetAdapterDisplayMode FAILE", NULL, NULL);

        return E_FAIL;

    }

    D3DPRESENT_PARAMETERS d3dpp;

    ZeroMemory(&d3dpp, sizeof(d3dpp));

    d3dpp.Windowed = true;                        //Windowed为true时为窗口模式,为false时为全屏模式    

    d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;    //交换链中缓存的页面置换方式

    d3dpp.BackBufferFormat = d3dmd.Format;    //后台缓存的像素格式

    

    //创建IDirect3DDevice

    if(FAILED(g_pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd, vertexProcess, &d3dpp, &g_pD3DDevice)))

    {

        MessageBox(NULL, "CreateDevice FAILE", NULL, NULL);

        return E_FAIL;

    }

    g_pD3DDevice->SetRenderState(D3DRS_FILLMODE, D3DFILL_WIREFRAME);

    g_pD3DDevice->SetRenderState(D3DRS_AMBIENT, false);

    return S_OK;

 

}

 

VOID SetupMatrix()

{

    D3DXVECTOR3 position(0, -5.0, -5.0);

    D3DXVECTOR3 taget(0,0,0);

    D3DXVECTOR3 up(0,1,0);

    D3DXMATRIX matView;

    D3DXMatrixLookAtLH(&matView, &position, &taget, &up);

    g_pD3DDevice->SetTransform(D3DTS_VIEW, &matView);

 

    D3DXMATRIX proj;

    D3DXMatrixPerspectiveFovLH(&proj, D3DX_PI/4, (float)Width/(float)Height, 1.0f, 1000.0f);

    g_pD3DDevice->SetTransform(D3DTS_PROJECTION, &proj);

    

}

VOID Render(DWORD timeDelta)

{

    g_pD3DDevice->Clear(0, 0, D3DCLEAR_TARGET, D3DXCOLOR(1.0, 1.0, 1.0, 1.0), 1.0f, 0);

    g_pD3DDevice->BeginScene();

 

    //to do sth

    D3DXCreateTeapot(g_pD3DDevice, &g_teapot, NULL);

    g_teapot->DrawSubset(0);

 

    g_pD3DDevice->EndScene();

    g_pD3DDevice->Present(NULL, NULL, NULL, NULL);

}

VOID Cleanup()

{

    if(g_pD3D)

    {

        g_pD3D->Release();

        g_pD3D = NULL;

    }

    if(g_pD3DDevice)

    {

        g_pD3DDevice->Release();

        g_pD3DDevice = NULL;

    }

}