2012年1月15日日曜日

IDirect3D9::CreateDevice

描画のためにIDirect3DDevice9オブジェクトを作ろうとすると,ウィンドウが必要になる.すると途端に面倒になる気がするのは何故だろう.面倒というよりも,自分はDirectXを弄りたいのだけれど,Win32 APIも弄らないといけないという部分が面倒なのかもしれない.とりあえず,生成するだけ生成してみた.

#include <sdkddkver.h>

#define WIN32_LEAN_AND_MEAN
#include <Windows.h>

#include <tchar.h>
#include <sstream>
typedef std::basic_ostringstream<TCHAR> tostringstream;

#include <d3d9.h>

#include <memory>

template <typename T>
struct release_deleter {
    typedef T * pointer;

    void operator()(T * p) const
    {
        p->Release();
    }
};
typedef std::unique_ptr<IDirect3D9, release_deleter<IDirect3D9> > d3d_ptr;

LRESULT CALLBACK WindowProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);

int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE, LPTSTR, int)
{
    static TCHAR CLASS_NAME[] = TEXT("hello");

    //=======================================================================
    // ウィンドウの作成
    //=======================================================================
    WNDCLASSEX wcx = { 0 };
    wcx.cbSize = sizeof wcx;
    wcx.hInstance = hInstance;
    wcx.lpfnWndProc = WindowProc;
    wcx.style = CS_HREDRAW | CS_VREDRAW;
    wcx.lpszClassName = CLASS_NAME;
    RegisterClassEx(&wcx);

    HWND hWnd = CreateWindow(
        CLASS_NAME,
        TEXT("hello"),
        WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT, CW_USEDEFAULT,
        CW_USEDEFAULT, CW_USEDEFAULT,
        NULL, 
        NULL,
        hInstance,
        NULL
    );
    if(!hWnd){
        return -1;
    }                                                     

    // IDirect3D9オブジェクトの生成
    d3d_ptr pD3D(Direct3DCreate9(D3D_SDK_VERSION));

    // エラーチェック
    if(pD3D == NULL){
        MessageBox(
            NULL,
            TEXT("IDirect3D9のオブジェクトを生成できませんでした."),
            TEXT("失敗"),
            MB_OK
        );
        return -1;
    }

    // IDirect3DDevice9オブジェクトの生成
    D3DPRESENT_PARAMETERS d3dpp = { 0 };
    d3dpp.Windowed = TRUE;
    d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
    d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;
    // d3dpp.hDeviceWindow = hWnd; // コメントアウトを外して,

    LPDIRECT3DDEVICE9 pD3DDevice = NULL;
    HRESULT result = pD3D->CreateDevice(
        D3DADAPTER_DEFAULT,
        D3DDEVTYPE_HAL,
        hWnd, // ここをNULLにする
        D3DCREATE_SOFTWARE_VERTEXPROCESSING,
        &d3dpp,
        &pD3DDevice
    );
    if(result != D3D_OK){
        MessageBox(
            NULL,
            TEXT("IDirect3DDevice9のオブジェクトを生成できませんでした."),
            TEXT("失敗"),
            MB_OK
        );
        return -1;
    }

    pD3DDevice->Release();
   
    return 0;
}

LRESULT CALLBACK WindowProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    switch(msg){
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hWnd, msg, wParam, lParam);
    }

    return 0;
}

D3DPRESENT_PARAMETERSで色々と設定できるみたいだけれど,これ必須の設定とそうでない設定がどれなのかがいまいち分からない.そういうのもドキュメントに書いていて欲しいなぁ,と思う今日この頃.

0 件のコメント:

コメントを投稿