This repository was archived by the owner on Sep 3, 2026. It is now read-only.
forked from Nommy228/Might-and-Magic-Trilogy
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathDirectX11.cpp
More file actions
111 lines (92 loc) · 3.89 KB
/
Copy pathDirectX11.cpp
File metadata and controls
111 lines (92 loc) · 3.89 KB
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
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
/*#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>
#define _CRT_SECURE_NO_WARNINGS
#define WIN32_LEAN_AND_MEAN
#include "DirectX11.h"
#include "RenderStruct.h"
HRESULT D3D11::InitDevice()
{
HRESULT hr = S_OK;
RECT rc;
GetClientRect( g_hWnd, &rc );
UINT width = rc.right - rc.left; // ïîëó÷àåì øèðèíó
UINT height = rc.bottom - rc.top; // è âûñîòó îêíà
UINT createDeviceFlags = 0;
D3D_DRIVER_TYPE driverTypes[] =
{
D3D_DRIVER_TYPE_HARDWARE,
D3D_DRIVER_TYPE_WARP,
D3D_DRIVER_TYPE_REFERENCE,
};
UINT numDriverTypes = ARRAYSIZE( driverTypes );
// Òóò ìû ñîçäàåì ñïèñîê ïîääåðæèâàåìûõ âåðñèé DirectX
D3D_FEATURE_LEVEL featureLevels[] =
{
D3D_FEATURE_LEVEL_11_0,
D3D_FEATURE_LEVEL_10_1,
D3D_FEATURE_LEVEL_10_0,
};
UINT numFeatureLevels = ARRAYSIZE( featureLevels );
// Ñåé÷àñ ìû ñîçäàäèì óñòðîéñòâà DirectX. Äëÿ íà÷àëà çàïîëíèì ñòðóêòóðó,
// êîòîðàÿ îïèñûâàåò ñâîéñòâà ïåðåäíåãî áóôåðà è ïðèâÿçûâàåò åãî ê íàøåìó îêíó.
DXGI_SWAP_CHAIN_DESC sd; // Ñòðóêòóðà, îïèñûâàþùàÿ öåïü ñâÿçè (Swap Chain)
ZeroMemory( &sd, sizeof( sd ) ); // î÷èùàåì åå
sd.BufferCount = 1; // ó íàñ îäèí çàäíèé áóôåð
sd.BufferDesc.Width = width; // øèðèíà áóôåðà
sd.BufferDesc.Height = height; // âûñîòà áóôåðà
sd.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; // ôîðìàò ïèêñåëÿ â áóôåðå
sd.BufferDesc.RefreshRate.Numerator = 75; // ÷àñòîòà îáíîâëåíèÿ ýêðàíà
sd.BufferDesc.RefreshRate.Denominator = 1;
sd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT; // íàçíà÷åíèå áóôåðà - çàäíèé áóôåð
sd.OutputWindow = g_hWnd; // ïðèâÿçûâàåì ê íàøåìó îêíó
sd.SampleDesc.Count = 1;
sd.SampleDesc.Quality = 0;
sd.Windowed = TRUE; // íå ïîëíîýêðàííûé ðåæèì
for( UINT driverTypeIndex = 0; driverTypeIndex < numDriverTypes; driverTypeIndex++ )
{
g_driverType = driverTypes[driverTypeIndex];
hr = D3D11CreateDeviceAndSwapChain ( NULL, g_driverType, NULL, createDeviceFlags, featureLevels, numFeatureLevels, D3D11_SDK_VERSION, &sd, &g_pSwapChain, &g_pd3dDevice, &g_featureLevel, &g_pImmediateContext );
if (SUCCEEDED(hr)) // Åñëè óñòðîéñòâà ñîçäàíû óñïåøíî, òî âûõîäèì èç öèêëà
break;
}
if (FAILED(hr)) return hr;
// Òåïåðü ñîçäàåì çàäíèé áóôåð. Îáðàòèòå âíèìàíèå, â SDK
// RenderTargetOutput - ýòî ïåðåäíèé áóôåð, à RenderTargetView - çàäíèé.
pBackBuffer = NULL;
hr = g_pSwapChain->GetBuffer( 0, __uuidof(ID3D11Texture2D), (LPVOID*)&pBackBuffer );
if (FAILED(hr)) return hr;
// èíòåðôåéñ g_pd3dDevice áóäåò èñïîëüçîâàòüñÿ äëÿ ñîçäàíèÿ îñòàëüíûõ îáúåêòîâ
hr = g_pd3dDevice->CreateRenderTargetView( pBackBuffer, NULL, &g_pRenderTargetView );
pBackBuffer->Release();
if (FAILED(hr)) return hr;
// Ïîäêëþ÷àåì îáúåêò çàäíåãî áóôåðà ê êîíòåêñòó óñòðîéñòâà
g_pImmediateContext->OMSetRenderTargets( 1, &g_pRenderTargetView, NULL );
// Íàñòðîéêà âüþïîðòà
D3D11_VIEWPORT vp;
vp.Width = (FLOAT)width;
vp.Height = (FLOAT)height;
vp.MinDepth = 0.0f;
vp.MaxDepth = 1.0f;
vp.TopLeftX = 0;
vp.TopLeftY = 0;
// Ïîäêëþ÷àåì âüþïîðò ê êîíòåêñòó óñòðîéñòâà
g_pImmediateContext->RSSetViewports (1, &vp);
return S_OK;
}
//--------------------------------------------------------------------------------------
// Óäàëèòü âñå ñîçäàííûå îáúåêòû
//--------------------------------------------------------------------------------------
void D3D11::CleanupDevice()
{
// Ñíà÷àëà îòêëþ÷èì êîíòåêñò óñòðîéñòâà, ïîòîì îòïóñòèì îáúåêòû.
if( g_pImmediateContext ) g_pImmediateContext->ClearState();
// óäàëåÿì îáúåêòû â ïîðÿäêå, îáðàòíîì òîìó, â êîòîðîì ñîçäàâàëè.
if( g_pRenderTargetView ) g_pRenderTargetView->Release();
if( g_pSwapChain ) g_pSwapChain->Release();
if( g_pImmediateContext ) g_pImmediateContext->Release();
if( g_pd3dDevice ) g_pd3dDevice->Release();
}
void Render()
{
}*/