//Direct3Dデバイスの初期化 bool Application::InitD3dDevice() { //ディスプレイアダプタを表すためのデバイスを作成 //描画と頂点処理をハードウェアで行なう if (FAILED(direct3d->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd, D3DCREATE_HARDWARE_VERTEXPROCESSING, &presentParam, &d3dDevice))) //上記の設定が失敗したら //描画をハードウェアで行い、頂点処理はCPUで行なう if (FAILED(direct3d->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &presentParam, &d3dDevice))) //上記の設定が失敗したら //描画と頂点処理をCPUで行なう if (FAILED(direct3d->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_REF, hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &presentParam, &d3dDevice))) return false; //レンダリングステータスの設定 d3dDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE); //両面描画モードの設定 d3dDevice->SetRenderState(D3DRS_ZENABLE, true); //Z比較を行う d3dDevice->SetRenderState(D3DRS_DITHERENABLE, true); //ディザリングを行う // ポイントスプライトの設定 d3dDevice->SetRenderState(D3DRS_POINTSPRITEENABLE, true); // ポイントスケールの係数 d3dDevice->SetRenderState(D3DRS_POINTSCALEENABLE, true); d3dDevice->SetRenderState(D3DRS_POINTSIZE, FloatToDWORD(1.0f)); d3dDevice->SetRenderState(D3DRS_POINTSIZE_MIN, FloatToDWORD(0.0f)); d3dDevice->SetRenderState(D3DRS_POINTSCALE_A, FloatToDWORD(0.0f)); d3dDevice->SetRenderState(D3DRS_POINTSCALE_B, FloatToDWORD(0.0f)); d3dDevice->SetRenderState(D3DRS_POINTSCALE_C, FloatToDWORD(1.0f)); return true; }
// コンストラクタ Render::Render(HWND hWnd, bool isFullScreen) { direct3d = Direct3DCreate9(D3D_SDK_VERSION); if (!direct3d) { return; } RECT rect = { 0 }; GetClientRect(hWnd, &rect); D3DPRESENT_PARAMETERS pp; ZeroMemory(&pp, sizeof(pp)); pp.hDeviceWindow = hWnd; pp.BackBufferCount = 1; pp.BackBufferWidth = rect.right; pp.BackBufferHeight = rect.bottom; pp.BackBufferFormat = D3DFMT_UNKNOWN; pp.Windowed = !isFullScreen; pp.MultiSampleType = D3DMULTISAMPLE_NONE; pp.MultiSampleQuality = 0; pp.SwapEffect = D3DSWAPEFFECT_DISCARD; pp.EnableAutoDepthStencil = true; pp.AutoDepthStencilFormat = D3DFMT_D16; pp.Flags = 0; pp.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT; pp.PresentationInterval = D3DPRESENT_INTERVAL_DEFAULT; if (FAILED(direct3d->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd, D3DCREATE_HARDWARE_VERTEXPROCESSING, &pp, &d3d))) { direct3d->Release(); return; } d3d->SetRenderState(D3DRS_SHADEMODE, D3DSHADE_GOURAUD); d3d->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE); d3d->SetRenderState(D3DRS_ZENABLE, true); d3d->SetRenderState(D3DRS_ZWRITEENABLE, true); d3d->SetRenderState(D3DRS_ZFUNC, D3DCMP_LESS); d3d->SetRenderState(D3DRS_LIGHTING, true); d3d->SetRenderState(D3DRS_SPECULARENABLE, true); d3d->SetRenderState(D3DRS_AMBIENT, 0x00666666); d3d->SetRenderState(D3DRS_ALPHABLENDENABLE, true); d3d->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA); d3d->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA); d3d->SetRenderState(D3DRS_ALPHATESTENABLE, true); d3d->SetRenderState(D3DRS_ALPHAREF, 0x00000000); d3d->SetRenderState(D3DRS_ALPHAFUNC, D3DCMP_GREATER); d3d->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE); d3d->SetTextureStageState(0, D3DTSS_COLORARG2, D3DTA_DIFFUSE); d3d->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE); d3d->SetTextureStageState(0, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE); d3d->SetRenderState(D3DRS_POINTSPRITEENABLE, true); d3d->SetRenderState(D3DRS_POINTSCALEENABLE, true); d3d->SetRenderState(D3DRS_POINTSIZE, FloatToDWORD(1.0f)); d3d->SetRenderState(D3DRS_POINTSIZE_MIN, FloatToDWORD(0.0f)); d3d->SetRenderState(D3DRS_POINTSCALE_A, FloatToDWORD(0.0f)); d3d->SetRenderState(D3DRS_POINTSCALE_B, FloatToDWORD(0.0f)); d3d->SetRenderState(D3DRS_POINTSCALE_C, FloatToDWORD(1.0f)); d3d->SetRenderState(D3DRS_FOGENABLE, true); d3d->SetRenderState(D3DRS_FOGCOLOR, 0x80000000); d3d->SetRenderState(D3DRS_FOGSTART, FloatToDWORD(6.0f)); d3d->SetRenderState(D3DRS_FOGEND, FloatToDWORD(48.0f)); d3d->SetRenderState(D3DRS_FOGVERTEXMODE, D3DFOG_LINEAR); D3DLIGHT9 light; ZeroMemory(&light, sizeof(D3DLIGHT9)); light.Type = D3DLIGHT_DIRECTIONAL; light.Direction = D3DXVECTOR3(1, -1, 1); light.Diffuse.r = 2.0f; light.Diffuse.g = 2.0f; light.Diffuse.b = 2.0f; d3d->SetLight(0, &light); d3d->LightEnable(0, true); light.Direction = D3DXVECTOR3(-1, 1, -1); light.Diffuse.r = 1.5f; light.Diffuse.g = 1.5f; light.Diffuse.b = 1.5f; d3d->SetLight(1, &light); d3d->LightEnable(1, true); d3d->SetRenderState(D3DRS_LIGHTING, true); }