Advertisement
vovan333

Untitled

Jan 6th, 2017
169
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.19 KB | None | 0 0
  1. #pragma warning (disable:4996)
  2. #pragma comment (lib, "d3d11.lib")
  3. #pragma comment (lib, "d3dx11.lib")
  4. #pragma comment (lib, "d3dx10.lib")
  5.  
  6. #include <Windows.h>
  7. #include <D3D11.h>
  8. #include <D3DX11.h>
  9. #include <D3DX10.h>
  10. #include <gdiplus.h>
  11. #include <string>
  12.  
  13. using namespace Gdiplus;
  14. using namespace std;
  15.  
  16. namespace D3DProject1
  17. {
  18. UINT windowStyle = WS_OVERLAPPEDWINDOW;
  19. HWND hMainWindow;
  20. HINSTANCE hCurrentInstance;
  21. IDXGISwapChain* swapchain;
  22. ID3D11RenderTargetView* backbuffer;
  23. ID3D11Device* dev;
  24. ID3D11DeviceContext* devcon;
  25. ID3D10Blob* vsBlob;
  26. ID3D10Blob* psBlob;
  27. ID3D11VertexShader* vs;
  28. ID3D11PixelShader* ps;
  29. ID3D11Buffer* vertexBuffer;
  30. ID3D11InputLayout *vertexBufferLayout;
  31. int viewportWidth = 800;
  32. int viewportHeight = 600;
  33. wstring shadersFile = L"Shaders.shader";
  34.  
  35. wchar_t* W(wstring str)
  36. {
  37. wchar_t* result = new wchar_t[str.size()];
  38. wcscpy(result, str.c_str());
  39. return result;
  40. }
  41.  
  42. char* S(string str)
  43. {
  44. char* result = new char[str.size()];
  45. strcpy(result, str.c_str());
  46. return result;
  47. }
  48.  
  49. struct Vertex
  50. {
  51. float X, Y, Z;
  52. D3DXCOLOR Color;
  53. };
  54.  
  55. D3D11_INPUT_ELEMENT_DESC VertexIED[] =
  56. {
  57. { "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0 },
  58. { "COLOR", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, 12, D3D11_INPUT_PER_VERTEX_DATA, 0 }
  59. };
  60.  
  61. void CreateWC(wstring name, WNDPROC OnMessage)
  62. {
  63. WNDCLASSEX wc;
  64. ZeroMemory(&wc, sizeof(wc));
  65.  
  66. wc.cbSize = sizeof(WNDCLASSEX);
  67. wc.style = CS_HREDRAW | CS_VREDRAW;
  68. wc.lpfnWndProc = OnMessage;
  69. wc.hInstance = hCurrentInstance;
  70. wc.hCursor = LoadCursor(NULL, IDC_ARROW);
  71. wc.hbrBackground = (HBRUSH)COLOR_WINDOW;
  72. wc.lpszClassName = W(name);
  73.  
  74. RegisterClassEx(&wc);
  75. }
  76.  
  77. Size AdjustWndSzToViewportSz(int viewportWidth, int viewportHeight, UINT wndStyle = windowStyle)
  78. {
  79. RECT wr = { 0, 0, viewportWidth, viewportHeight };
  80. AdjustWindowRect(&wr, wndStyle, FALSE);
  81. return Size(wr.right - wr.left, wr.bottom - wr.top);
  82. }
  83.  
  84. DXGI_SWAP_CHAIN_DESC CreateSCD(HWND hWnd, int width, int height)
  85. {
  86. DXGI_SWAP_CHAIN_DESC scd;
  87. ZeroMemory(&scd, sizeof(DXGI_SWAP_CHAIN_DESC));
  88.  
  89. scd.BufferCount = 1;
  90. scd.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
  91. scd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
  92. scd.BufferDesc.Width = width;
  93. scd.BufferDesc.Height = height;
  94. scd.OutputWindow = hWnd;
  95. scd.SampleDesc.Count = 4;
  96. scd.Windowed = TRUE;
  97. scd.Flags = DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH;
  98.  
  99. return scd;
  100. }
  101.  
  102. void InitD3DDeviceAndSwapChain(DXGI_SWAP_CHAIN_DESC& scd, IDXGISwapChain*& sc, ID3D11Device*& dev, ID3D11DeviceContext*& devCon)
  103. {
  104. D3D11CreateDeviceAndSwapChain
  105. (
  106. NULL,
  107. D3D_DRIVER_TYPE_HARDWARE,
  108. NULL,
  109. NULL,
  110. NULL,
  111. NULL,
  112. D3D11_SDK_VERSION,
  113. &scd,
  114. &swapchain,
  115. &dev,
  116. NULL,
  117. &devcon
  118. );
  119. }
  120.  
  121. D3D11_VIEWPORT CreateViewport(int width, int height)
  122. {
  123. D3D11_VIEWPORT viewport;
  124. ZeroMemory(&viewport, sizeof(D3D11_VIEWPORT));
  125.  
  126. viewport.TopLeftX = 0;
  127. viewport.TopLeftY = 0;
  128. viewport.Width = width;
  129. viewport.Height = height;
  130.  
  131. return viewport;
  132. }
  133.  
  134. void SetRenderTarget(ID3D11RenderTargetView*& renderTarget)
  135. {
  136. ID3D11Texture2D* pBackBuffer;
  137. swapchain->GetBuffer(0, __uuidof(ID3D11Texture2D), (void**)&pBackBuffer);
  138. dev->CreateRenderTargetView(pBackBuffer, NULL, &renderTarget);
  139. devcon->OMSetRenderTargets(1, &renderTarget, NULL);
  140. pBackBuffer->Release();
  141. }
  142.  
  143. void ClearRenderTarget(ID3D11RenderTargetView*& renderTarget)
  144. {
  145. devcon->ClearRenderTargetView(backbuffer, D3DXCOLOR(0.0f, 0.2f, 0.4f, 1.0f));
  146. }
  147.  
  148. void SwapSCBuffers(IDXGISwapChain*& swapChain)
  149. {
  150. swapChain->Present(0, 0);
  151. }
  152.  
  153. ID3D10Blob*& LoadVertexShader(wstring filename, string shaderName, string version, ID3D11VertexShader*& shader)
  154. {
  155. ID3D10Blob* vsBlob;
  156. D3DX11CompileFromFile(W(filename), 0, 0, S(shaderName), S(version), 0, 0, 0, &vsBlob, 0, 0);
  157. dev->CreateVertexShader(vsBlob->GetBufferPointer(), vsBlob->GetBufferSize(), NULL, &shader);
  158. return vsBlob;
  159. }
  160.  
  161. ID3D10Blob*& LoadPixelShader(wstring filename, string shaderName, string version, ID3D11PixelShader*& shader)
  162. {
  163. ID3D10Blob* psBlob;
  164. D3DX11CompileFromFile(W(filename), 0, 0, S(shaderName), S(version), 0, 0, 0, &psBlob, 0, 0);
  165. dev->CreatePixelShader(psBlob->GetBufferPointer(), psBlob->GetBufferSize(), NULL, &shader);
  166. return psBlob;
  167. }
  168.  
  169. void InitRenderingPipeline()
  170. {
  171. vsBlob = LoadVertexShader(shadersFile, "VShader", "vs_4_0", vs);
  172. psBlob = LoadPixelShader(shadersFile, "PShader", "ps_4_0", ps);
  173. devcon->VSSetShader(vs, 0, 0);
  174. devcon->PSSetShader(ps, 0, 0);
  175. }
  176.  
  177. D3D11_BUFFER_DESC CreateBD(int vertexCount)
  178. {
  179. D3D11_BUFFER_DESC bd;
  180. ZeroMemory(&bd, sizeof(bd));
  181.  
  182. bd.Usage = D3D11_USAGE_DYNAMIC;
  183. bd.ByteWidth = sizeof(Vertex) * vertexCount;
  184. bd.BindFlags = D3D11_BIND_VERTEX_BUFFER;
  185. bd.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
  186.  
  187. return bd;
  188. }
  189.  
  190. void CreateVertexBuffer(ID3D11Buffer*& buffer, int size)
  191. {
  192. auto bd = CreateBD(size);
  193. dev->CreateBuffer(&bd, NULL, &buffer);
  194. }
  195.  
  196. void WriteVertexBuffer(ID3D11Buffer*& buffer, Vertex* vertices)
  197. {
  198. D3D11_MAPPED_SUBRESOURCE ms;
  199. devcon->Map(buffer, NULL, D3D11_MAP_WRITE_DISCARD, NULL, &ms);
  200. memcpy(ms.pData, buffer, sizeof(vertices));
  201. devcon->Unmap(buffer, NULL);
  202. }
  203.  
  204. ID3D11InputLayout* CreateInputLayout(D3D11_INPUT_ELEMENT_DESC* ied, ID3D10Blob* vsBlob)
  205. {
  206. ID3D11InputLayout* layout;
  207. dev->CreateInputLayout(ied, 2, vsBlob->GetBufferPointer(), vsBlob->GetBufferSize(), &layout);
  208. return layout;
  209. }
  210.  
  211. void LoadGeometry()
  212. {
  213. Vertex vertices[]
  214. {
  215. { 0.0f, 0.5f, 0.0f, D3DXCOLOR(1.0f, 0.0f, 0.0f, 1.0f) },
  216. { 0.45f, -0.5, 0.0f, D3DXCOLOR(0.0f, 1.0f, 0.0f, 1.0f) },
  217. { -0.45f, -0.5f, 0.0f, D3DXCOLOR(0.0f, 0.0f, 1.0f, 1.0f) }
  218. };
  219.  
  220. CreateVertexBuffer(vertexBuffer, 3);
  221. WriteVertexBuffer(vertexBuffer, vertices);
  222. vertexBufferLayout = CreateInputLayout(VertexIED, vsBlob);
  223. devcon->IASetInputLayout(vertexBufferLayout);
  224. }
  225.  
  226. void InitD3D(HWND hWnd = hMainWindow)
  227. {
  228. auto scd = CreateSCD(hWnd, viewportWidth, viewportHeight);
  229. InitD3DDeviceAndSwapChain(scd, swapchain, dev, devcon);
  230. SetRenderTarget(backbuffer);
  231. auto viewport = CreateViewport(viewportWidth, viewportHeight);
  232. devcon->RSSetViewports(1, &viewport);
  233. InitRenderingPipeline();
  234. LoadGeometry();
  235. }
  236.  
  237. void RenderFrame()
  238. {
  239. UINT stride = sizeof(Vertex);
  240. UINT offset = 0;
  241. devcon->IASetVertexBuffers(0, 1, &vertexBuffer, &stride, &offset);
  242.  
  243. // select which primtive type we are using
  244. devcon->IASetPrimitiveTopology(D3D10_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
  245.  
  246. // draw the vertex buffer to the back buffer
  247. devcon->Draw(3, 0);
  248.  
  249. }
  250.  
  251. void ReleaseD3D()
  252. {
  253. vs->Release();
  254. ps->Release();
  255. swapchain->SetFullscreenState(FALSE, NULL);
  256. swapchain->Release();
  257. backbuffer->Release();
  258. dev->Release();
  259. devcon->Release();
  260. }
  261.  
  262. LRESULT CALLBACK OnMessage(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
  263. {
  264. switch (message)
  265. {
  266. case WM_DESTROY:
  267. ReleaseD3D();
  268. ExitProcess(0);
  269. break;
  270. }
  271. return DefWindowProc(hWnd, message, wParam, lParam);
  272. }
  273.  
  274. HWND CreateWnd(int width, int height, wstring title, UINT wndStyle = windowStyle)
  275. {
  276. CreateWC(title, OnMessage);
  277. HWND hWnd = CreateWindow
  278. (
  279. W(title),
  280. W(title),
  281. wndStyle,
  282. 300,
  283. 300,
  284. width,
  285. height,
  286. NULL,
  287. NULL,
  288. hCurrentInstance,
  289. NULL
  290. );
  291. ShowWindow(hWnd, SW_RESTORE);
  292. return hWnd;
  293. }
  294.  
  295. void InitMessageLoop()
  296. {
  297. MSG msg;
  298. while (true)
  299. {
  300. if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
  301. {
  302. TranslateMessage(&msg);
  303. DispatchMessage(&msg);
  304. }
  305. else
  306. {
  307. ClearRenderTarget(backbuffer);
  308. RenderFrame();
  309. SwapSCBuffers(swapchain);
  310. }
  311. }
  312. }
  313.  
  314. int WinMain(HINSTANCE hInstance, string cmdLine, int showCmd)
  315. {
  316. hCurrentInstance = hInstance;
  317. Size wndSz = AdjustWndSzToViewportSz(viewportWidth, viewportHeight);
  318. hMainWindow = CreateWnd(wndSz.Width, wndSz.Height, L"D3DProject1 Main Window");
  319. InitD3D(hMainWindow);
  320. InitMessageLoop();
  321. return 0;
  322. }
  323. }
  324.  
  325. int CALLBACK WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR cmdLine, int showCmd)
  326. {
  327. return D3DProject1::WinMain(hInstance, cmdLine, showCmd);
  328. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement