1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81
|
bool D3D9RenderSystem::SetupRenderSystem(HWND Hwnd)
{
HRESULT hr = 0;
// Etape 1 : Création de l'objet IDirect3D9
mD3D9Object = Direct3DCreate9(D3D_SDK_VERSION);
if(mD3D9Object == NULL)
{
::MessageBox(Hwnd, "Direct3DCreate9 - Failed", "FAILED", MB_OK);
return false;
}
// Etape 2: Teste si la carte graphique supporte vertex processing
D3DCAPS9 caps;
// [para] D3DADAPTER_DEFAULT : physical display adapter
// [para] D3DDEVTYPE_HAL : type du device (D3DDEVTYPE_HAL -> hardware (cg) / D3DDEVTYPE_REF -> software (proc))
// [para] caps : structure D3DCAPS9
mD3D9Object->GetDeviceCaps(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, &caps);
int vp = 0;
if( caps.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT )
vp = D3DCREATE_HARDWARE_VERTEXPROCESSING;
else
vp = D3DCREATE_SOFTWARE_VERTEXPROCESSING;
// Etape 3 : On récupère de la taille de la fenêtre
RECT Rect;
GetClientRect(Hwnd, &Rect);
// Etape 4: On renseigne la structure D3DPRESENT_PARAMETERS qui permet d'initialiser les paramètres du device
D3DPRESENT_PARAMETERS d3dpp;
d3dpp.BackBufferWidth = Rect.right - Rect.left; // Largeur du back buffe en pixel
d3dpp.BackBufferHeight = Rect.bottom - Rect.top; // Hauter du back buffer en pixel
d3dpp.BackBufferFormat = D3DFMT_A8R8G8B8; // Format de pixel du back buffer
d3dpp.BackBufferCount = 1; // Nombre de back buffer
d3dpp.MultiSampleType = D3DMULTISAMPLE_NONE; // Type de l'échantillon
d3dpp.MultiSampleQuality = 0; // Qualité de l'échantillon
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; // Mode d'échange avec le back buffer
d3dpp.hDeviceWindow = Hwnd; // Handle de la fenêtre associé avec le device (_d3d9)
d3dpp.Windowed = true; // Fenêtré ou plein écran ?
d3dpp.EnableAutoDepthStencil = true; // Activation du stencil buffer et du depth buffer
d3dpp.AutoDepthStencilFormat = D3DFMT_D24S8; // Format du depth/stencil buffer
d3dpp.Flags = 0; // Flag additionnels concerant les buffers
d3dpp.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT; // Taux de rafraichissement
d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE; //
// Etape 5: Création du device.
hr = mD3D9Object->CreateDevice(
D3DADAPTER_DEFAULT, // Physical display adapter
D3DDEVTYPE_HAL, // Type du device
Hwnd, // Fenêtre associé au device
vp, // vertex processing
&d3dpp, // Present parameters structure
&mDevice); // Retourne le device crée
if(FAILED(hr))
{
// On réessaie en réglant le buffer de profondeur sur 16 bits
d3dpp.AutoDepthStencilFormat = D3DFMT_D16;
hr = mD3D9Object->CreateDevice(
D3DADAPTER_DEFAULT,
D3DDEVTYPE_HAL,
Hwnd,
vp,
&d3dpp,
&mDevice);
// Si la création échoue une nouvelle fois on supprime le device et l'application stoppe
if(FAILED(hr))
{
mD3D9Object->Release();
::MessageBox(0, L"CreateDevice() - FAILED", L"Failed", MB_OK);
return false;
}
}
return true;
} |
Partager