{"id":4734,"date":"2016-02-05T11:02:31","date_gmt":"2016-02-05T11:02:31","guid":{"rendered":"http:\/\/anthroponaute.fr\/blog-informatique\/?p=4734"},"modified":"2016-07-27T15:17:11","modified_gmt":"2016-07-27T15:17:11","slug":"utilisation-du-texturearray","status":"publish","type":"post","link":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/?p=4734","title":{"rendered":"Utilisation du type TextureArray"},"content":{"rendered":"<p><a href=\"https:\/\/anthropoya.cluster014.ovh.net\/blog-informatique\/wp-content\/uploads\/2016\/02\/TextureArray2.jpg\"><img decoding=\"async\" loading=\"lazy\" class=\"alignnone size-full wp-image-4736\" src=\"https:\/\/anthropoya.cluster014.ovh.net\/blog-informatique\/wp-content\/uploads\/2016\/02\/TextureArray2.jpg\" alt=\"TextureArray\" width=\"500\" height=\"380\" srcset=\"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/wp-content\/uploads\/2016\/02\/TextureArray2.jpg 500w, https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/wp-content\/uploads\/2016\/02\/TextureArray2-300x228.jpg 300w\" sizes=\"(max-width: 500px) 100vw, 500px\" \/><\/a><\/p>\n<p><strong>Intro :<\/strong><\/p>\n<p>Souvent \u00e0 <strong>l&rsquo;\u00e9tape pixel shader<\/strong>, on a besoin d&rsquo;acc\u00e9der \u00e0 plusieurs textures en m\u00eame temps.<\/p>\n<p><strong>Pr\u00e9requis :<\/strong><\/p>\n<p>&#8211; Savoir lire du <em>C++<br \/>\n<\/em><br \/>\n&#8211; Savoir initialiser <em>DirectX<\/em><\/p>\n<p><strong>Explications :<\/strong><\/p>\n<p>Voici une fonction qui cr\u00e9\u00e9 un objet<strong> Texture2D<\/strong> :<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\nID3D10Texture2D* CreateTexture(const std::string&amp; sImageFileName)\r\n{\r\n\u00a0\u00a0 \u00a0ID3D10Texture2D* pLoadedTexture = nullptr;\r\n\r\n\u00a0\u00a0 \u00a0D3DX10_IMAGE_LOAD_INFO loadinfo;\r\n\u00a0\u00a0 \u00a0ZeroMemory(&amp;loadinfo, sizeof(D3DX10_IMAGE_LOAD_INFO));\r\n\r\n\u00a0\u00a0 \u00a0loadinfo.Width = D3DX10_FROM_FILE;\r\n\u00a0\u00a0 \u00a0loadinfo.Height = D3DX10_FROM_FILE;\r\n\u00a0\u00a0 \u00a0loadinfo.Depth = D3DX10_FROM_FILE;\r\n\r\n\u00a0\u00a0 \u00a0loadinfo.FirstMipLevel = 0;\r\n\u00a0\u00a0 \u00a0loadinfo.MipLevels = D3DX10_FROM_FILE;\r\n\u00a0\u00a0 \u00a0loadinfo.Usage = D3D10_USAGE_STAGING;\r\n\r\n\u00a0\u00a0 \u00a0loadinfo.BindFlags = 0;\r\n\u00a0\u00a0 \u00a0loadinfo.CpuAccessFlags = D3D10_CPU_ACCESS_READ | D3D10_CPU_ACCESS_WRITE;\r\n\u00a0\u00a0 \u00a0loadinfo.MiscFlags = 0;\r\n\r\n\u00a0\u00a0 \u00a0loadinfo.Format = DXGI_FORMAT_R8G8B8A8_UNORM;\r\n\u00a0\u00a0 \u00a0loadinfo.Filter = D3DX10_FILTER_NONE;\r\n\u00a0\u00a0 \u00a0loadinfo.MipFilter = D3DX10_FILTER_NONE;\r\n\u00a0\u00a0 \u00a0loadinfo.pSrcInfo = 0;\r\n\r\n\u00a0\u00a0 \u00a0D3DX10CreateTextureFromFileA(D3D10_RENDERER-&gt;GetDevice(),\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0sImageFileName.c_str(), &amp;loadinfo, 0, (ID3D10Resource**)&amp;pLoadedTexture, 0);\r\n\r\n\u00a0\u00a0 \u00a0return pLoadedTexture;\r\n}\r\n<\/pre>\n<p><strong><br \/>\n<\/strong>Voici une fonction qui cr\u00e9\u00e9 un objet Texture2D <strong>assembl\u00e9 et combin\u00e9 <\/strong>de plusieurs Texture2D :<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\n\r\nID3D10Texture2D* CreateTextureArray(std::vector&lt;ID3D10Texture2D*&gt;&amp; textures)\r\n{\r\n\u00a0\u00a0 \u00a0if (textures.size() == 0)\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0return nullptr;\r\n\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0ID3D10Texture2D* pTexturesArray = nullptr;\r\n\r\n\u00a0\u00a0 \u00a0D3D10_TEXTURE2D_DESC textElementDesc;\r\n\u00a0\u00a0 \u00a0ZeroMemory(&amp;textElementDesc, sizeof(D3D10_TEXTURE2D_DESC));\r\n\r\n\u00a0\u00a0 \u00a0textures[0]-&gt;GetDesc(&amp;textElementDesc);\r\n\r\n\u00a0\u00a0 \u00a0D3D10_TEXTURE2D_DESC textArrayDesc;\r\n\r\n\u00a0\u00a0 \u00a0textArrayDesc.Width = textElementDesc.Width;\r\n\u00a0\u00a0 \u00a0textArrayDesc.Height = textElementDesc.Height;\r\n\u00a0\u00a0 \u00a0textArrayDesc.MipLevels = textElementDesc.MipLevels;\r\n\u00a0\u00a0 \u00a0textArrayDesc.ArraySize = textures.size();\r\n\u00a0\u00a0 \u00a0textArrayDesc.Format = textElementDesc.Format;\r\n\u00a0\u00a0 \u00a0textArrayDesc.SampleDesc.Count = 1;\r\n\u00a0\u00a0 \u00a0textArrayDesc.SampleDesc.Quality = 0;\r\n\u00a0\u00a0 \u00a0textArrayDesc.Usage = D3D10_USAGE_DEFAULT;\r\n\u00a0\u00a0 \u00a0textArrayDesc.BindFlags = D3D10_BIND_SHADER_RESOURCE;\r\n\u00a0\u00a0 \u00a0textArrayDesc.CPUAccessFlags = 0;\r\n\u00a0\u00a0 \u00a0textArrayDesc.MiscFlags = 0;\r\n\r\n\u00a0\u00a0 \u00a0D3D10_RENDERER-&gt;GetDevice()-&gt;CreateTexture2D(&amp;textArrayDesc, 0, &amp;pTexturesArray);\r\n\r\n\u00a0\u00a0 \u00a0\/\/ On copie toutes les textures dans le tableau !\r\n\u00a0\u00a0 \u00a0for (uint16 i = 0; i &lt; textures.size(); i++)\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0for (uint16 j = 0; j &lt; textElementDesc.MipLevels; j++)\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0D3D10_MAPPED_TEXTURE2D mappedTex2D;\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0ID3D10Texture2D* pCurrentTexture = textures[i];\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0pCurrentTexture-&gt;Map(j, D3D10_MAP_READ, 0, &amp;mappedTex2D);\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0uint32 c = D3D10CalcSubresource(j, i, textElementDesc.MipLevels);\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0D3D10_RENDERER-&gt;GetDevice()-&gt;UpdateSubresource(pTexturesArray, c,\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a00, mappedTex2D.pData, mappedTex2D.RowPitch, 0);\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0pCurrentTexture-&gt;Unmap(j);\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0return pTexturesArray;\r\n}\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p>Voici la fonction qui cr\u00e9\u00e9e <strong>une texture ressource shader<\/strong> pour le programme HLSL :<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\n\r\nID3D10ShaderResourceView* FontTextManager::GetTextureRVArray(ID3D10Texture2D* pTexArray)\r\n{\r\n\u00a0\u00a0 \u00a0if (pTexArray == nullptr)\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0return nullptr;\r\n\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0ID3D10ShaderResourceView* pArrayRV = nullptr;\r\n\r\n\u00a0\u00a0 \u00a0D3D10_SHADER_RESOURCE_VIEW_DESC viewDesc;\r\n\u00a0\u00a0 \u00a0ZeroMemory(&amp;viewDesc, sizeof(D3D10_SHADER_RESOURCE_VIEW_DESC));\r\n\r\n\u00a0\u00a0 \u00a0D3D10_TEXTURE2D_DESC textArrayDesc;\r\n\u00a0\u00a0 \u00a0pTexArray-&gt;GetDesc(&amp;textArrayDesc);\r\n\r\n\u00a0\u00a0 \u00a0viewDesc.Format = textArrayDesc.Format;\r\n\u00a0\u00a0 \u00a0viewDesc.ViewDimension = D3D10_SRV_DIMENSION_TEXTURE2DARRAY;\r\n\u00a0\u00a0 \u00a0viewDesc.Texture1DArray.MostDetailedMip = 0;\r\n\u00a0\u00a0 \u00a0viewDesc.Texture1DArray.MipLevels = textArrayDesc.MipLevels;\r\n\u00a0\u00a0 \u00a0viewDesc.Texture1DArray.FirstArraySlice = 0;\r\n\u00a0\u00a0 \u00a0viewDesc.Texture1DArray.ArraySize = textArrayDesc.ArraySize;\r\n\r\n\u00a0\u00a0 \u00a0D3D10_RENDERER-&gt;GetDevice()-&gt;CreateShaderResourceView(pTexArray, &amp;viewDesc, &amp;pArrayRV);\r\n\r\n\u00a0\u00a0 \u00a0return pArrayRV;\r\n}\r\n\r\n<\/pre>\n<p>&nbsp;<\/p>\n<h4><span style=\"text-decoration: underline;\">Utilisation :\u00a0<\/span><\/h4>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\nstd::vector&lt;ID3D10Texture2D*&gt; textures;\r\n\r\ntextures.push_back( CreateTexture(&quot;UneImage.png&quot;) ) ;\r\ntextures.push_back( CreateTexture(&quot;UneAutreImage.png&quot;) ) ;\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\u00a0\u00a0\u00a0 \u00a0\r\nID3D10Texture2D* pTextureArray = CreateTextureArray(textures);\r\n\r\n\/\/ On lib\u00e8re la m\u00e9moire\r\nfor (uint32 i = 0; i &lt; textures.size(); i++)\r\n{\r\n\u00a0\u00a0 \u00a0ID3D10Texture2D* pCurrentTexture = textures[i];\r\n\u00a0\u00a0 \u00a0SAFE_RELEASE(pCurrentTexture);\r\n}\r\n\r\n\/\/ Cette ressource est pr\u00eate \u00e0 \u00eatre utilis\u00e9e par un programme HLSL\r\nID3D10ShaderResourceView* pRVArray = GetTextureRVArray(pTextureArray);\r\n\r\nSAFE_RELEASE(pTextureArray);\r\n\r\n<\/pre>\n<h4><\/h4>\n<p><strong>R\u00e9sum\u00e9 : <\/strong><\/p>\n<p>Nous avons pr\u00e9sent\u00e9 une fa\u00e7on d&rsquo;acc\u00e9der \u00e0 une variable repr\u00e9sentant un tableau de textures directement dans le shader !<\/p>\n<p><strong>R\u00e9f\u00e9rences :<\/strong><\/p>\n<p>&#8211; Franck D.Luna &#8211; DirectX 10<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Intro : Souvent \u00e0 l&rsquo;\u00e9tape pixel shader, on a besoin d&rsquo;acc\u00e9der \u00e0 plusieurs textures en m\u00eame temps. Pr\u00e9requis : &#8211; Savoir lire du C++ &#8211; Savoir initialiser DirectX Explications : Voici une fonction qui cr\u00e9\u00e9 un objet Texture2D : Voici une fonction qui cr\u00e9\u00e9 un objet Texture2D assembl\u00e9 et combin\u00e9 de plusieurs Texture2D : &nbsp; [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[13],"tags":[],"_links":{"self":[{"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=\/wp\/v2\/posts\/4734"}],"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=4734"}],"version-history":[{"count":15,"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=\/wp\/v2\/posts\/4734\/revisions"}],"predecessor-version":[{"id":5203,"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=\/wp\/v2\/posts\/4734\/revisions\/5203"}],"wp:attachment":[{"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=4734"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=4734"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=4734"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}