DX11GraphicsApi.cpp 42 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221
  1. #include <d3d11.h>
  2. #include <dxgi1_5.h>
  3. #include "Bild.h"
  4. #include "DLLRegister.h"
  5. #include "DXBuffer.h"
  6. #include "Fenster.h"
  7. #include "Globals.h"
  8. #include "GraphicsApi.h"
  9. #include "Kam3D.h"
  10. #include "Logging.h"
  11. #include "Model3DList.h"
  12. #include "Shader.h"
  13. #include "Textur.h"
  14. #include "TexturList.h"
  15. #include "TexturModel.h"
  16. #include "UIPixelShader.h"
  17. #include "UIVertexShader.h"
  18. #include "Welt3D.h"
  19. using namespace Framework;
  20. struct TexturEffect
  21. {
  22. bool enabled;
  23. float percentage;
  24. };
  25. DirectX11::DirectX11()
  26. : GraphicsApi(DIRECTX11),
  27. d3d11Device(0),
  28. d3d11Context(0),
  29. d3d11SpawChain(0),
  30. uiTextur(0),
  31. vertexShader(0),
  32. pixelShader(0),
  33. sampleState(0),
  34. rtview(0),
  35. dsView(0),
  36. depthStencilBuffer(0),
  37. depthStencilState(0),
  38. depthDisabledStencilState(0),
  39. blendStateAlphaBlend(0),
  40. vp(0),
  41. texturModel(0),
  42. texturRegister(new TexturList()),
  43. texturRS(0),
  44. meshRS(0),
  45. defaultTextur(0),
  46. diffuseLights(0),
  47. pointLights(0)
  48. {}
  49. DirectX11::~DirectX11()
  50. {
  51. if (diffuseLights) diffuseLights->release();
  52. if (pointLights) pointLights->release();
  53. if (defaultTextur) defaultTextur->release();
  54. if (texturRS) texturRS->Release();
  55. if (meshRS) meshRS->Release();
  56. if (texturModel) texturModel->release();
  57. texturRegister->release();
  58. if (blendStateAlphaBlend)
  59. {
  60. blendStateAlphaBlend->Release();
  61. blendStateAlphaBlend = NULL;
  62. }
  63. if (uiTextur)
  64. {
  65. uiTextur->release();
  66. uiTextur = NULL;
  67. }
  68. if (sampleState)
  69. {
  70. sampleState->Release();
  71. sampleState = NULL;
  72. }
  73. if (pixelShader)
  74. {
  75. pixelShader->release();
  76. pixelShader = NULL;
  77. }
  78. if (vertexShader)
  79. {
  80. vertexShader->release();
  81. vertexShader = NULL;
  82. }
  83. if (depthDisabledStencilState)
  84. {
  85. depthDisabledStencilState->Release();
  86. depthDisabledStencilState = NULL;
  87. }
  88. delete vp;
  89. vp = 0;
  90. if (dsView)
  91. {
  92. dsView->Release();
  93. dsView = NULL;
  94. }
  95. if (depthStencilState)
  96. {
  97. depthStencilState->Release();
  98. depthStencilState = NULL;
  99. }
  100. if (depthStencilBuffer)
  101. {
  102. depthStencilBuffer->Release();
  103. depthStencilBuffer = NULL;
  104. }
  105. if (rtview)
  106. {
  107. rtview->Release();
  108. rtview = NULL;
  109. }
  110. if (d3d11SpawChain)
  111. {
  112. d3d11SpawChain->Release();
  113. d3d11SpawChain = NULL;
  114. }
  115. if (d3d11Device)
  116. {
  117. d3d11Device->Release();
  118. d3d11Device = NULL;
  119. }
  120. if (d3d11Context)
  121. {
  122. d3d11Context->Release();
  123. d3d11Context = NULL;
  124. getDLLRegister()->releaseDLL("d3d11.dll");
  125. getDLLRegister()->releaseDLL("dxgi.dll");
  126. }
  127. }
  128. typedef HRESULT(__stdcall* CreateDXGIFactory2Function)(UINT, REFIID, void**);
  129. typedef HRESULT(__stdcall* D3D11CreateDeviceAndSwapChainFunction)(IDXGIAdapter*,
  130. D3D_DRIVER_TYPE,
  131. HMODULE,
  132. UINT,
  133. const D3D_FEATURE_LEVEL*,
  134. UINT,
  135. UINT,
  136. const DXGI_SWAP_CHAIN_DESC*,
  137. IDXGISwapChain**,
  138. ID3D11Device**,
  139. D3D_FEATURE_LEVEL*,
  140. ID3D11DeviceContext**);
  141. void DirectX11::initialize(
  142. WFenster* fenster, Vec2<int> backBufferSize, bool fullScreen)
  143. {
  144. if (d3d11Device)
  145. return GraphicsApi::initialize(fenster, backBufferSize, fullScreen);
  146. GraphicsApi::initialize(fenster, backBufferSize, fullScreen);
  147. //--------------------------------------------------------------------
  148. // Create Device
  149. HINSTANCE dxgiDLL = getDLLRegister()->ladeDLL("dxgi.dll", "dxgi.dll");
  150. if (!dxgiDLL)
  151. {
  152. WMessageBox(fenster->getFensterHandle(),
  153. new Text("Fehler"),
  154. new Text("dxgi.dll konnte nicht gefunden werden."),
  155. MB_ICONERROR);
  156. return;
  157. }
  158. CreateDXGIFactory2Function createFactory
  159. = (CreateDXGIFactory2Function)GetProcAddress(
  160. dxgiDLL, "CreateDXGIFactory2");
  161. if (!createFactory)
  162. {
  163. getDLLRegister()->releaseDLL("dxgi.dll");
  164. WMessageBox(fenster->getFensterHandle(),
  165. new Text("Fehler"),
  166. new Text(
  167. "Der Einstiegspunkt CreateDXGIFactory2 fon dxgi.dll konnte "
  168. "nicht gefunden werden."),
  169. MB_ICONERROR);
  170. return;
  171. }
  172. IDXGIFactory5* factory;
  173. HRESULT res = createFactory(0, __uuidof(IDXGIFactory5), (void**)&factory);
  174. if (FAILED(res))
  175. {
  176. getDLLRegister()->releaseDLL("dxgi.dll");
  177. Logging::error() << "ERROR DXGI: createFactory returned " << res
  178. << "\n";
  179. WMessageBox(fenster->getFensterHandle(),
  180. new Text("Fehler"),
  181. new Text("createFactory ist Fehlgeschlagen."),
  182. MB_ICONERROR);
  183. return;
  184. }
  185. // search for gpu with max dedicated memory
  186. IDXGIAdapter* adapter = 0;
  187. IDXGIAdapter* usedAdapter = 0;
  188. unsigned __int64 dedicatedMemoryCount = 0;
  189. for (UINT adapterID = 0;
  190. DXGI_ERROR_NOT_FOUND != factory->EnumAdapters(adapterID, &adapter);
  191. ++adapterID)
  192. {
  193. DXGI_ADAPTER_DESC desc;
  194. adapter->GetDesc(&desc);
  195. if (dedicatedMemoryCount > desc.DedicatedVideoMemory)
  196. {
  197. continue;
  198. }
  199. dedicatedMemoryCount = desc.DedicatedVideoMemory;
  200. if (usedAdapter) usedAdapter->Release();
  201. usedAdapter = adapter;
  202. }
  203. HINSTANCE dll = getDLLRegister()->ladeDLL("d3d11.dll", "d3d11.dll");
  204. if (!dll)
  205. {
  206. WMessageBox(fenster->getFensterHandle(),
  207. new Text("Fehler"),
  208. new Text("DirectX 11 konnte nicht gefunden werden."),
  209. MB_ICONERROR);
  210. return;
  211. }
  212. D3D11CreateDeviceAndSwapChainFunction createDeviceAndSwapChain
  213. = (D3D11CreateDeviceAndSwapChainFunction)GetProcAddress(
  214. dll, "D3D11CreateDeviceAndSwapChain");
  215. if (!createDeviceAndSwapChain)
  216. {
  217. getDLLRegister()->releaseDLL("d3d11.dll");
  218. getDLLRegister()->releaseDLL("dxgi.dll");
  219. WMessageBox(fenster->getFensterHandle(),
  220. new Text("Fehler"),
  221. new Text("Der Einstiegspunkt D3D11CreateDeviceAndSwapChain fon "
  222. "DirectX 11 konnte nicht gefunden werden."),
  223. MB_ICONERROR);
  224. return;
  225. }
  226. // create a struct to hold information about the swap chain
  227. DXGI_SWAP_CHAIN_DESC scd;
  228. // clear out the struct for use
  229. ZeroMemory(&scd, sizeof(DXGI_SWAP_CHAIN_DESC));
  230. scd.Windowed = !fullScreen;
  231. scd.BufferCount = 2;
  232. scd.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
  233. scd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
  234. scd.SampleDesc.Count = 1; // multisampling setting
  235. scd.SampleDesc.Quality = 0; // vendor-specific flag
  236. scd.SwapEffect = DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL;
  237. scd.OutputWindow = fenster ? fenster->getFensterHandle() : 0;
  238. scd.BufferDesc.Width = this->backBufferSize.x;
  239. scd.BufferDesc.Height = this->backBufferSize.y; // windowed/full-screen mode
  240. D3D_FEATURE_LEVEL featureLevel = D3D_FEATURE_LEVEL_11_0;
  241. D3D_FEATURE_LEVEL support = D3D_FEATURE_LEVEL_11_0;
  242. // create a device, device context and swap chain using the information in
  243. // the scd struct
  244. UINT flag = 0;
  245. #ifdef _DEBUG
  246. if (debugDX) flag |= D3D11_CREATE_DEVICE_DEBUG;
  247. #endif
  248. HRESULT result = createDeviceAndSwapChain(usedAdapter,
  249. D3D_DRIVER_TYPE_UNKNOWN,
  250. NULL,
  251. flag,
  252. &featureLevel,
  253. 1,
  254. D3D11_SDK_VERSION,
  255. &scd,
  256. &d3d11SpawChain,
  257. &d3d11Device,
  258. &support,
  259. &d3d11Context);
  260. if (result != S_OK)
  261. {
  262. getDLLRegister()->releaseDLL("d3d11.dll");
  263. getDLLRegister()->releaseDLL("dxgi.dll");
  264. Logging::error() << "ERROR: D3D11CreateDeviceAndSwapChain returned "
  265. << result << "\n";
  266. WMessageBox(fenster->getFensterHandle(),
  267. new Text("Fehler"),
  268. new Text("DirectX 11 konnte nicht initialisiert werden."),
  269. MB_ICONERROR);
  270. return;
  271. }
  272. ID3D11Texture2D* backBufferPtr;
  273. // Get the pointer to the back buffer.
  274. result = d3d11SpawChain->GetBuffer(
  275. 0, __uuidof(ID3D11Texture2D), (LPVOID*)&backBufferPtr);
  276. if (result != S_OK)
  277. {
  278. Logging::error() << "ERROR: d3d11SpawChain->GetBuffer returned "
  279. << result << "\n";
  280. WMessageBox(fenster->getFensterHandle(),
  281. new Text("Fehler"),
  282. new Text("DirectX 11 konnte nicht initialisiert werden."),
  283. MB_ICONERROR);
  284. return;
  285. }
  286. vp = new D3D11_VIEWPORT();
  287. memset(vp, 0, sizeof(D3D11_VIEWPORT));
  288. vp->Width = (float)this->backBufferSize.x;
  289. vp->Height = (float)this->backBufferSize.y;
  290. vp->MinDepth = 0.0f;
  291. vp->MaxDepth = 1.0f;
  292. d3d11Context->RSSetViewports(1, vp);
  293. // Create the render target view with the back buffer pointer.
  294. result = d3d11Device->CreateRenderTargetView(backBufferPtr, NULL, &rtview);
  295. if (result != S_OK)
  296. {
  297. Logging::error()
  298. << "ERROR: d3d11Device->CreateRenderTargetView returned " << result
  299. << "\n";
  300. WMessageBox(fenster->getFensterHandle(),
  301. new Text("Fehler"),
  302. new Text("DirectX 11 konnte nicht initialisiert werden."),
  303. MB_ICONERROR);
  304. return;
  305. }
  306. // Release pointer to the back buffer as we no longer need it.
  307. backBufferPtr->Release();
  308. // Initialize the description of the depth buffer.
  309. D3D11_TEXTURE2D_DESC depthBufferDesc;
  310. ZeroMemory(&depthBufferDesc, sizeof(depthBufferDesc));
  311. // Set up the description of the depth buffer.
  312. depthBufferDesc.Width = this->backBufferSize.x;
  313. depthBufferDesc.Height = this->backBufferSize.y;
  314. depthBufferDesc.MipLevels = 1;
  315. depthBufferDesc.ArraySize = 1;
  316. depthBufferDesc.Format = DXGI_FORMAT_D24_UNORM_S8_UINT;
  317. depthBufferDesc.SampleDesc.Count = 1;
  318. depthBufferDesc.Usage = D3D11_USAGE_DEFAULT;
  319. depthBufferDesc.BindFlags = D3D11_BIND_DEPTH_STENCIL;
  320. // Create the texture for the depth buffer using the filled out description.
  321. result = d3d11Device->CreateTexture2D(
  322. &depthBufferDesc, NULL, &depthStencilBuffer);
  323. if (result != S_OK)
  324. {
  325. Logging::error() << "ERROR: d3d11Device->CreateTexture2D returned "
  326. << result << "\n";
  327. WMessageBox(fenster->getFensterHandle(),
  328. new Text("Fehler"),
  329. new Text("DirectX 11 konnte nicht initialisiert werden."),
  330. MB_ICONERROR);
  331. return;
  332. }
  333. // Initialize the description of the stencil state.
  334. D3D11_DEPTH_STENCIL_DESC depthStencilDesc;
  335. ZeroMemory(&depthStencilDesc, sizeof(depthStencilDesc));
  336. // Set up the description of the stencil state.
  337. depthStencilDesc.DepthEnable = true;
  338. depthStencilDesc.DepthWriteMask = D3D11_DEPTH_WRITE_MASK_ALL;
  339. depthStencilDesc.DepthFunc = D3D11_COMPARISON_LESS_EQUAL;
  340. depthStencilDesc.StencilEnable = true;
  341. depthStencilDesc.StencilReadMask = 0xFF;
  342. depthStencilDesc.StencilWriteMask = 0xFF;
  343. // Stencil operations if pixel is front-facing.
  344. depthStencilDesc.FrontFace.StencilFailOp = D3D11_STENCIL_OP_KEEP;
  345. depthStencilDesc.FrontFace.StencilDepthFailOp = D3D11_STENCIL_OP_DECR;
  346. depthStencilDesc.FrontFace.StencilPassOp = D3D11_STENCIL_OP_KEEP;
  347. depthStencilDesc.FrontFace.StencilFunc = D3D11_COMPARISON_ALWAYS;
  348. // Stencil operations if pixel is back-facing.
  349. depthStencilDesc.BackFace.StencilFailOp = D3D11_STENCIL_OP_KEEP;
  350. depthStencilDesc.BackFace.StencilDepthFailOp = D3D11_STENCIL_OP_INCR;
  351. depthStencilDesc.BackFace.StencilPassOp = D3D11_STENCIL_OP_KEEP;
  352. depthStencilDesc.BackFace.StencilFunc = D3D11_COMPARISON_ALWAYS;
  353. // Create the depth stencil state.
  354. result = d3d11Device->CreateDepthStencilState(
  355. &depthStencilDesc, &depthStencilState);
  356. if (result != S_OK)
  357. {
  358. Logging::error()
  359. << "ERROR: d3d11Device->CreateDepthStencilState returned " << result
  360. << "\n";
  361. WMessageBox(fenster->getFensterHandle(),
  362. new Text("Fehler"),
  363. new Text("DirectX 11 konnte nicht initialisiert werden."),
  364. MB_ICONERROR);
  365. return;
  366. }
  367. d3d11Context->OMSetDepthStencilState(depthStencilState, 1);
  368. // Initialize the depth stencil view.
  369. D3D11_DEPTH_STENCIL_VIEW_DESC depthStencilViewDesc;
  370. ZeroMemory(&depthStencilViewDesc, sizeof(depthStencilViewDesc));
  371. // Set up the depth stencil view description.
  372. depthStencilViewDesc.Format = DXGI_FORMAT_D24_UNORM_S8_UINT;
  373. depthStencilViewDesc.ViewDimension = D3D11_DSV_DIMENSION_TEXTURE2D;
  374. // Create the depth stencil view.
  375. result = d3d11Device->CreateDepthStencilView(
  376. depthStencilBuffer, &depthStencilViewDesc, &dsView);
  377. if (result != S_OK)
  378. {
  379. Logging::error()
  380. << "ERROR: d3d11Device->CreateDepthStencilView returned " << result
  381. << "\n";
  382. WMessageBox(fenster->getFensterHandle(),
  383. new Text("Fehler"),
  384. new Text("DirectX 11 konnte nicht initialisiert werden."),
  385. MB_ICONERROR);
  386. return;
  387. }
  388. d3d11Context->OMSetRenderTargets(1, &rtview, dsView);
  389. D3D11_DEPTH_STENCIL_DESC depthDisabledStencilDesc;
  390. // Clear the second depth stencil state before setting the parameters.
  391. ZeroMemory(&depthDisabledStencilDesc, sizeof(depthDisabledStencilDesc));
  392. // Now create a second depth stencil state which turns off the Z buffer for
  393. // 2D rendering. The only difference is that DepthEnable is set to false,
  394. // all other parameters are the same as the other depth stencil state.
  395. depthDisabledStencilDesc.DepthEnable = false;
  396. depthDisabledStencilDesc.DepthWriteMask = D3D11_DEPTH_WRITE_MASK_ALL;
  397. depthDisabledStencilDesc.DepthFunc = D3D11_COMPARISON_LESS;
  398. depthDisabledStencilDesc.StencilEnable = true;
  399. depthDisabledStencilDesc.StencilReadMask = 0xFF;
  400. depthDisabledStencilDesc.StencilWriteMask = 0xFF;
  401. depthDisabledStencilDesc.FrontFace.StencilFailOp = D3D11_STENCIL_OP_KEEP;
  402. depthDisabledStencilDesc.FrontFace.StencilDepthFailOp
  403. = D3D11_STENCIL_OP_INCR;
  404. depthDisabledStencilDesc.FrontFace.StencilPassOp = D3D11_STENCIL_OP_KEEP;
  405. depthDisabledStencilDesc.FrontFace.StencilFunc = D3D11_COMPARISON_ALWAYS;
  406. depthDisabledStencilDesc.BackFace.StencilFailOp = D3D11_STENCIL_OP_KEEP;
  407. depthDisabledStencilDesc.BackFace.StencilDepthFailOp
  408. = D3D11_STENCIL_OP_DECR;
  409. depthDisabledStencilDesc.BackFace.StencilPassOp = D3D11_STENCIL_OP_KEEP;
  410. depthDisabledStencilDesc.BackFace.StencilFunc = D3D11_COMPARISON_ALWAYS;
  411. // Create the state using the device.
  412. result = d3d11Device->CreateDepthStencilState(
  413. &depthDisabledStencilDesc, &depthDisabledStencilState);
  414. if (result != S_OK)
  415. {
  416. Logging::error()
  417. << "ERROR: d3d11Device->CreateDepthStencilState returned " << result
  418. << "\n";
  419. WMessageBox(fenster->getFensterHandle(),
  420. new Text("Fehler"),
  421. new Text("DirectX 11 konnte nicht initialisiert werden."),
  422. MB_ICONERROR);
  423. return;
  424. }
  425. //-------------------------------------------------
  426. // Shaders
  427. vertexShader = initializeVertexShader(
  428. (unsigned char*)UIVertexShader, sizeof(UIVertexShader));
  429. pixelShader = initializePixelShader(
  430. (unsigned char*)UIPixelShader, sizeof(UIPixelShader));
  431. // Create a texture sampler state description.
  432. D3D11_SAMPLER_DESC samplerDesc;
  433. samplerDesc.Filter = D3D11_FILTER_MIN_MAG_MIP_LINEAR;
  434. samplerDesc.AddressU = D3D11_TEXTURE_ADDRESS_WRAP;
  435. samplerDesc.AddressV = D3D11_TEXTURE_ADDRESS_WRAP;
  436. samplerDesc.AddressW = D3D11_TEXTURE_ADDRESS_WRAP;
  437. samplerDesc.MipLODBias = 0.0f;
  438. samplerDesc.MaxAnisotropy = 1;
  439. samplerDesc.ComparisonFunc = D3D11_COMPARISON_ALWAYS;
  440. samplerDesc.BorderColor[0] = 0;
  441. samplerDesc.BorderColor[1] = 0;
  442. samplerDesc.BorderColor[2] = 0;
  443. samplerDesc.BorderColor[3] = 0;
  444. samplerDesc.MinLOD = 0;
  445. samplerDesc.MaxLOD = D3D11_FLOAT32_MAX;
  446. // Create the texture sampler state.
  447. result = d3d11Device->CreateSamplerState(&samplerDesc, &sampleState);
  448. if (result != S_OK)
  449. {
  450. Logging::error() << "ERROR: d3d11Device->CreateSamplerState returned "
  451. << result << "\n";
  452. WMessageBox(fenster->getFensterHandle(),
  453. new Text("Fehler"),
  454. new Text("DirectX 11 konnte nicht initialisiert werden."),
  455. MB_ICONERROR);
  456. return;
  457. }
  458. //---------------------------------------------------------------
  459. // Framework Backbuffer Texture
  460. Bild* renderB = new Bild(1);
  461. renderB->setAlpha3D(1);
  462. renderB->neuBild(this->backBufferSize.x, this->backBufferSize.y, 0);
  463. uiTextur = createOrGetTextur("_f_Render_Bild", renderB);
  464. ((DX11Textur*)uiTextur)->setUseMips(0);
  465. texturModel = new TexturModel(this, "_framework_gui_");
  466. texturModel->setSize(this->backBufferSize);
  467. texturModel->setTextur(dynamic_cast<Textur*>(uiTextur->getThis()));
  468. D3D11_BLEND_DESC blendState;
  469. ZeroMemory(&blendState, sizeof(D3D11_BLEND_DESC));
  470. blendState.AlphaToCoverageEnable = false;
  471. blendState.IndependentBlendEnable = false;
  472. blendState.RenderTarget[0].BlendEnable = true;
  473. blendState.RenderTarget[0].SrcBlend = D3D11_BLEND_SRC_ALPHA;
  474. blendState.RenderTarget[0].DestBlend = D3D11_BLEND_INV_SRC_ALPHA;
  475. blendState.RenderTarget[0].BlendOp = D3D11_BLEND_OP_ADD;
  476. blendState.RenderTarget[0].SrcBlendAlpha = D3D11_BLEND_ZERO;
  477. blendState.RenderTarget[0].DestBlendAlpha = D3D11_BLEND_ONE;
  478. blendState.RenderTarget[0].BlendOpAlpha = D3D11_BLEND_OP_ADD;
  479. blendState.RenderTarget[0].RenderTargetWriteMask
  480. = D3D11_COLOR_WRITE_ENABLE_ALL;
  481. d3d11Device->CreateBlendState(&blendState, &blendStateAlphaBlend);
  482. d3d11Context->OMSetBlendState(blendStateAlphaBlend, 0, 0xFFFFFFFF);
  483. // Setup Render Objekt
  484. vertexShader->benutzeShader();
  485. d3d11Context->PSSetSamplers(0, 1, &sampleState);
  486. pixelShader->benutzeShader();
  487. D3D11_RASTERIZER_DESC rasterDesc;
  488. ZeroMemory(&rasterDesc, sizeof(rasterDesc));
  489. rasterDesc.AntialiasedLineEnable = false;
  490. rasterDesc.CullMode = D3D11_CULL_BACK;
  491. rasterDesc.DepthBiasClamp = 0.0f;
  492. rasterDesc.DepthClipEnable = true;
  493. rasterDesc.FillMode = D3D11_FILL_SOLID;
  494. rasterDesc.FrontCounterClockwise = false;
  495. rasterDesc.MultisampleEnable = false;
  496. rasterDesc.ScissorEnable = false;
  497. rasterDesc.SlopeScaledDepthBias = 0.0f;
  498. d3d11Device->CreateRasterizerState(&rasterDesc, &texturRS);
  499. ZeroMemory(&rasterDesc, sizeof(rasterDesc));
  500. rasterDesc.AntialiasedLineEnable = false;
  501. rasterDesc.CullMode = D3D11_CULL_BACK;
  502. rasterDesc.DepthBiasClamp = 0.0f;
  503. rasterDesc.DepthClipEnable = true;
  504. rasterDesc.FillMode = D3D11_FILL_WIREFRAME;
  505. rasterDesc.FrontCounterClockwise = false;
  506. rasterDesc.MultisampleEnable = false;
  507. rasterDesc.ScissorEnable = false;
  508. rasterDesc.SlopeScaledDepthBias = 0.0f;
  509. d3d11Device->CreateRasterizerState(&rasterDesc, &meshRS);
  510. d3d11Context->RSSetState(texturRS);
  511. Bild* b = new Bild();
  512. b->neuBild(10, 10, 0xFFFFFFFF);
  513. defaultTextur = createOrGetTextur("_default_textur", b);
  514. diffuseLights = new DX11StructuredBuffer(
  515. sizeof(DiffuseLight), d3d11Device, d3d11Context);
  516. pointLights = new DX11StructuredBuffer(
  517. sizeof(PointLight), d3d11Device, d3d11Context);
  518. }
  519. void DirectX11::update()
  520. {
  521. modelList->removeAll();
  522. if (texturModel)
  523. {
  524. texturModel->release();
  525. texturModel = 0;
  526. }
  527. if (pointLights)
  528. pointLights = (DX11StructuredBuffer*)pointLights->release();
  529. if (diffuseLights)
  530. diffuseLights = (DX11StructuredBuffer*)diffuseLights->release();
  531. if (texturRS)
  532. {
  533. texturRS->Release();
  534. texturRS = NULL;
  535. }
  536. if (meshRS)
  537. {
  538. meshRS->Release();
  539. meshRS = NULL;
  540. }
  541. texturRegister->leeren();
  542. if (defaultTextur) defaultTextur = (Textur*)defaultTextur->release();
  543. if (blendStateAlphaBlend)
  544. {
  545. blendStateAlphaBlend->Release();
  546. blendStateAlphaBlend = NULL;
  547. }
  548. if (uiTextur)
  549. {
  550. uiTextur->release();
  551. uiTextur = NULL;
  552. }
  553. if (sampleState)
  554. {
  555. sampleState->Release();
  556. sampleState = NULL;
  557. }
  558. if (pixelShader)
  559. {
  560. pixelShader->release();
  561. pixelShader = NULL;
  562. }
  563. if (vertexShader)
  564. {
  565. vertexShader->release();
  566. vertexShader = NULL;
  567. }
  568. if (depthDisabledStencilState)
  569. {
  570. depthDisabledStencilState->Release();
  571. depthDisabledStencilState = NULL;
  572. }
  573. delete vp;
  574. vp = 0;
  575. if (dsView)
  576. {
  577. dsView->Release();
  578. dsView = NULL;
  579. }
  580. if (depthStencilState)
  581. {
  582. depthStencilState->Release();
  583. depthStencilState = NULL;
  584. }
  585. if (depthStencilBuffer)
  586. {
  587. depthStencilBuffer->Release();
  588. depthStencilBuffer = NULL;
  589. }
  590. if (rtview)
  591. {
  592. rtview->Release();
  593. rtview = NULL;
  594. }
  595. if (d3d11SpawChain)
  596. {
  597. d3d11SpawChain->Release();
  598. d3d11SpawChain = NULL;
  599. }
  600. if (d3d11Device)
  601. {
  602. d3d11Device->Release();
  603. d3d11Device = NULL;
  604. }
  605. if (d3d11Context)
  606. {
  607. d3d11Context->Release();
  608. d3d11Context = NULL;
  609. }
  610. initialize(dynamic_cast<WFenster*>(fenster->getThis()),
  611. backBufferSize,
  612. fullScreen);
  613. }
  614. void DirectX11::beginFrame(bool fill2D, bool fill3D, int fillColor)
  615. {
  616. if (fill2D) uiTextur->zBild()->setFarbe(fillColor);
  617. if (fill3D || true)
  618. {
  619. float color[4];
  620. // Setup the color to clear the buffer.
  621. color[0] = ((fillColor >> 16) & 0xFF) / 255.f; // R
  622. color[1] = ((fillColor >> 8) & 0xFF) / 255.f; // G
  623. color[2] = (fillColor & 0xFF) / 255.f; // B
  624. color[3] = ((fillColor >> 24) & 0xFF) / 255.f; // A
  625. d3d11Context->ClearRenderTargetView(rtview, color);
  626. }
  627. // Bind the render target view and depth stencil buffer to the output render
  628. // pipeline.
  629. d3d11Context->OMSetRenderTargets(1, &rtview, dsView);
  630. // Clear the depth buffer.
  631. d3d11Context->ClearDepthStencilView(
  632. dsView, D3D11_CLEAR_DEPTH | D3D11_CLEAR_STENCIL, 1, 0);
  633. // Set the depth stencil state.
  634. d3d11Context->OMSetDepthStencilState(depthStencilState, 1);
  635. }
  636. void DirectX11::renderObject(Model3D* zObj)
  637. {
  638. if (!zObj->zModelData()) return;
  639. int curId = zObj->zModelData()->getId();
  640. zObj->zModelData()->updateGPUMemory();
  641. Mat4<float> trans = Mat4<float>::identity();
  642. int anz = zObj->errechneMatrizen(trans, matrixBuffer);
  643. if (vertexShader)
  644. vertexShader->füllConstBuffer(
  645. (char*)matrixBuffer, 0, sizeof(Mat4<float>) * anz);
  646. float matirialBuffer[3]; // light factors (phong model)
  647. matirialBuffer[0] = zObj->getAmbientFactor();
  648. matirialBuffer[1] = zObj->getDiffusFactor();
  649. matirialBuffer[2] = zObj->getSpecularFactor();
  650. if (pixelShader)
  651. pixelShader->füllConstBuffer(
  652. (char*)matirialBuffer, 1, sizeof(float) * 3);
  653. unsigned int offset = 0;
  654. unsigned int es
  655. = (unsigned)zObj->zModelData()->zDXVertexBuffer()->getElementLength();
  656. ID3D11Buffer* vBuffer
  657. = ((DX11Buffer*)zObj->zModelData()->zDXVertexBuffer())->zBuffer();
  658. d3d11Context->IASetVertexBuffers(0, 1, &vBuffer, &es, &offset);
  659. Model3DTextur* zTextur = zObj->zTextur();
  660. int ind = 0;
  661. int current = 0;
  662. if (zObj->zEffectTextur())
  663. {
  664. ID3D11ShaderResourceView* v[1];
  665. DX11Textur* zEffectTextur = (DX11Textur*)zObj->zEffectTextur();
  666. if (zEffectTextur && zEffectTextur->brauchtUpdate())
  667. zEffectTextur->updateTextur();
  668. v[0] = *zEffectTextur;
  669. d3d11Context->PSSetShaderResources(3, 1, v);
  670. TexturEffect e = {1, zObj->getEffectPercentage()};
  671. if (pixelShader)
  672. pixelShader->füllConstBuffer((char*)&e, 3, sizeof(TexturEffect));
  673. }
  674. else
  675. {
  676. TexturEffect e = {0, 0.f};
  677. if (pixelShader)
  678. pixelShader->füllConstBuffer((char*)&e, 3, sizeof(TexturEffect));
  679. }
  680. DXGI_FORMAT f = DXGI_FORMAT_R32_UINT;
  681. if (zObj->zModelData()->zDXIndexBuffer()->getElementLength() == 2)
  682. f = DXGI_FORMAT_R16_UINT;
  683. if (zObj->zModelData()->zDXIndexBuffer()->getElementLength() == 1)
  684. f = DXGI_FORMAT_R8_UINT;
  685. d3d11Context->IASetIndexBuffer(
  686. ((DX11Buffer*)zObj->zModelData()->zDXIndexBuffer())->zBuffer(), f, 0);
  687. d3d11Context->IASetPrimitiveTopology(D3D10_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
  688. zObj->beforeRender(this, vertexShader, pixelShader);
  689. for (auto i = zObj->zModelData()->getPolygons(); i; ++i)
  690. {
  691. if (zObj->needRenderPolygon(ind))
  692. {
  693. Textur* t = zTextur->zPolygonTextur(ind);
  694. if (t && t->brauchtUpdate()) t->updateTextur();
  695. if (t)
  696. {
  697. ID3D11ShaderResourceView* v[3];
  698. v[0] = *(DX11Textur*)t;
  699. v[1] = *diffuseLights;
  700. v[2] = *pointLights;
  701. d3d11Context->PSSetShaderResources(0, 3, v);
  702. d3d11Context->DrawIndexed(i->indexAnz, current, 0);
  703. }
  704. else
  705. {
  706. d3d11Context->RSSetState(meshRS);
  707. ID3D11ShaderResourceView* v[3];
  708. v[0] = *(DX11Textur*)defaultTextur;
  709. v[1] = *diffuseLights;
  710. v[2] = *pointLights;
  711. d3d11Context->PSSetShaderResources(0, 3, v);
  712. d3d11Context->DrawIndexed(i->indexAnz, current, 0);
  713. d3d11Context->RSSetState(texturRS);
  714. }
  715. }
  716. ind++;
  717. current += i->indexAnz;
  718. }
  719. zObj->afterRender(this, pixelShader, vertexShader);
  720. }
  721. // Überprüft, ob eine Kugel in dem Sichtbaren Raum der Welt liegt und gezeichnet
  722. // werden muss
  723. // pos: Der Mittelpunkt der Kugel
  724. // radius: Der Radius der Kugel
  725. // dist: Einen Zeiger auf einen float, in dem das quadrat des Abstands zur
  726. // Kammeraposition gespeichert wird, falls diese Funktion true zurückgiebt und
  727. // der Zeiger nicht 0 ist
  728. bool DirectX11::isInFrustrum(
  729. const Vec3<float>& pos, float radius, float* dist) const
  730. {
  731. for (int i = 0; i < 6; i++)
  732. {
  733. if (frustrum[i] * pos + radius < 0) return 0;
  734. }
  735. if (dist) *dist = kamPos.abstand(pos);
  736. return 1;
  737. }
  738. bool DirectX11::isInFrustrum(
  739. const Vec3<float>& pos, Vec3<float> radius, float* dist) const
  740. {
  741. for (int i = 0; i < 6; i++)
  742. {
  743. float r = abs(frustrum[i].normal() * radius);
  744. if (frustrum[i] * pos + r < 0) return 0;
  745. }
  746. if (dist) *dist = kamPos.abstand(pos);
  747. return 1;
  748. }
  749. void DirectX11::renderKamera(Kam3D* zKamera)
  750. {
  751. d3d11Context->RSSetViewports(1, (D3D11_VIEWPORT*)zKamera->zViewPort());
  752. Mat4<float> tmp = zKamera->getProjectionMatrix() * zKamera->getViewMatrix();
  753. frustrum[0].x = tmp.elements[3][0] + tmp.elements[0][0];
  754. frustrum[0].y = tmp.elements[3][1] + tmp.elements[0][1];
  755. frustrum[0].z = tmp.elements[3][2] + tmp.elements[0][2];
  756. frustrum[0].w = tmp.elements[3][3] + tmp.elements[0][3];
  757. frustrum[1].x = tmp.elements[3][0] - tmp.elements[0][0];
  758. frustrum[1].y = tmp.elements[3][1] - tmp.elements[0][1];
  759. frustrum[1].z = tmp.elements[3][2] - tmp.elements[0][2];
  760. frustrum[1].w = tmp.elements[3][3] - tmp.elements[0][3];
  761. frustrum[2].x = tmp.elements[3][0] - tmp.elements[1][0];
  762. frustrum[2].y = tmp.elements[3][1] - tmp.elements[1][1];
  763. frustrum[2].z = tmp.elements[3][2] - tmp.elements[1][2];
  764. frustrum[2].w = tmp.elements[3][3] - tmp.elements[1][3];
  765. frustrum[3].x = tmp.elements[3][0] + tmp.elements[1][0];
  766. frustrum[3].y = tmp.elements[3][1] + tmp.elements[1][1];
  767. frustrum[3].z = tmp.elements[3][2] + tmp.elements[1][2];
  768. frustrum[3].w = tmp.elements[3][3] + tmp.elements[1][3];
  769. frustrum[4].x = tmp.elements[2][0];
  770. frustrum[4].y = tmp.elements[2][1];
  771. frustrum[4].z = tmp.elements[2][2];
  772. frustrum[4].w = tmp.elements[2][3];
  773. frustrum[5].x = tmp.elements[3][0] - tmp.elements[2][0];
  774. frustrum[5].y = tmp.elements[3][1] - tmp.elements[2][1];
  775. frustrum[5].z = tmp.elements[3][2] - tmp.elements[2][2];
  776. frustrum[5].w = tmp.elements[3][3] - tmp.elements[2][3];
  777. for (int i = 0; i < 6; i++)
  778. frustrum[i].normalize();
  779. viewAndProj[0] = zKamera->getViewMatrix();
  780. viewAndProj[1] = zKamera->getProjectionMatrix();
  781. kamPos = zKamera->getWorldPosition();
  782. if (vertexShader)
  783. vertexShader->füllConstBuffer(
  784. (char*)viewAndProj, 1, sizeof(Mat4<float>) * 2);
  785. if (pixelShader)
  786. pixelShader->füllConstBuffer((char*)&kamPos, 0, sizeof(float) * 3);
  787. Welt3D* w = zKamera->zWelt();
  788. w->lock();
  789. int lc[] = {w->getDiffuseLightCount(), w->getPointLightCount()};
  790. pixelShader->füllConstBuffer((char*)lc, 2, sizeof(int) * 2);
  791. w->copyLight(diffuseLights, pointLights);
  792. int maxDist = 0;
  793. int minDist = 0x7FFFFFFF;
  794. Array<Model3D*> alphaModels;
  795. w->render([this, &minDist, &maxDist, &alphaModels, &lc](Model3D* obj) {
  796. float dist;
  797. if (isInFrustrum(obj->getPos(), obj->getRadius(), &dist))
  798. {
  799. if ((int)dist > maxDist) maxDist = (int)dist;
  800. if ((int)dist < minDist) minDist = (int)dist;
  801. if (obj->hatAlpha())
  802. alphaModels.add(obj);
  803. else
  804. {
  805. pixelShader->füllConstBuffer((char*)lc, 2, sizeof(int) * 2);
  806. renderObject(obj);
  807. }
  808. }
  809. });
  810. maxDist++;
  811. if (alphaModels.getEintragAnzahl())
  812. {
  813. int size = maxDist - minDist;
  814. int* index = new int[size];
  815. memset(index, 0, size * 4);
  816. Model3D** sorted = new Model3D*[size * alphaModels.getEintragAnzahl()];
  817. for (auto obj : alphaModels)
  818. {
  819. float dist;
  820. dist = kamPos.abstand(obj->getPos());
  821. if (isInFrustrum(obj->getPos(), obj->getRadius(), &dist))
  822. {
  823. int pos = (int)dist - minDist;
  824. sorted[pos * alphaModels.getEintragAnzahl() + index[pos]++]
  825. = obj;
  826. }
  827. }
  828. for (int i = 0; i < size; i++)
  829. {
  830. for (int j = 0; j < index[i]; j++)
  831. {
  832. renderObject(sorted[i * alphaModels.getEintragAnzahl() + j]);
  833. }
  834. }
  835. delete[] index;
  836. delete[] sorted;
  837. }
  838. w->unlock();
  839. }
  840. void DirectX11::renderKamera(Kam3D* zKamera, Textur* zTarget)
  841. {
  842. ID3D11RenderTargetView* texturRtView;
  843. DX11Textur* d11Textur = dynamic_cast<DX11Textur*>(zTarget);
  844. if (!d11Textur)
  845. throw "incompatible textur object was passed to renderKamera of "
  846. "DirectX11 GPU API";
  847. d11Textur->setRenderTarget(1);
  848. if (d11Textur->brauchtUpdate()) d11Textur->updateTextur();
  849. D3D11_TEXTURE2D_DESC depthBufferDesc;
  850. ZeroMemory(&depthBufferDesc, sizeof(depthBufferDesc));
  851. // Set up the description of the depth buffer.
  852. depthBufferDesc.Width = zTarget->zBild()->getBreite();
  853. depthBufferDesc.Height = zTarget->zBild()->getHeight();
  854. depthBufferDesc.MipLevels = 1;
  855. depthBufferDesc.ArraySize = 1;
  856. depthBufferDesc.Format = DXGI_FORMAT_D24_UNORM_S8_UINT;
  857. depthBufferDesc.SampleDesc.Count = 1;
  858. depthBufferDesc.Usage = D3D11_USAGE_DEFAULT;
  859. depthBufferDesc.BindFlags = D3D11_BIND_DEPTH_STENCIL;
  860. ID3D11Texture2D* txtDepthStencilBuffer;
  861. // Create the texture for the depth buffer using the filled out description.
  862. HRESULT result = d3d11Device->CreateTexture2D(
  863. &depthBufferDesc, NULL, &txtDepthStencilBuffer);
  864. if (result != S_OK) throw "could not create depth Stencil buffer";
  865. // Initialize the depth stencil view.
  866. D3D11_DEPTH_STENCIL_VIEW_DESC depthStencilViewDesc;
  867. ZeroMemory(&depthStencilViewDesc, sizeof(depthStencilViewDesc));
  868. // Set up the depth stencil view description.
  869. depthStencilViewDesc.Format = DXGI_FORMAT_D24_UNORM_S8_UINT;
  870. depthStencilViewDesc.ViewDimension = D3D11_DSV_DIMENSION_TEXTURE2D;
  871. ID3D11DepthStencilView* txtDsView;
  872. // Create the depth stencil view.
  873. result = d3d11Device->CreateDepthStencilView(
  874. txtDepthStencilBuffer, &depthStencilViewDesc, &txtDsView);
  875. if (result != S_OK) throw "could not create depth stencil view";
  876. D3D11_RENDER_TARGET_VIEW_DESC renderTargetViewDesc;
  877. renderTargetViewDesc.Format = DXGI_FORMAT_B8G8R8A8_UNORM;
  878. renderTargetViewDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2D;
  879. renderTargetViewDesc.Texture2D.MipSlice = 0;
  880. result = d3d11Device->CreateRenderTargetView(
  881. (ID3D11Texture2D*)*d11Textur, &renderTargetViewDesc, &texturRtView);
  882. if (result != S_OK)
  883. throw "could not create render target view for given texture";
  884. d3d11Context->OMSetRenderTargets(1, &texturRtView, txtDsView);
  885. float color[4] = {0, 0, 0, 0};
  886. d3d11Context->ClearRenderTargetView(texturRtView, color);
  887. d3d11Context->ClearDepthStencilView(
  888. txtDsView, D3D11_CLEAR_DEPTH | D3D11_CLEAR_STENCIL, 1, 0);
  889. renderKamera(zKamera);
  890. result = d3d11SpawChain->Present(0, 0);
  891. if (result != S_OK) throw "could not present the rendered content";
  892. d3d11Context->OMSetRenderTargets(1, &rtview, dsView);
  893. texturRtView->Release();
  894. txtDsView->Release();
  895. txtDepthStencilBuffer->Release();
  896. }
  897. void DirectX11::presentFrame()
  898. {
  899. // Set the depth stencil state.
  900. d3d11Context->OMSetDepthStencilState(depthDisabledStencilState, 1);
  901. uiTextur->updateTextur();
  902. d3d11Context->RSSetViewports(1, vp);
  903. float screenAspect = (float)backBufferSize.x / (float)backBufferSize.y;
  904. Mat4<float> view
  905. = view.translation(Vec3<float>(0.f, 0.f, backBufferSize.y * 1.2075f));
  906. viewAndProj[0] = view;
  907. viewAndProj[1]
  908. = view.projektion((float)PI / 4.0f, screenAspect, 0.1f, 10000.f);
  909. kamPos = Vec3<float>(0.f, 0.f, backBufferSize.y * 1.2075f);
  910. if (vertexShader)
  911. vertexShader->füllConstBuffer(
  912. (char*)viewAndProj, 1, sizeof(Mat4<float>) * 2);
  913. if (pixelShader)
  914. pixelShader->füllConstBuffer((char*)&kamPos, 0, sizeof(float) * 3);
  915. if (fenster && !IsIconic(fenster->getFensterHandle()))
  916. renderObject(texturModel);
  917. HRESULT result = d3d11SpawChain->Present(0, 0);
  918. if (!SUCCEEDED(result))
  919. {
  920. HRESULT res = d3d11Device->GetDeviceRemovedReason();
  921. update();
  922. WMessageBox(fenster ? fenster->getFensterHandle() : 0,
  923. new Text("Fehler"),
  924. new Text("Es ist ein Fehler beim rendern aufgetreten."),
  925. MB_ICONERROR);
  926. }
  927. }
  928. Bild* DirectX11::zUIRenderBild() const
  929. {
  930. return uiTextur->zBild();
  931. }
  932. Textur* DirectX11::createOrGetTextur(const char* name, Bild* b)
  933. {
  934. if (!d3d11Device)
  935. {
  936. if (b) b->release();
  937. return 0;
  938. }
  939. if (texturRegister->hatTextur(name))
  940. {
  941. Textur* ret = texturRegister->getTextur(name);
  942. if (b) ret->setBildZ(b);
  943. return ret;
  944. }
  945. Textur* ret = new DX11Textur(d3d11Device, d3d11Context);
  946. if (b) ret->setBildZ(b);
  947. texturRegister->addTextur(dynamic_cast<Textur*>(ret->getThis()), name);
  948. return ret;
  949. }
  950. typedef HRESULT(__stdcall* CreateDXGIFactory2Function)(UINT, REFIID, void**);
  951. typedef HRESULT(__stdcall* D3D11CreateDeviceFunction)(IDXGIAdapter*,
  952. D3D_DRIVER_TYPE,
  953. HMODULE,
  954. UINT,
  955. D3D_FEATURE_LEVEL*,
  956. UINT,
  957. UINT,
  958. ID3D11Device**,
  959. D3D_FEATURE_LEVEL*,
  960. ID3D11DeviceContext**);
  961. bool DirectX11::isAvailable()
  962. {
  963. HINSTANCE dxgiDLL = getDLLRegister()->ladeDLL("dxgi.dll", "dxgi.dll");
  964. if (!dxgiDLL) return 0;
  965. HINSTANCE d3d11DLL = getDLLRegister()->ladeDLL("d3d11.dll", "d3d11.dll");
  966. if (!d3d11DLL)
  967. {
  968. getDLLRegister()->releaseDLL("dxgi.dll");
  969. return 0;
  970. }
  971. CreateDXGIFactory2Function createFactory
  972. = (CreateDXGIFactory2Function)GetProcAddress(
  973. dxgiDLL, "CreateDXGIFactory2");
  974. if (!createFactory)
  975. {
  976. getDLLRegister()->releaseDLL("dxgi.dll");
  977. getDLLRegister()->releaseDLL("d3d11.dll");
  978. return 0;
  979. }
  980. D3D11CreateDeviceFunction createDevice
  981. = (D3D11CreateDeviceFunction)GetProcAddress(
  982. d3d11DLL, "D3D11CreateDevice");
  983. if (!createDevice)
  984. {
  985. getDLLRegister()->releaseDLL("dxgi.dll");
  986. getDLLRegister()->releaseDLL("d3d11.dll");
  987. return 0;
  988. }
  989. IDXGIFactory4* factory;
  990. UINT createFactoryFlags = 0;
  991. #if defined(_DEBUG)
  992. createFactoryFlags = DXGI_CREATE_FACTORY_DEBUG;
  993. #endif
  994. HRESULT res = createFactory(
  995. createFactoryFlags, __uuidof(IDXGIFactory4), (void**)&factory);
  996. if (FAILED(res))
  997. {
  998. getDLLRegister()->releaseDLL("dxgi.dll");
  999. getDLLRegister()->releaseDLL("d3d11.dll");
  1000. return 0;
  1001. }
  1002. int index = 0;
  1003. UINT flag = 0;
  1004. #ifdef _DEBUG
  1005. flag |= D3D11_CREATE_DEVICE_DEBUG;
  1006. #endif
  1007. do
  1008. {
  1009. IDXGIAdapter1* current;
  1010. res = factory->EnumAdapters1(index++, &current);
  1011. if (res == S_OK)
  1012. {
  1013. DXGI_ADAPTER_DESC1 dxgiAdapterDesc1;
  1014. current->GetDesc1(&dxgiAdapterDesc1);
  1015. ID3D11Device* device = 0;
  1016. ID3D11DeviceContext* context = 0;
  1017. D3D_FEATURE_LEVEL level = D3D_FEATURE_LEVEL_11_0;
  1018. if ((dxgiAdapterDesc1.Flags & DXGI_ADAPTER_FLAG_SOFTWARE) == 0
  1019. && SUCCEEDED(createDevice(current,
  1020. D3D_DRIVER_TYPE_UNKNOWN,
  1021. 0,
  1022. flag,
  1023. &level,
  1024. 1,
  1025. D3D11_SDK_VERSION,
  1026. &device,
  1027. 0,
  1028. &context)))
  1029. {
  1030. context->Release();
  1031. device->Release();
  1032. current->Release();
  1033. factory->Release();
  1034. getDLLRegister()->releaseDLL("dxgi.dll");
  1035. getDLLRegister()->releaseDLL("d3d11.dll");
  1036. return 1;
  1037. }
  1038. current->Release();
  1039. }
  1040. } while (res != DXGI_ERROR_NOT_FOUND);
  1041. factory->Release();
  1042. getDLLRegister()->releaseDLL("dxgi.dll");
  1043. getDLLRegister()->releaseDLL("d3d11.dll");
  1044. return 0;
  1045. }
  1046. DXBuffer* DirectX11::createIndexBuffer()
  1047. {
  1048. return new DX11Buffer(
  1049. sizeof(int), d3d11Device, d3d11Context, D3D11_BIND_INDEX_BUFFER);
  1050. }
  1051. DXBuffer* DirectX11::createVertexBuffer()
  1052. {
  1053. return new DX11Buffer(
  1054. sizeof(Vertex3D), d3d11Device, d3d11Context, D3D11_BIND_VERTEX_BUFFER);
  1055. }
  1056. DX11VertexShader* DirectX11::initializeVertexShader(
  1057. unsigned char* byteCode, int size)
  1058. {
  1059. DX11VertexShader* vertexShader
  1060. = new DX11VertexShader(d3d11Device, d3d11Context);
  1061. vertexShader->setCompiledByteArray(byteCode, size);
  1062. D3D11_INPUT_ELEMENT_DESC polygonLayout[5];
  1063. // Create the vertex input layout description.
  1064. // This setup needs to match the VertexType stucture in the ModelClass and
  1065. // in the shader.
  1066. polygonLayout[0].SemanticName = "POSITION";
  1067. polygonLayout[0].SemanticIndex = 0;
  1068. polygonLayout[0].Format = DXGI_FORMAT_R32G32B32_FLOAT;
  1069. polygonLayout[0].InputSlot = 0;
  1070. polygonLayout[0].AlignedByteOffset = 0;
  1071. polygonLayout[0].InputSlotClass = D3D11_INPUT_PER_VERTEX_DATA;
  1072. polygonLayout[0].InstanceDataStepRate = 0;
  1073. polygonLayout[1].SemanticName = "TEXCOORD";
  1074. polygonLayout[1].SemanticIndex = 0;
  1075. polygonLayout[1].Format = DXGI_FORMAT_R32G32_FLOAT;
  1076. polygonLayout[1].InputSlot = 0;
  1077. polygonLayout[1].AlignedByteOffset = D3D11_APPEND_ALIGNED_ELEMENT;
  1078. polygonLayout[1].InputSlotClass = D3D11_INPUT_PER_VERTEX_DATA;
  1079. polygonLayout[1].InstanceDataStepRate = 0;
  1080. polygonLayout[2].SemanticName = "NORMAL";
  1081. polygonLayout[2].SemanticIndex = 0;
  1082. polygonLayout[2].Format = DXGI_FORMAT_R32G32B32_FLOAT;
  1083. polygonLayout[2].InputSlot = 0;
  1084. polygonLayout[2].AlignedByteOffset = D3D11_APPEND_ALIGNED_ELEMENT;
  1085. polygonLayout[2].InputSlotClass = D3D11_INPUT_PER_VERTEX_DATA;
  1086. polygonLayout[2].InstanceDataStepRate = 0;
  1087. polygonLayout[3].SemanticName = "KNOCHEN_ID";
  1088. polygonLayout[3].SemanticIndex = 0;
  1089. polygonLayout[3].Format = DXGI_FORMAT_R32_UINT;
  1090. polygonLayout[3].InputSlot = 0;
  1091. polygonLayout[3].AlignedByteOffset = D3D11_APPEND_ALIGNED_ELEMENT;
  1092. polygonLayout[3].InputSlotClass = D3D11_INPUT_PER_VERTEX_DATA;
  1093. polygonLayout[3].InstanceDataStepRate = 0;
  1094. polygonLayout[4].SemanticName = "VERTEX_ID";
  1095. polygonLayout[4].SemanticIndex = 0;
  1096. polygonLayout[4].Format = DXGI_FORMAT_R32_UINT;
  1097. polygonLayout[4].InputSlot = 0;
  1098. polygonLayout[4].AlignedByteOffset = D3D11_APPEND_ALIGNED_ELEMENT;
  1099. polygonLayout[4].InputSlotClass = D3D11_INPUT_PER_VERTEX_DATA;
  1100. polygonLayout[4].InstanceDataStepRate = 0;
  1101. vertexShader->erstelleInputLayout(polygonLayout, 5);
  1102. vertexShader->erstelleConstBuffer(sizeof(Mat4<float>) * MAX_KNOCHEN_ANZ,
  1103. vertexShader
  1104. ->getFirstUninitializedBufferIndex()); // matrizen für skelett
  1105. // annimationen
  1106. vertexShader->erstelleConstBuffer(sizeof(Mat4<float>) * 2,
  1107. vertexShader
  1108. ->getFirstUninitializedBufferIndex()); // View and Projection Matrix
  1109. return vertexShader;
  1110. }
  1111. DX11PixelShader* DirectX11::initializePixelShader(
  1112. unsigned char* byteCode, int size)
  1113. {
  1114. DX11PixelShader* pixelShader
  1115. = new DX11PixelShader(d3d11Device, d3d11Context);
  1116. pixelShader->setCompiledByteArray((unsigned char*)byteCode, size);
  1117. pixelShader->erstelleConstBuffer(sizeof(float) * 3,
  1118. pixelShader->getFirstUninitializedBufferIndex()); // Kamera Position
  1119. pixelShader->erstelleConstBuffer(sizeof(float) * 3,
  1120. pixelShader->getFirstUninitializedBufferIndex()); // materialkonstanten
  1121. // nach phong model
  1122. pixelShader->erstelleConstBuffer(
  1123. sizeof(int) * 2, pixelShader->getFirstUninitializedBufferIndex());
  1124. pixelShader->erstelleConstBuffer(
  1125. sizeof(TexturEffect), pixelShader->getFirstUninitializedBufferIndex());
  1126. // TODO: Remove Following Test Code
  1127. int lc[] = {0, 0};
  1128. pixelShader->füllConstBuffer((char*)lc, 2, sizeof(int) * 2);
  1129. TexturEffect e = {0, 0.f};
  1130. pixelShader->füllConstBuffer((char*)&e, 3, sizeof(TexturEffect));
  1131. return pixelShader;
  1132. }
  1133. DLLEXPORT ID3D11DeviceContext* DirectX11::zContext()
  1134. {
  1135. return d3d11Context;
  1136. }
  1137. DXBuffer* DirectX11::createStructuredBuffer(int eSize)
  1138. {
  1139. return new DX11StructuredBuffer(eSize, d3d11Device, d3d11Context);
  1140. }