{"id":5002,"date":"2016-05-31T03:25:41","date_gmt":"2016-05-31T03:25:41","guid":{"rendered":"http:\/\/anthroponaute.fr\/blog-informatique\/?p=5002"},"modified":"2016-05-31T06:51:10","modified_gmt":"2016-05-31T06:51:10","slug":"une-simple-classe-d3d10redenderer","status":"publish","type":"post","link":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/?p=5002","title":{"rendered":"Une simple classe D3D10Renderer"},"content":{"rendered":"<p><strong>Intro : <\/strong><\/p>\n<p><a href=\"https:\/\/anthropoya.cluster014.ovh.net\/blog-informatique\/wp-content\/uploads\/2015\/06\/1211804249.png\"><img decoding=\"async\" loading=\"lazy\" class=\"alignnone  wp-image-2810\" src=\"https:\/\/anthropoya.cluster014.ovh.net\/blog-informatique\/wp-content\/uploads\/2015\/06\/1211804249.png\" alt=\"1211804249\" width=\"226\" height=\"226\" srcset=\"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/wp-content\/uploads\/2015\/06\/1211804249.png 256w, https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/wp-content\/uploads\/2015\/06\/1211804249-150x150.png 150w\" sizes=\"(max-width: 226px) 100vw, 226px\" \/><\/a><\/p>\n<p>Pour utiliser <strong>DirectX<\/strong>, il nous faut une classe\u00a0<strong>D3D10Renderer<\/strong> afin d&rsquo;initialiser le rendu graphique 3D.<\/p>\n<p><strong>Pr\u00e9requis : <\/strong><\/p>\n<p>&#8211; Aucun<\/p>\n<p><strong>Explications :<\/strong><\/p>\n<p>Voici le code du fichier D3D10Renderer.h :<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\n#ifndef D3D10_RENDERER_H\r\n#define D3D10_RENDERER_H\r\n\r\n#include &lt;windows.h&gt;\r\n#include &lt;d3dx10math.h&gt;\r\n#include &lt;DxErr.h&gt;\r\n\r\n#include &quot;Defines.h&quot;\r\n#include &quot;Singleton.h&quot;\r\n#include &quot;Types.h&quot;\r\n\r\n#include &quot;InputManager.h&quot;\r\n\r\n#pragma comment(lib, &quot;d3d10.lib&quot;)\r\n#pragma comment(lib, &quot;d3dx10.lib&quot;)\r\n#pragma comment(lib, &quot;dxerr.lib&quot;)\r\n\r\nclass D3D10Renderer : public Singleton&lt;D3D10Renderer&gt;\r\n{\r\npublic:\r\n\u00a0\u00a0 \u00a0D3D10Renderer(HWND hWnd);\r\n\u00a0\u00a0 \u00a0virtual ~D3D10Renderer();\r\n\r\n\u00a0\u00a0 \u00a0bool Initialize(bool bFullScreen);\r\n\r\n\u00a0\u00a0 \u00a0void Shutdown();\r\n\r\n\u00a0\u00a0 \u00a0void Render();\r\n\r\n\u00a0\u00a0 \u00a0ID3D10Device* GetDevice();\r\n\r\n\u00a0\u00a0 \u00a0uint32 GetViewportWidth();\r\n\u00a0\u00a0 \u00a0uint32 GetViewportHeight();\r\n\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0 \u00a0void EnableZBuffer(bool bEnable);\r\n\r\n\u00a0\u00a0 \u00a0bool CreateSwapChain();\r\n\u00a0\u00a0 \u00a0bool CreateDepthStencilView();\r\n\u00a0\u00a0 \u00a0bool CreateRasterizerState();\r\n\u00a0\u00a0 \u00a0bool CreateDepthStencil();\r\n\u00a0\u00a0 \u00a0void CreateViewport();\r\n\r\n\u00a0\u00a0 \u00a0void UpdateWindowTitle();\r\n\r\n\u00a0\u00a0 \u00a0std::string Formater(const std::wstring&amp; src);\r\n\r\n\u00a0\u00a0 \u00a0void SetFSAAMaximumLevel();\r\n\r\nprivate:\r\n\u00a0\u00a0 \u00a0HWND m_hWnd;\r\n\u00a0\u00a0 \u00a0ID3D10Device* m_pd3dDevice;\r\n\u00a0\u00a0 \u00a0IDXGISwapChain* m_pSwapChain;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0 \u00a0ID3D10RenderTargetView* m_pRenderTargetView;\r\n\r\n\u00a0\u00a0 \u00a0ID3D10Texture2D* m_pDepthStencil;\r\n\u00a0\u00a0 \u00a0ID3D10DepthStencilView* m_pDepthStencilView;\r\n\u00a0\u00a0 \u00a0ID3D10DepthStencilState* m_pDSState;\r\n\u00a0\u00a0 \u00a0ID3D10RasterizerState* m_pRasterizerState;\r\n\r\n\u00a0\u00a0 \u00a0uint32 m_iWidth;\r\n\u00a0\u00a0 \u00a0uint32 m_iHeight;\r\n\r\n\u00a0\u00a0 \u00a0bool m_bFullscreen;\r\n\r\n\u00a0\u00a0 \u00a0uint32 m_iFSAALevel;\r\n};\r\n\r\n#endif\r\n\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p>Voici le code du fichier D3D10Renderer.cpp :<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\n#include &quot;D3D10Renderer.h&quot;\r\n#include &quot;System.h&quot;\r\n\r\n#define WIN32_LEAN_AND_MEAN\r\n#include &lt;Windows.h&gt;\r\n\r\ntemplate&lt;&gt; D3D10Renderer* Singleton&lt;D3D10Renderer&gt;::ms_instance = nullptr;\r\n\r\nD3D10Renderer::D3D10Renderer(HWND hWnd) :\r\nm_hWnd(hWnd),\r\nm_pd3dDevice(nullptr),\r\nm_pSwapChain(nullptr),\r\nm_pRenderTargetView(nullptr),\r\nm_pDepthStencil(nullptr),\r\nm_pDSState(nullptr),\r\nm_pDepthStencilView(nullptr),\r\nm_iWidth(0),\r\nm_iHeight(0),\r\nm_bFullscreen(false),\r\nm_iFSAALevel(8)\r\n{\r\n}\r\n\r\nD3D10Renderer::~D3D10Renderer()\r\n{\r\n\u00a0\u00a0\u00a0 if (m_pd3dDevice)\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0m_pd3dDevice-&gt;ClearState();\r\n\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0SAFE_RELEASE(m_pRenderTargetView);\r\n\u00a0\u00a0 \u00a0SAFE_RELEASE(m_pSwapChain);\r\n\u00a0\u00a0 \u00a0SAFE_RELEASE(m_pd3dDevice);\r\n}\r\n\r\nbool D3D10Renderer::Initialize(bool bFullscreen)\r\n{\r\n\u00a0\u00a0 \u00a0m_bFullscreen = bFullscreen;\r\n\r\n\u00a0\u00a0 \u00a0\/\/ Variable pour stocker l'\u00e9tat erreur \/ succ\u00e8s\r\n\u00a0\u00a0\u00a0 HRESULT hr = S_OK;;\r\n\r\n\u00a0\u00a0 \u00a0if (!CreateSwapChain())\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0return false;\r\n\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0\u00a0 \/\/ Cr\u00e9\u00e9 le back buffer\r\n\u00a0\u00a0\u00a0 ID3D10Texture2D* pBackBuffer;\r\n\u00a0\u00a0\u00a0 hr = m_pSwapChain-&gt;GetBuffer(0, __uuidof(ID3D10Texture2D), (LPVOID*)&amp;pBackBuffer);\r\n\u00a0\u00a0\u00a0 if (FAILED(hr))\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return false;\r\n\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0\/\/ Cr\u00e9\u00e9 la render target\r\n\u00a0\u00a0\u00a0 hr = m_pd3dDevice-&gt;CreateRenderTargetView(pBackBuffer, nullptr, &amp;m_pRenderTargetView);\r\n\u00a0\u00a0\u00a0 pBackBuffer-&gt;Release();\r\n\u00a0\u00a0\u00a0 if (FAILED(hr))\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return false;\r\n\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0if (!CreateDepthStencilView())\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0return false;\r\n\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0if (!CreateRasterizerState())\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0return false;\r\n\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0if (!CreateDepthStencil())\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0return false;\r\n\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0CreateViewport();\r\n\r\n\u00a0\u00a0 \u00a0ShowCursor(false);\r\n\r\n\u00a0\u00a0\u00a0 return true;\r\n}\r\n\r\nvoid D3D10Renderer::Render()\r\n{\r\n\u00a0\u00a0 \u00a0__int64 cntsPerSec = 0;\r\n\u00a0\u00a0 \u00a0QueryPerformanceFrequency((LARGE_INTEGER*)&amp;cntsPerSec);\r\n\r\n\u00a0\u00a0\u00a0 __int64 currTimeStamp = 0;\r\n\u00a0\u00a0\u00a0 QueryPerformanceCounter((LARGE_INTEGER*)&amp;currTimeStamp);\r\n\r\n\u00a0\u00a0 \u00a0static __int64 prevTimeStamp = currTimeStamp;\r\n\r\n\u00a0\u00a0 \u00a0float secsPerCnt = 1.0f \/ (float)cntsPerSec;\u00a0 \u00a0\r\n\r\n\u00a0\u00a0\u00a0 float fTimeSinceLastFrame = (currTimeStamp - prevTimeStamp) * secsPerCnt;\r\n\r\n\u00a0\u00a0\u00a0 static float afClearColor[4] = {0.85f, 1.0f, 1.0f, 1.0f}; \r\n\r\n\u00a0\u00a0\u00a0 \/\/ Efface la surface de rendu\r\n\u00a0\u00a0 \u00a0m_pd3dDevice-&gt;ClearDepthStencilView(m_pDepthStencilView, D3D10_CLEAR_DEPTH, 1.0f, 0 );\r\n\u00a0\u00a0\u00a0 m_pd3dDevice-&gt;ClearRenderTargetView(m_pRenderTargetView, afClearColor);\r\n\r\n\u00a0\u00a0 \u00a0UpdateWindowTitle();\r\n\r\n\u00a0\u00a0 \u00a0m_pSwapChain-&gt;Present(0, 0);\r\n\r\n\u00a0\u00a0\u00a0 prevTimeStamp = currTimeStamp;\r\n}\r\n\r\nID3D10Device* D3D10Renderer::GetDevice()\r\n{\r\n\u00a0\u00a0 \u00a0return m_pd3dDevice;\r\n}\r\n\r\nuint32 D3D10Renderer::GetViewportWidth()\r\n{\r\n\u00a0\u00a0\u00a0 DXGI_SWAP_CHAIN_DESC swapChainDesc;\r\n\u00a0\u00a0\u00a0 ZeroMemory(&amp;swapChainDesc, sizeof(swapChainDesc));\r\n\r\n\u00a0\u00a0 \u00a0m_pSwapChain-&gt;GetDesc(&amp;swapChainDesc);\r\n\r\n\u00a0\u00a0 \u00a0return swapChainDesc.BufferDesc.Width;\r\n}\r\n\r\nuint32 D3D10Renderer::GetViewportHeight()\r\n{\r\n\u00a0\u00a0\u00a0 DXGI_SWAP_CHAIN_DESC swapChainDesc;\r\n\u00a0\u00a0\u00a0 ZeroMemory(&amp;swapChainDesc, sizeof(swapChainDesc));\r\n\r\n\u00a0\u00a0 \u00a0m_pSwapChain-&gt;GetDesc(&amp;swapChainDesc);\r\n\r\n\u00a0\u00a0 \u00a0return swapChainDesc.BufferDesc.Height;\r\n}\r\n\r\nvoid D3D10Renderer::EnableZBuffer(bool bEnable)\r\n{\r\n\u00a0\u00a0 \u00a0D3D10_DEPTH_STENCIL_DESC pDesc;\r\n\r\n\u00a0\u00a0 \u00a0m_pDSState-&gt;GetDesc(&amp;pDesc);\r\n\u00a0\u00a0\u00a0 pDesc.DepthEnable = bEnable;\r\n\r\n\u00a0\u00a0 \u00a0m_pd3dDevice-&gt;OMSetDepthStencilState(m_pDSState, 1);\r\n}\r\n\r\nvoid D3D10Renderer::CreateViewport()\r\n{\r\n\u00a0\u00a0\u00a0 \/\/ Cr\u00e9ation du viewport\r\n\u00a0\u00a0\u00a0 D3D10_VIEWPORT vp;\r\n\r\n\u00a0\u00a0 \u00a0vp.Width = m_iWidth;\r\n\u00a0\u00a0\u00a0 vp.Height = m_iHeight;\r\n\u00a0\u00a0\u00a0 vp.MinDepth = 0.0f;\r\n\u00a0\u00a0\u00a0 vp.MaxDepth = 1.0f;\r\n\u00a0\u00a0\u00a0 vp.TopLeftX = 0;\r\n\u00a0\u00a0\u00a0 vp.TopLeftY = 0;\r\n\r\n\u00a0\u00a0\u00a0 m_pd3dDevice-&gt;RSSetViewports( 1, &amp;vp );\r\n}\r\n\r\nbool D3D10Renderer::CreateSwapChain()\r\n{\r\n\u00a0\u00a0 \u00a0\/\/ Rectangle 2D pour les dimensions de la fen\u00eatre\r\n\u00a0\u00a0\u00a0 RECT rc;\r\n\r\n\u00a0\u00a0 \u00a0\/\/ On obtient les dimensions de la fen\u00eatre courante\r\n\u00a0\u00a0\u00a0 GetClientRect(m_hWnd, &amp;rc);\r\n\u00a0\u00a0 \u00a0\/\/ Largeur de la fen\u00eatre\r\n\u00a0\u00a0\u00a0 m_iWidth = rc.right - rc.left;\r\n\u00a0\u00a0 \u00a0\/\/ Hauteur de la fen\u00eatre\r\n\u00a0\u00a0\u00a0 m_iHeight = rc.bottom - rc.top;\r\n\r\n\u00a0\u00a0 \u00a0\/\/ Param\u00e8tres de cr\u00e9ation du device\r\n\u00a0\u00a0\u00a0 UINT createDeviceFlags = 0;\r\n\r\n\u00a0\u00a0 \u00a0\/\/ Permet d'afficher les \u00e9ventuelles erreurs de la cr\u00e9ation du device\r\n\u00a0\u00a0\u00a0 createDeviceFlags |= D3D10_CREATE_DEVICE_DEBUG;\r\n\r\n\u00a0\u00a0 \u00a0\/\/ Cr\u00e9ation de la Swap Chain\r\n\u00a0\u00a0 \u00a0\/\/ c'est-\u00e0-dire cr\u00e9ation du front buffer et du back buffer\r\n\u00a0\u00a0\u00a0 DXGI_SWAP_CHAIN_DESC sd;\r\n\u00a0\u00a0\u00a0 ZeroMemory(&amp;sd, sizeof(sd));\r\n\u00a0\u00a0\u00a0 sd.BufferCount = 1;\r\n\u00a0\u00a0 \u00a0\/\/ Taille de la surface en pixels\r\n\u00a0\u00a0\u00a0 sd.BufferDesc.Width = m_iWidth;\r\n\u00a0\u00a0\u00a0 sd.BufferDesc.Height = m_iHeight;\r\n\u00a0\u00a0 \u00a0sd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;\r\n\u00a0\u00a0 \u00a0\/\/ Format des couleurs\r\n\u00a0\u00a0\u00a0 sd.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;\r\n\u00a0\u00a0\u00a0 sd.BufferDesc.RefreshRate.Numerator = 0;\r\n\u00a0\u00a0\u00a0 sd.BufferDesc.RefreshRate.Denominator = 1;\r\n\u00a0\u00a0\u00a0 sd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;\r\n\u00a0\u00a0 \u00a0\/\/ L'handle de la fen\u00eatre que l'on va afficher dessus\r\n\u00a0\u00a0\u00a0 sd.OutputWindow = m_hWnd;\r\n\u00a0\u00a0\u00a0 sd.SampleDesc.Count = m_iFSAALevel;\r\n\u00a0\u00a0\u00a0 sd.SampleDesc.Quality = 0;\r\n\u00a0\u00a0 \u00a0\/\/ Fen\u00eatr\u00e9 ou non\r\n\u00a0\u00a0 \u00a0sd.Windowed = !m_bFullscreen;\r\n\u00a0\u00a0 \u00a0sd.SwapEffect = DXGI_SWAP_EFFECT_DISCARD;\r\n\r\n\u00a0\u00a0 \u00a0\/\/ On cr\u00e9\u00e9 le device DirectX 10 et la Swap Chain\r\n\u00a0\u00a0 \u00a0HRESULT hr = D3D10CreateDeviceAndSwapChain(nullptr, D3D10_DRIVER_TYPE_HARDWARE, nullptr, createDeviceFlags,\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 D3D10_SDK_VERSION, &amp;sd, &amp;m_pSwapChain, &amp;m_pd3dDevice);\r\n\u00a0\u00a0\u00a0 if (FAILED(hr))\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0ShowMessageBoxDXError(hr);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return false;\r\n\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0SetFSAAMaximumLevel();\r\n\r\n\u00a0\u00a0 \u00a0return true;\r\n}\r\n\r\nvoid D3D10Renderer::SetFSAAMaximumLevel()\r\n{\r\n\u00a0\u00a0 \u00a0HRESULT hr = S_OK;\r\n\u00a0\u00a0 \u00a0UINT maxQualityLevel = 1;\r\n\u00a0\u00a0 \u00a0for (uint32 iSampleCount = 1; iSampleCount &lt;= D3D10_MAX_MULTISAMPLE_SAMPLE_COUNT; iSampleCount++)\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0hr = m_pd3dDevice-&gt;CheckMultisampleQualityLevels(\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0DXGI_FORMAT_R8G8B8A8_UNORM, iSampleCount, &amp;maxQualityLevel);\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0if (hr != S_OK)\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0fastprint(Formater(L&quot;CheckMultisampleQualityLevels a \u00e9chou\u00e9.&quot;));\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0if (maxQualityLevel &gt; 0)\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0fastprint(&quot;MSAA &quot; &lt;&lt; iSampleCount &lt;&lt; Formater(L&quot;X support\u00e9e par la carte vid\u00e9o avec &quot;) &lt;&lt;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0maxQualityLevel &lt;&lt; Formater(L&quot; niveau(x) de qualit\u00e9.&quot;));\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0}\r\n}\r\n\r\nbool D3D10Renderer::CreateDepthStencilView()\r\n{\r\n\u00a0\u00a0 \u00a0HRESULT hr = S_OK;\r\n\r\n\u00a0\u00a0\u00a0 D3D10_TEXTURE2D_DESC descDepth;\r\n\u00a0\u00a0 \u00a0ZeroMemory(&amp;descDepth, sizeof(descDepth));\r\n\u00a0\u00a0\u00a0 descDepth.Width = m_iWidth;\r\n\u00a0\u00a0\u00a0 descDepth.Height = m_iHeight;\r\n\u00a0\u00a0\u00a0 descDepth.MipLevels = 1;\r\n\u00a0\u00a0\u00a0 descDepth.ArraySize = 1;\r\n\u00a0\u00a0\u00a0 descDepth.Format = DXGI_FORMAT_D32_FLOAT;\r\n\u00a0\u00a0\u00a0 descDepth.SampleDesc.Count = m_iFSAALevel;\r\n\u00a0\u00a0\u00a0 descDepth.SampleDesc.Quality = 0;\r\n\u00a0\u00a0\u00a0 descDepth.Usage = D3D10_USAGE_DEFAULT;\r\n\u00a0\u00a0\u00a0 descDepth.BindFlags = D3D10_BIND_DEPTH_STENCIL;\r\n\u00a0\u00a0\u00a0 descDepth.CPUAccessFlags = 0;\r\n\u00a0\u00a0\u00a0 descDepth.MiscFlags = 0;\r\n\r\n\u00a0\u00a0 \u00a0hr = m_pd3dDevice-&gt;CreateTexture2D(&amp;descDepth, nullptr, &amp;m_pDepthStencil);\r\n\r\n\u00a0\u00a0\u00a0 if (FAILED(hr))\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0ShowMessageBoxDXError(hr);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return false;\r\n\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0 \u00a0D3D10_DEPTH_STENCIL_VIEW_DESC descDSV;\r\n\u00a0\u00a0\u00a0 descDSV.Format = descDepth.Format;\r\n\r\n\u00a0\u00a0 \u00a0if (m_iFSAALevel &gt; 1)\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0descDSV.ViewDimension = D3D10_DSV_DIMENSION_TEXTURE2DMS;\r\n\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0else\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0descDSV.ViewDimension = D3D10_DSV_DIMENSION_TEXTURE2D;\r\n\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0\u00a0 descDSV.Texture2D.MipSlice = 0;\r\n\r\n\u00a0\u00a0 \u00a0hr = m_pd3dDevice-&gt;CreateDepthStencilView(m_pDepthStencil, &amp;descDSV, &amp;m_pDepthStencilView);\r\n\r\n\u00a0\u00a0\u00a0 if (FAILED(hr))\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0ShowMessageBoxDXError(hr);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return false;\r\n\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0m_pd3dDevice-&gt;OMSetRenderTargets(1, &amp;m_pRenderTargetView, m_pDepthStencilView);\r\n\r\n\u00a0\u00a0 \u00a0return true;\r\n}\r\n\r\nbool D3D10Renderer::CreateRasterizerState()\r\n{\r\n\u00a0\u00a0 \u00a0D3D10_RASTERIZER_DESC rasterizerState;\r\n\r\n\u00a0\u00a0 \u00a0rasterizerState.CullMode = D3D10_CULL_NONE;\r\n\u00a0\u00a0 \u00a0rasterizerState.FillMode = D3D10_FILL_SOLID;\r\n\u00a0\u00a0 \u00a0rasterizerState.FrontCounterClockwise = true;\r\n\u00a0\u00a0\u00a0 rasterizerState.DepthBias = false;\r\n\u00a0\u00a0\u00a0 rasterizerState.DepthBiasClamp = 0;\r\n\u00a0\u00a0\u00a0 rasterizerState.SlopeScaledDepthBias = 0;\r\n\u00a0\u00a0\u00a0 rasterizerState.DepthClipEnable = true;\r\n\u00a0\u00a0\u00a0 rasterizerState.ScissorEnable = false;\r\n\u00a0\u00a0\u00a0 rasterizerState.MultisampleEnable = true;\r\n\u00a0\u00a0\u00a0 rasterizerState.AntialiasedLineEnable = true;\r\n\r\n\u00a0\u00a0 \u00a0HRESULT hr = m_pd3dDevice-&gt;CreateRasterizerState(&amp;rasterizerState, &amp;m_pRasterizerState);\u00a0\u00a0 \u00a0\r\n\r\n\u00a0\u00a0 \u00a0m_pd3dDevice-&gt;RSSetState(m_pRasterizerState);\r\n\r\n\u00a0\u00a0\u00a0 if (FAILED(hr))\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0ShowMessageBoxDXError(hr);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return false;\r\n\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0return true;\r\n}\r\n\r\nbool D3D10Renderer::CreateDepthStencil()\r\n{\r\n\u00a0\u00a0 \u00a0D3D10_DEPTH_STENCIL_DESC pDesc;\r\n\r\n\u00a0\u00a0 \u00a0pDesc.DepthEnable = true;\r\n\u00a0\u00a0 \u00a0pDesc.DepthWriteMask = D3D10_DEPTH_WRITE_MASK_ALL;\r\n\u00a0\u00a0 \u00a0pDesc.DepthFunc = D3D10_COMPARISON_LESS;\r\n\u00a0\u00a0 \u00a0pDesc.StencilEnable = true;\r\n\u00a0\u00a0 \u00a0pDesc.StencilReadMask = 0xFF;\r\n\u00a0\u00a0 \u00a0pDesc.StencilWriteMask = 0xFF;\r\n\u00a0\u00a0 \u00a0pDesc.FrontFace.StencilFailOp = D3D10_STENCIL_OP_KEEP;\r\n\u00a0\u00a0 \u00a0pDesc.FrontFace.StencilDepthFailOp = D3D10_STENCIL_OP_INCR;\r\n\u00a0\u00a0 \u00a0pDesc.FrontFace.StencilPassOp = D3D10_STENCIL_OP_KEEP;\r\n\u00a0\u00a0 \u00a0pDesc.FrontFace.StencilFunc = D3D10_COMPARISON_ALWAYS;\r\n\u00a0\u00a0 \u00a0pDesc.BackFace.StencilFailOp = D3D10_STENCIL_OP_KEEP;\r\n\u00a0\u00a0 \u00a0pDesc.BackFace.StencilDepthFailOp = D3D10_STENCIL_OP_DECR;\r\n\u00a0\u00a0 \u00a0pDesc.BackFace.StencilPassOp = D3D10_STENCIL_OP_KEEP;\r\n\u00a0\u00a0 \u00a0pDesc.BackFace.StencilFunc = D3D10_COMPARISON_ALWAYS;\r\n\r\n\u00a0\u00a0 \u00a0HRESULT hr = m_pd3dDevice-&gt;CreateDepthStencilState(&amp;pDesc, &amp;m_pDSState);\r\n\r\n\u00a0\u00a0 \u00a0if (FAILED(hr))\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0ShowMessageBoxDXError(hr);\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0return false;\r\n\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0m_pd3dDevice-&gt;OMSetDepthStencilState(m_pDSState, 1);\r\n\r\n\u00a0\u00a0 \u00a0return true;\r\n}\r\n\r\nFPSCamera* D3D10Renderer::GetCamera()\r\n{\r\n\u00a0\u00a0 \u00a0return m_pCamera;\r\n}\r\n\r\nvoid D3D10Renderer::OnKeyPressed(const KeyEvent&amp; arg)\r\n{\r\n\u00a0\u00a0 \u00a0if (arg.keyCode == VK_ESCAPE)\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0SYSTEM-&gt;Quit();\r\n\u00a0\u00a0 \u00a0}\r\n}\r\n\r\nvoid D3D10Renderer::OnKeyReleased(const KeyEvent&amp; arg)\r\n{\r\n}\r\n\r\nvoid D3D10Renderer::UpdateWindowTitle()\r\n{\r\n\u00a0\u00a0\u00a0 static char buffer[256];\r\n\u00a0\u00a0 \u00a0D3DXVECTOR3 camPos = D3DXVECTOR3(1.0f, 1.0f, 1.0f);\r\n\r\n\u00a0\u00a0 \u00a0sprintf(buffer, &quot;Position de la cam\u00e9ra : X = %.2f Y = %.2f Z = %.2f&quot;, camPos.x, camPos.y, camPos.z);\r\n\u00a0\r\n\u00a0\u00a0\u00a0 \/\/ On met \u00e0 jour le titre de la fen\u00eatre\r\n\u00a0\u00a0\u00a0 SetWindowTextA(m_hWnd, buffer);\r\n}\r\n\r\nstd::string D3D10Renderer::Formater(const std::wstring&amp; src)\r\n{\r\n\u00a0\u00a0 \u00a0char outString[512];\r\n\u00a0\u00a0 \u00a0CharToOemW(src.c_str(), outString);\r\n\u00a0\r\n\u00a0\u00a0 \u00a0return std::string(outString);\r\n}\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p><strong>R\u00e9sum\u00e9 :<\/strong><\/p>\n<p>Nous avons pr\u00e9sent\u00e9 les deux fichiers n\u00e9cessaire \u00e0 l&rsquo;initialiser du <strong>rendu graphique<\/strong> de <strong>DirectX<\/strong> !<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Intro : Pour utiliser DirectX, il nous faut une classe\u00a0D3D10Renderer afin d&rsquo;initialiser le rendu graphique 3D. Pr\u00e9requis : &#8211; Aucun Explications : Voici le code du fichier D3D10Renderer.h : &nbsp; Voici le code du fichier D3D10Renderer.cpp : &nbsp; R\u00e9sum\u00e9 : Nous avons pr\u00e9sent\u00e9 les deux fichiers n\u00e9cessaire \u00e0 l&rsquo;initialiser du rendu graphique de DirectX !<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[7],"tags":[],"_links":{"self":[{"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=\/wp\/v2\/posts\/5002"}],"collection":[{"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=5002"}],"version-history":[{"count":16,"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=\/wp\/v2\/posts\/5002\/revisions"}],"predecessor-version":[{"id":5019,"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=\/wp\/v2\/posts\/5002\/revisions\/5019"}],"wp:attachment":[{"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=5002"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=5002"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=5002"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}