{"id":1582,"date":"2015-03-17T11:21:37","date_gmt":"2015-03-17T11:21:37","guid":{"rendered":"http:\/\/anthroponaute.fr\/blog-informatique\/?p=1582"},"modified":"2016-02-02T11:43:44","modified_gmt":"2016-02-02T11:43:44","slug":"introduction-a-directx-10-rendu-2d-partie-5","status":"publish","type":"post","link":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/?p=1582","title":{"rendered":"Introduction \u00e0 DirectX 10 \u2013 Rendu 2D \u2013 partie 5"},"content":{"rendered":"<p><a href=\"https:\/\/anthropoya.cluster014.ovh.net\/blog-informatique\/wp-content\/uploads\/2015\/03\/directx9c.png\"><img decoding=\"async\" loading=\"lazy\" class=\"alignnone size-full wp-image-1053\" src=\"https:\/\/anthropoya.cluster014.ovh.net\/blog-informatique\/wp-content\/uploads\/2015\/03\/directx9c.png\" alt=\"directx9c\" width=\"346\" height=\"360\" srcset=\"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/wp-content\/uploads\/2015\/03\/directx9c.png 346w, https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/wp-content\/uploads\/2015\/03\/directx9c-288x300.png 288w\" sizes=\"(max-width: 346px) 100vw, 346px\" \/><\/a><\/p>\n<p><strong>Intro :<\/strong><\/p>\n<p>Dans cette cinqui\u00e8me partie, nous allons apprendre comment afficher une image 2D \u00e0 l&rsquo;\u00e9cran.<br \/>\nNous proposerons <strong>deux fa\u00e7on<\/strong> d&rsquo;impl\u00e9menter cet affichage.<\/p>\n<p><strong>Pr\u00e9requis :<\/strong><\/p>\n<p>Avoir suivi la cinqui\u00e8me partie de ce tutoriel.<\/p>\n<h2><strong>Quatri\u00e8me partie :<\/strong><\/h2>\n<p>Afficher une image 2D \u00e0 l&rsquo;\u00e9cran.<\/p>\n<p><span style=\"text-decoration: underline;\"><strong>Explications (1\u00e8re fa\u00e7on plus simple, sans utiliser de shader) :<\/strong><\/span><\/p>\n<p>Voici le fichier Sprite2D.h :<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\n#ifndef SPRITE_2D_H\r\n#define SPRITE_2D_H\r\n\r\n#include &lt;d3dx10.h&gt;\r\n#include &lt;string&gt;\r\n\r\nclass Sprite2D\r\n{\r\npublic:\r\n\u00a0\u00a0 \u00a0Sprite2D(ID3D10Device* pDevice, WCHAR* sTextureFilename, int iImageWidth, int iImageHeight);\r\n\u00a0\u00a0 \u00a0virtual ~Sprite2D();\r\n\r\n\u00a0\u00a0 \u00a0bool Initialize();\r\n\u00a0\u00a0 \u00a0void Render();\r\n\r\n\u00a0\u00a0 \u00a0void SetPosition(int iPosX, int iPosY);\r\n\r\nprivate:\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0 \u00a0bool Update();\r\n\r\n\u00a0\u00a0 \u00a0ID3D10Device* m_pDevice;\r\n\r\n\u00a0\u00a0 \u00a0int m_iImageWidth;\r\n\u00a0\u00a0 \u00a0int m_iImageHeight;\r\n\r\n\u00a0\u00a0 \u00a0int m_iPosX;\r\n\u00a0\u00a0 \u00a0int m_iPosY;\r\n\r\n\u00a0\u00a0 \u00a0ID3D10ShaderResourceView* m_pTextureRessourceView;\r\n\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0 \u00a0std::wstring m_sTextureFilename;\r\n\r\n\u00a0\u00a0 \u00a0D3DX10_SPRITE m_pSpriteDesc;\r\n\u00a0\u00a0 \u00a0ID3DX10Sprite* m_pSprite;\r\n\r\n\u00a0\u00a0 \u00a0ID3D10Texture2D* m_pTexture;;\r\n\r\n\u00a0\u00a0 \u00a0D3DXMATRIX m_matProjection;\r\n};\r\n\r\n#endif\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p>Voici le constructeur de la classe Sprite2D :<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\nSprite2D::Sprite2D(ID3D10Device* pDevice, WCHAR* sTextureFilename,\r\n     int iImageWidth, int iImageHeight) :\r\nm_pSprite(nullptr),\r\nm_pTexture(nullptr),\r\nm_pTextureRessourceView(nullptr),\r\nm_sTextureFilename(sTextureFilename),\r\nm_pDevice(pDevice),\r\nm_iPosX(0),\r\nm_iPosY(0),\r\nm_iImageWidth(iImageWidth),\r\nm_iImageHeight(iImageHeight)\r\n{\r\n\u00a0\u00a0 \u00a0if (!Initialize())\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0MessageBoxA(NULL, &quot;Erreur d'initialisation d'un Sprite !&quot;, &quot;Erreur&quot;,\r\n                    MB_ICONHAND | MB_OK);\r\n\u00a0\u00a0 \u00a0}\r\n}\r\n\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p>Voici la m\u00e9thode d\u2019initialisation :<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\nbool Sprite2D::Initialize()\r\n{\r\n\u00a0\u00a0 \u00a0HRESULT hr = D3DX10CreateTextureFromFile(m_pDevice, m_sTextureFilename.c_str(), nullptr, nullptr, (ID3D10Resource**)&amp;m_pTexture, nullptr);\r\n\r\n\u00a0\u00a0 \u00a0if (FAILED(hr))\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0 return false;\r\n\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0hr = m_pDevice-&gt;CreateShaderResourceView((ID3D10Resource*)m_pTexture, nullptr, &amp;m_pTextureRessourceView);\r\n\r\n\u00a0\u00a0 \u00a0if (FAILED(hr))\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0 return false;\r\n\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0ZeroMemory(&amp;m_pSpriteDesc, sizeof(D3DX10_SPRITE));\r\n\r\n\u00a0\u00a0 \u00a0m_pSpriteDesc.pTexture = m_pTextureRessourceView;\r\n\u00a0\u00a0 \u00a0m_pSpriteDesc.TexCoord.x = 0;\r\n\u00a0\u00a0 \u00a0m_pSpriteDesc.TexCoord.y = 0;\r\n\u00a0\u00a0 \u00a0m_pSpriteDesc.TexSize.x = 1.0f;\r\n\u00a0\u00a0 \u00a0m_pSpriteDesc.TexSize.y = 1.0f;\r\n\u00a0\u00a0 \u00a0m_pSpriteDesc.TextureIndex = 0;\r\n\u00a0\u00a0 \u00a0m_pSpriteDesc.ColorModulate = D3DXCOLOR(1.0f, 1.0f, 1.0f, 1.0f);\r\n\r\n\u00a0\u00a0 \u00a0hr = D3DX10CreateSprite(m_pDevice, 0, &amp;m_pSprite);\r\n\r\n\u00a0\u00a0 \u00a0if (FAILED(hr))\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0 return false;\r\n\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0D3DXMatrixOrthoOffCenterLH(&amp;m_matProjection, 0.0f, D3D10_RENDERER-&gt;GetViewportWidth(), 0.0f,\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0D3D10_RENDERER-&gt;GetViewportHeight(), 0.1f, 10);\r\n\r\n\u00a0\u00a0 \u00a0hr = m_pSprite-&gt;SetProjectionTransform(&amp;m_matProjection);\r\n\r\n\u00a0\u00a0 \u00a0if (FAILED(hr))\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0 return false;\r\n\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0Update();\r\n\r\n\u00a0\u00a0 \u00a0return true;\r\n}\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p>Voici les autres m\u00e9thodes :<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\nvoid Sprite2D::Render()\r\n{\r\n\u00a0\u00a0 \u00a0m_pSprite-&gt;Begin(D3DX10_SPRITE_SORT_TEXTURE | D3DX10_SPRITE_SAVE_STATE);\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0m_pSprite-&gt;DrawSpritesImmediate(&amp;m_pSpriteDesc, 1, 0, 0);\r\n\r\n\u00a0\u00a0 \u00a0m_pSprite-&gt;End();\r\n}\r\n\r\nbool Sprite2D::Update()\r\n{\r\n\u00a0\u00a0 \u00a0float fSpritePosX = m_iPosX;\r\n\u00a0\u00a0 \u00a0float fSpritePosY = m_iPosY;\r\n\u00a0\u00a0 \u00a0float fSpriteWidth = m_iImageWidth;\r\n\u00a0\u00a0 \u00a0float fSpriteHeight = m_iImageHeight;\r\n\r\n\u00a0\u00a0 \u00a0D3DXMATRIX matTranslation;\r\n\u00a0\u00a0 \u00a0D3DXMatrixTranslation(&amp;matTranslation, (fSpriteWidth \/ 2) + fSpritePosX, (fSpriteHeight \/ 2) + fSpritePosY, 0.1);\r\n\r\n\u00a0\u00a0 \u00a0D3DXMATRIX matScaling;\r\n\u00a0\u00a0 \u00a0D3DXMatrixScaling(&amp;matScaling, fSpriteWidth, fSpriteHeight, 1.0f);\r\n\r\n\u00a0\u00a0 \u00a0m_pSpriteDesc.matWorld = matScaling * matTranslation;\r\n\r\n\u00a0\u00a0 \u00a0return true;\r\n}\r\n\r\nvoid Sprite2D::SetPosition(int iPosX, int iPosY)\r\n{\r\n\u00a0\u00a0 \u00a0m_iPosX = iPosX;\r\n\u00a0\u00a0 \u00a0m_iPosY = iPosY;\r\n\r\n\u00a0\u00a0 \u00a0Update();\r\n}\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<hr \/>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p><strong><span style=\"text-decoration: underline;\">Explications (2\u00e8me fa\u00e7on plus compliqu\u00e9e, en utilisant un shader) :<\/span><br \/>\n<\/strong><\/p>\n<p>Mettre dans un fichier Sprite2D.h :<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\n#ifndef SPRITE_2D\r\n#define SPRITE_2D\r\n\r\n#include &lt;d3dx10.h&gt;\r\n#include &lt;string&gt;\r\n\r\nclass Sprite2D\r\n{\r\npublic:\r\n    \/\/ La structure du rectangle \u00e0 afficher\r\n\u00a0\u00a0 \u00a0struct VertexType\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0D3DXVECTOR3 position;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0D3DXVECTOR2 texture;\r\n\u00a0\u00a0 \u00a0};\r\n\r\n\u00a0\u00a0 \u00a0Sprite2D(ID3D10Device* pDevice, WCHAR* sTextureFilename, int iImageWidth, int iImageHeight);\r\n\u00a0\u00a0 \u00a0virtual ~Sprite2D();\r\n\r\n\u00a0\u00a0 \u00a0bool Initialize();\r\n\u00a0\u00a0 \u00a0void Render();\r\n\r\n\u00a0\u00a0 \u00a0void SetPosition(int iPosX, int iPosY);\r\n\r\nprivate:\u00a0\u00a0 \u00a0\r\n    \/\/ Met \u00e0 jour la dimension du quad textur\u00e9\r\n\u00a0\u00a0 \u00a0bool Update();\r\n\r\n\u00a0\u00a0 \u00a0ID3D10Device* m_pDevice;\r\n\r\n\u00a0\u00a0 \u00a0ID3D10Buffer* m_pVertexBuffer;\r\n\u00a0\u00a0 \u00a0ID3D10Buffer* m_pIndexBuffer;\r\n\r\n\u00a0\u00a0 \u00a0int m_iVertexCount;\r\n\u00a0\u00a0 \u00a0int m_iIndexCount;\r\n\r\n\u00a0\u00a0 \u00a0int m_iScreenWidth;\r\n\u00a0\u00a0 \u00a0int m_iScreenHeight;\r\n\r\n\u00a0\u00a0 \u00a0int m_iImageWidth;\r\n\u00a0\u00a0 \u00a0int m_iImageHeight;\r\n\r\n    \/* Position de l'image *\/\r\n\u00a0\u00a0 \u00a0int m_iPosX;\r\n\u00a0\u00a0 \u00a0int m_iPosY;\r\n\r\n\u00a0\u00a0 \u00a0int m_iPreviousPosX;\r\n\u00a0\u00a0 \u00a0int m_iPreviousPosY;\r\n\r\n\u00a0\u00a0 \u00a0ID3D10ShaderResourceView* m_pTexture;\r\n\u00a0\u00a0 \u00a0ID3D10EffectShaderResourceVariable* m_pTextureVariable;\r\n\r\n\u00a0\u00a0 \u00a0ID3D10Effect* m_pEffect;\r\n\u00a0\u00a0 \u00a0ID3D10EffectTechnique* m_pTechnique;\r\n\u00a0\u00a0 \u00a0ID3D10InputLayout* m_pLayout;\r\n\r\n\u00a0\u00a0 \u00a0ID3D10EffectMatrixVariable* m_pWorldVariable;\r\n\u00a0\u00a0 \u00a0ID3D10EffectMatrixVariable* m_pViewVariable;\r\n\u00a0\u00a0 \u00a0ID3D10EffectMatrixVariable* m_pProjectionVariable;\r\n\r\n\u00a0\u00a0 \u00a0D3DXMATRIX m_worldMatrix;\r\n\u00a0\u00a0 \u00a0D3DXMATRIX m_viewMatrix;\r\n\u00a0\u00a0 \u00a0D3DXMATRIX m_orthoMatrix;\r\n\u00a0\u00a0 \u00a0\r\n    \/\/ Le nom de la texture de l'image \u00e0 afficher\r\n\u00a0\u00a0 \u00a0std::wstring m_sTextureFilename;\r\n};\r\n\r\n#endif\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p>Cr\u00e9er un fichier Sprite2D.cpp o\u00f9 vous metterez :<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\nbool Sprite2D::Initialize()\r\n{\r\n    \/\/ On pr\u00e9pare la matrice orthogonale, sp\u00e9cialement con\u00e7ue pour\r\n    \/\/ le rendu 2D.\r\n\u00a0\u00a0 \u00a0D3DXMatrixOrthoLH(&amp;m_orthoMatrix, (float)m_iScreenWidth,\r\n                      (float)m_iScreenHeight, 1.0f, 20.0f);\r\n\r\n\u00a0\u00a0 \u00a0VertexType* arVertices;\r\n\u00a0\u00a0 \u00a0unsigned long* indices;\r\n\r\n\u00a0\u00a0 \u00a0D3D10_BUFFER_DESC vertexBufferDesc;\r\n\u00a0\u00a0 \u00a0D3D10_BUFFER_DESC indexBufferDesc;\r\n\r\n\u00a0\u00a0\u00a0 D3D10_SUBRESOURCE_DATA vertexData;\r\n\u00a0\u00a0 \u00a0D3D10_SUBRESOURCE_DATA indexData;\r\n\r\n\u00a0\u00a0 \u00a0HRESULT hr;\r\n\r\n\u00a0\u00a0 \u00a0m_iVertexCount = 6;\r\n\u00a0\u00a0 \u00a0m_iIndexCount = m_iVertexCount;\r\n\u00a0\u00a0 \u00a0arVertices = new VertexType[m_iVertexCount];\r\n\u00a0\u00a0 \u00a0indices = new unsigned long[m_iIndexCount];\r\n\r\n\u00a0\u00a0 \u00a0memset(arVertices, 0, (sizeof(VertexType) * m_iVertexCount));\r\n\u00a0\u00a0 \u00a0for (unsigned int i = 0; i &lt; m_iIndexCount; i++)\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0indices[i] = i;\r\n\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0\u00a0 vertexBufferDesc.Usage = D3D10_USAGE_DYNAMIC;\r\n\u00a0\u00a0\u00a0 vertexBufferDesc.ByteWidth = sizeof(VertexType) * m_iVertexCount;\r\n\u00a0\u00a0\u00a0 vertexBufferDesc.BindFlags = D3D10_BIND_VERTEX_BUFFER;\r\n\u00a0\u00a0\u00a0 vertexBufferDesc.CPUAccessFlags = D3D10_CPU_ACCESS_WRITE;\r\n\u00a0\u00a0\u00a0 vertexBufferDesc.MiscFlags = 0;\r\n\r\n\u00a0\u00a0\u00a0 vertexData.pSysMem = arVertices;\r\n\r\n\u00a0\u00a0 \u00a0\/\/ Cr\u00e9\u00e9r le vertex buffer\r\n\u00a0\u00a0\u00a0 hr = m_pDevice-&gt;CreateBuffer(&amp;vertexBufferDesc, &amp;vertexData, &amp;m_pVertexBuffer);\r\n\r\n\u00a0\u00a0 \u00a0if (FAILED(hr))\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0  return false;\r\n\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0\u00a0 indexBufferDesc.Usage = D3D10_USAGE_DEFAULT;\r\n\u00a0\u00a0\u00a0 indexBufferDesc.ByteWidth = sizeof(unsigned long) * m_iIndexCount;\r\n\u00a0\u00a0\u00a0 indexBufferDesc.BindFlags = D3D10_BIND_INDEX_BUFFER;\r\n\u00a0\u00a0\u00a0 indexBufferDesc.CPUAccessFlags = 0;\r\n\u00a0\u00a0\u00a0 indexBufferDesc.MiscFlags = 0;\r\n\r\n\u00a0\u00a0\u00a0 indexData.pSysMem = indices;\r\n\r\n\u00a0\u00a0 \u00a0\/\/ Cr\u00e9\u00e9r l'index buffer\r\n\u00a0\u00a0 \u00a0hr = m_pDevice-&gt;CreateBuffer(&amp;indexBufferDesc, &amp;indexData, &amp;m_pIndexBuffer);\r\n\r\n\u00a0\u00a0 \u00a0if (FAILED(hr))\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 \u00a0delete [] arVertices;\r\n\u00a0\u00a0 \u00a0arVertices = 0;\r\n\r\n\u00a0\u00a0 \u00a0delete [] indices;\r\n\u00a0\u00a0 \u00a0indices = 0;\r\n\r\n\u00a0\u00a0 \u00a0\/********* Partie pr\u00e9paration du shader *********\/\r\n\r\n\u00a0\u00a0 \u00a0unsigned int numElements;\r\n\u00a0\u00a0\u00a0 D3D10_PASS_DESC passDesc;\r\n\r\n\u00a0\u00a0 \u00a0hr = D3DX10CreateEffectFromFile(L&quot;Texture.fx&quot;, NULL, NULL, &quot;fx_4_0&quot;,\r\n                                    D3D10_SHADER_ENABLE_STRICTNESS, 0,\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 \u00a0m_pDevice, NULL, NULL, &amp;m_pEffect, NULL, NULL);\r\n\u00a0\u00a0 \u00a0if (FAILED(hr))\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 \u00a0m_pTechnique = m_pEffect-&gt;GetTechniqueByName(&quot;TextureTechnique&quot;);\r\n\u00a0\u00a0 \u00a0if (!m_pTechnique)\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 D3D10_INPUT_ELEMENT_DESC polygonLayout[] =\r\n\u00a0\u00a0\u00a0 {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 { &quot;POSITION&quot;, 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D10_INPUT_PER_VERTEX_DATA, 0 },\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 { &quot;TEXCOORD&quot;, 0, DXGI_FORMAT_R32G32_FLOAT, 0, D3D10_APPEND_ALIGNED_ELEMENT, D3D10_INPUT_PER_VERTEX_DATA, 0 },\r\n\u00a0\u00a0\u00a0 };\r\n\u00a0\u00a0\u00a0 numElements = sizeof(polygonLayout) \/ sizeof(polygonLayout[0]);\r\n\r\n\u00a0\u00a0\u00a0 m_pTechnique-&gt;GetPassByIndex(0)-&gt;GetDesc(&amp;passDesc);\r\n\r\n\u00a0\u00a0 \u00a0\/\/ Cr\u00e9\u00e9r le vertex input layout\r\n\u00a0\u00a0\u00a0 hr = m_pDevice-&gt;CreateInputLayout(polygonLayout, numElements, passDesc.pIAInputSignature, passDesc.IAInputSignatureSize, &amp;m_pLayout);\r\n\u00a0\u00a0 \u00a0if (FAILED(hr))\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0  return false;\r\n\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0\u00a0 m_pWorldVariable = m_pEffect-&gt;GetVariableByName(&quot;worldMatrix&quot;)-&gt;AsMatrix();\r\n\u00a0\u00a0 \u00a0m_pViewVariable = m_pEffect-&gt;GetVariableByName(&quot;viewMatrix&quot;)-&gt;AsMatrix();\r\n\u00a0\u00a0\u00a0 m_pProjectionVariable = m_pEffect-&gt;GetVariableByName(&quot;projectionMatrix&quot;)-&gt;AsMatrix();\r\n\u00a0\u00a0 \u00a0m_pTextureVariable = m_pEffect-&gt;GetVariableByName(&quot;shaderTexture&quot;)-&gt;AsShaderResource();\r\n\r\n\u00a0\u00a0 \u00a0\/\/ Cr\u00e9\u00e9e la texture\r\n\u00a0\u00a0 \u00a0hr = D3DX10CreateShaderResourceViewFromFile(m_pDevice, m_sTextureFilename.c_str(), NULL, NULL, &amp;m_pTexture, NULL);\r\n\r\n\u00a0\u00a0 \u00a0if (FAILED(hr))\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 \u00a0return true;\r\n}\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p>La fonction de rendu \/ d&rsquo;affichage :<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\n\r\nvoid Sprite2D::Render()\r\n{\r\n\u00a0\u00a0 \u00a0Update();\r\n\r\n    \/\/ On d\u00e9sactive le ZBuffer pour que l'image soit affich\u00e9e devant\r\n    \/\/ tous les rendus\r\n\u00a0\u00a0 \u00a0D3D10_RENDERER-&gt;EnableZBuffer(false);\r\n\r\n\u00a0\u00a0\u00a0 unsigned int stride = sizeof(VertexType);\r\n\u00a0\u00a0 \u00a0unsigned int offset = 0;\r\n\u00a0 \u00a0\r\n    \/\/ On pr\u00e9pare les matrices de transformation\r\n\u00a0\u00a0 \u00a0D3DXMatrixIdentity(&amp;m_worldMatrix);\r\n\u00a0\u00a0 \u00a0D3DXMatrixIdentity(&amp;m_viewMatrix);\r\n\r\n\u00a0\u00a0\u00a0 D3DXVECTOR3 Eye(0.0f, 0.0f, -1.0f);\r\n\u00a0\u00a0\u00a0 D3DXVECTOR3 At(0.0f, 0.0f, 0.0f);\r\n\u00a0\u00a0\u00a0 D3DXVECTOR3 Up(0.0f, 1.0f, 0.0f);\r\n\r\n\u00a0\u00a0\u00a0 D3DXMatrixLookAtLH(&amp;m_viewMatrix, &amp;Eye, &amp;At, &amp;Up);\r\n\r\n\u00a0\u00a0 \u00a0\/\/ Initialise les variables du shader\r\n\u00a0\u00a0\u00a0 m_pWorldVariable-&gt;SetMatrix((float*) &amp;m_worldMatrix);\r\n\u00a0\u00a0 \u00a0m_pViewVariable-&gt;SetMatrix((float*) &amp;m_viewMatrix);\r\n\u00a0\u00a0\u00a0 m_pProjectionVariable-&gt;SetMatrix((float*) &amp;m_orthoMatrix);\r\n\r\n\u00a0\u00a0 \u00a0m_pTextureVariable-&gt;SetResource(m_pTexture);\r\n\r\n\u00a0\u00a0 \u00a0\/\/ Pr\u00e9pare le vertex input layout\r\n\u00a0\u00a0 \u00a0m_pDevice-&gt;IASetInputLayout(m_pLayout);\r\n\r\n\u00a0\u00a0 \u00a0\/\/ Pr\u00e9pare les vertex et index buffers pour \u00eatre affich\u00e9s\r\n\u00a0\u00a0 \u00a0m_pDevice-&gt;IASetVertexBuffers(0, 1, &amp;m_pVertexBuffer, &amp;stride, &amp;offset);\r\n\u00a0\u00a0\u00a0 m_pDevice-&gt;IASetIndexBuffer(m_pIndexBuffer, DXGI_FORMAT_R32_UINT, 0);\r\n\u00a0\u00a0\u00a0 m_pDevice-&gt;IASetPrimitiveTopology(D3D10_PRIMITIVE_TOPOLOGY_TRIANGLELIST);\r\n\r\n\u00a0\u00a0 \u00a0\/\/ Affiche le quad textur\u00e9\r\n\u00a0\u00a0\u00a0 D3D10_TECHNIQUE_DESC techniqueDesc;\r\n\u00a0\u00a0\u00a0 m_pTechnique-&gt;GetDesc(&amp;techniqueDesc);\r\n\u00a0\u00a0 \u00a0for(unsigned int i = 0; i &lt; techniqueDesc.Passes; i++)\r\n\u00a0\u00a0\u00a0 {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 m_pTechnique-&gt;GetPassByIndex(i)-&gt;Apply(0);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 m_pDevice-&gt;DrawIndexed(m_iIndexCount, 0, 0);\r\n\u00a0\u00a0\u00a0 }\r\n\r\n\u00a0\u00a0 \u00a0D3D10_RENDERER-&gt;EnableZBuffer(true);\r\n}\r\n\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p>Ici la fonction de mise \u00e0 jour de la position de l&rsquo;image :<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\nbool Sprite2D::Update()\r\n{\r\n\u00a0\u00a0 \u00a0float left, right, top, bottom;\r\n\u00a0\u00a0 \u00a0VertexType* arVertices;\r\n\u00a0\u00a0 \u00a0void* pVerticesPtr;\r\n\u00a0\u00a0 \u00a0HRESULT hr;\r\n\r\n    \/\/ On calcul les coordonn\u00e9es du quad en fonction de la position\r\n    \/\/ de l'image\r\n\u00a0\u00a0 \u00a0left = (float)((m_iScreenWidth \/ 2) * -1) + (float)m_iPosX;\r\n\u00a0\u00a0 \u00a0right = left + (float)m_iImageWidth;\r\n\r\n\u00a0\u00a0 \u00a0top = (float)(m_iScreenHeight \/ 2) - (float)m_iPosY;\r\n\u00a0\u00a0 \u00a0bottom = top - (float)m_iImageHeight;\r\n\r\n\u00a0\u00a0 \u00a0arVertices = new VertexType[m_iVertexCount];\r\n\r\n\u00a0\u00a0 \u00a0\/\/ Premier triangle\r\n\u00a0\u00a0 \u00a0arVertices[0].position = D3DXVECTOR3(left, top, 0.0f);\u00a0 \/\/ Top left.\r\n\u00a0\u00a0 \u00a0arVertices[0].texture = D3DXVECTOR2(0.0f, 0.0f);\r\n\r\n\u00a0\u00a0 \u00a0arVertices[1].position = D3DXVECTOR3(right, bottom, 0.0f);\u00a0 \/\/ Bottom right.\r\n\u00a0\u00a0 \u00a0arVertices[1].texture = D3DXVECTOR2(1.0f, 1.0f);\r\n\r\n\u00a0\u00a0 \u00a0arVertices[2].position = D3DXVECTOR3(left, bottom, 0.0f);\u00a0 \/\/ Bottom left.\r\n\u00a0\u00a0 \u00a0arVertices[2].texture = D3DXVECTOR2(0.0f, 1.0f);\r\n\r\n\u00a0\u00a0 \u00a0\/\/ Deuxi\u00e8me triangle\r\n\u00a0\u00a0 \u00a0arVertices[3].position = D3DXVECTOR3(left, top, 0.0f);\u00a0 \/\/ Top left.\r\n\u00a0\u00a0 \u00a0arVertices[3].texture = D3DXVECTOR2(0.0f, 0.0f);\r\n\r\n\u00a0\u00a0 \u00a0arVertices[4].position = D3DXVECTOR3(right, top, 0.0f);\u00a0 \/\/ Top right.\r\n\u00a0\u00a0 \u00a0arVertices[4].texture = D3DXVECTOR2(1.0f, 0.0f);\r\n\r\n\u00a0\u00a0 \u00a0arVertices[5].position = D3DXVECTOR3(right, bottom, 0.0f);\u00a0 \/\/ Bottom right.\r\n\u00a0\u00a0 \u00a0arVertices[5].texture = D3DXVECTOR2(1.0f, 1.0f);\r\n\r\n\u00a0\u00a0 \u00a0hr = m_pVertexBuffer-&gt;Map(D3D10_MAP_WRITE_DISCARD, 0, (void**)&amp;pVerticesPtr);\r\n\r\n\u00a0\u00a0 \u00a0if (FAILED(hr))\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0  return false;\r\n\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0memcpy(pVerticesPtr, (void*)arVertices, (sizeof(VertexType) * m_iVertexCount));\r\n\r\n\u00a0\u00a0 \u00a0m_pVertexBuffer-&gt;Unmap();\r\n\r\n\u00a0\u00a0 \u00a0delete [] arVertices;\r\n\u00a0\u00a0 \u00a0arVertices = 0;\r\n\r\n\u00a0\u00a0 \u00a0return true;\r\n}\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p>Cr\u00e9ez un fichier Texture.fx, o\u00f9 vous mettrez :<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\nmatrix worldMatrix;\r\nmatrix viewMatrix;\r\nmatrix projectionMatrix;\r\nTexture2D shaderTexture;\r\n\r\nSamplerState SampleType\r\n{\r\n\u00a0\u00a0\u00a0 Filter = MIN_MAG_MIP_LINEAR;\r\n\u00a0\u00a0\u00a0 AddressU = Wrap;\r\n\u00a0\u00a0\u00a0 AddressV = Wrap;\r\n};\r\n\r\nstruct VertexInputType\r\n{\r\n\u00a0\u00a0\u00a0 float4 position : POSITION;\r\n\u00a0\u00a0\u00a0 float2 tex : TEXCOORD0;\r\n};\r\n\r\nstruct PixelInputType\r\n{\r\n\u00a0\u00a0\u00a0 float4 position : SV_POSITION;\r\n\u00a0\u00a0\u00a0 float2 tex : TEXCOORD0;\r\n};\r\n\r\nPixelInputType TextureVertexShader(VertexInputType input)\r\n{\r\n\u00a0\u00a0\u00a0 PixelInputType output;\r\n\u00a0\u00a0\r\n\u00a0\u00a0\u00a0 input.position.w = 1.0f;\r\n\r\n\u00a0\u00a0\u00a0 output.position = mul(input.position, worldMatrix);\r\n\u00a0\u00a0\u00a0 output.position = mul(output.position, viewMatrix);\r\n\u00a0\u00a0\u00a0 output.position = mul(output.position, projectionMatrix);\r\n\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0\u00a0 output.tex = input.tex;\r\n\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0 \u00a0return output;\r\n}\r\n\r\nfloat4 TexturePixelShader(PixelInputType input) : SV_Target\r\n{\r\n\u00a0\u00a0 \u00a0float4 textureColor;\r\n\r\n\u00a0\u00a0 \u00a0textureColor = shaderTexture.Sample(SampleType, input.tex);\r\n\r\n\u00a0\u00a0\u00a0 return textureColor;\r\n}\r\n\r\ntechnique10 TextureTechnique\r\n{\r\n\u00a0\u00a0\u00a0 pass pass0\r\n\u00a0\u00a0\u00a0 {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 SetVertexShader(CompileShader(vs_4_0, TextureVertexShader()));\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 SetPixelShader(CompileShader(ps_4_0, TexturePixelShader()));\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 SetGeometryShader(NULL);\r\n\u00a0\u00a0\u00a0 }\r\n}\r\n<\/pre>\n<p><strong>R\u00e9sum\u00e9 : <\/strong><\/p>\n<p>Nous avons expliqu\u00e9es deux fa\u00e7on d&rsquo;afficher du rendu 2D avec DirectX.<\/p>\n<p><a href=\"https:\/\/anthropoya.cluster014.ovh.net\/blog-informatique\/wp-content\/uploads\/2015\/03\/texture1.png\"><img decoding=\"async\" loading=\"lazy\" class=\"alignnone  wp-image-1667\" src=\"https:\/\/anthropoya.cluster014.ovh.net\/blog-informatique\/wp-content\/uploads\/2015\/03\/texture1.png\" alt=\"texture\" width=\"475\" height=\"371\" srcset=\"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/wp-content\/uploads\/2015\/03\/texture1.png 816w, https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/wp-content\/uploads\/2015\/03\/texture1-300x234.png 300w, https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/wp-content\/uploads\/2015\/03\/texture1-624x487.png 624w\" sizes=\"(max-width: 475px) 100vw, 475px\" \/><\/a><\/p>\n<p>Nous nous servirons de cet affichage 2D pour impl\u00e9menter une UI (Interface Utilisateur).<\/p>\n<p><strong>R\u00e9f\u00e9rences :<\/strong><\/p>\n<p>&#8211; http:\/\/mscerts.programming4.us\/programming\/directx%2010%20game%20programming%20%20%20the%202d%20resurgence%20-%20sprites.aspx<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Intro : Dans cette cinqui\u00e8me partie, nous allons apprendre comment afficher une image 2D \u00e0 l&rsquo;\u00e9cran. Nous proposerons deux fa\u00e7on d&rsquo;impl\u00e9menter cet affichage. Pr\u00e9requis : Avoir suivi la cinqui\u00e8me partie de ce tutoriel. Quatri\u00e8me partie : Afficher une image 2D \u00e0 l&rsquo;\u00e9cran. Explications (1\u00e8re fa\u00e7on plus simple, sans utiliser de shader) : Voici le fichier [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[9],"tags":[],"_links":{"self":[{"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=\/wp\/v2\/posts\/1582"}],"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=1582"}],"version-history":[{"count":72,"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=\/wp\/v2\/posts\/1582\/revisions"}],"predecessor-version":[{"id":4609,"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=\/wp\/v2\/posts\/1582\/revisions\/4609"}],"wp:attachment":[{"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1582"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1582"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1582"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}