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

Direct3D初始化

Posted on 2011-02-20 22:57  +石头+  阅读(241)  评论(0)    收藏  举报

Direct初始化分为4个步骤:

  1. 获取接口IDirect3D的指针
  2. 校验硬件顶点运算
  3. D3DPRESENT_PARAMETER结构
  4. 创建IDirect3DDevice9接口

主流程代码如下:

//Step1: Create the IDirect3D9 object

    IDirect3D9* d3d9 = 0;

    d3d9 = Direct3DCreate9(D3D_SDK_VERSION);

    if(!d3d9)

    {

        ::MessageBox(NULL, "Direct3DCreate9() -- FAILED", 0, 0);

        return false;

    }

    //Step2: Check for hardware vp

    D3DCAPS9 caps;

    d3d9->GetDeviceCaps(D3DADAPTER_DEFAULT, deviceType, &caps);

    int vp = 0;

    if(caps.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT)

        vp = D3DCREATE_HARDWARE_VERTEXPROCESSING;

    else

        vp =D3DCREATE_SOFTWARE_VERTEXPROCESSING;

 

    //Step3: Fill D3DPRESENT_PARAMETERS structure

    D3DPRESENT_PARAMETERS d3dpp;

    d3dpp.BackBufferWidth             = width;

    d3dpp.BackBufferHeight             = height;

    d3dpp.BackBufferFormat             = D3DFMT_A8R8G8B8;

    d3dpp.BackBufferCount             = 1;

    d3dpp.MultiSampleType             = D3DMULTISAMPLE_NONE;    

    d3dpp.MultiSampleQuality         = 0;

    d3dpp.SwapEffect                 = D3DSWAPEFFECT_DISCARD;

    d3dpp.hDeviceWindow                 = hWnd;

    d3dpp.Windowed                     = windowed;

    d3dpp.EnableAutoDepthStencil     = true;

    d3dpp.AutoDepthStencilFormat     = D3DFMT_D24S8;

    d3dpp.Flags = 0;

    d3dpp.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT;

    d3dpp.PresentationInterval         = D3DPRESENT_INTERVAL_IMMEDIATE;

    

    //Step4: Create the Device

    hr = d3d9->CreateDevice(

        D3DADAPTER_DEFAULT,

        deviceType,

        hWnd,

        vp,

        &d3dpp,

        device);

    if(FAILED(hr))

    {

        d3dpp.AutoDepthStencilFormat = D3DFMT_D16;

 

        hr = d3d9->CreateDevice(D3DADAPTER_DEFAULT,

            deviceType,

            hWnd,

            vp,

            &d3dpp,

            device);

        if(FAILED(hr))

        {

            d3d9->Release();

            ::MessageBox(NULL, "CreateDevice() -- FAILE", 0, 0);

            return false;

        }

    }