{"id":3154,"date":"2015-07-12T19:56:15","date_gmt":"2015-07-12T19:56:15","guid":{"rendered":"http:\/\/anthroponaute.fr\/blog-informatique\/?p=3154"},"modified":"2016-06-28T13:35:16","modified_gmt":"2016-06-28T13:35:16","slug":"une-classe-renderable-pour-afficher-vos-contenus-3d","status":"publish","type":"post","link":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/?p=3154","title":{"rendered":"Une classe Renderable pour afficher vos contenus 3D"},"content":{"rendered":"<p><a href=\"https:\/\/anthropoya.cluster014.ovh.net\/blog-informatique\/wp-content\/uploads\/2015\/07\/test_remeshing.jpg\"><img decoding=\"async\" loading=\"lazy\" class=\"alignnone  wp-image-5094\" src=\"https:\/\/anthropoya.cluster014.ovh.net\/blog-informatique\/wp-content\/uploads\/2015\/07\/test_remeshing.jpg\" alt=\"test_remeshing\" width=\"261\" height=\"276\" srcset=\"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/wp-content\/uploads\/2015\/07\/test_remeshing.jpg 756w, https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/wp-content\/uploads\/2015\/07\/test_remeshing-284x300.jpg 284w, https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/wp-content\/uploads\/2015\/07\/test_remeshing-624x659.jpg 624w\" sizes=\"(max-width: 261px) 100vw, 261px\" \/><\/a><\/p>\n<p><strong>Intro :<\/strong><\/p>\n<p>Pour afficher rapidement du contenu 3D, <strong>il est laborieux<\/strong> de d\u00e9clarer \u00e0 chaque fois les vertex et index buffers, le shader associ\u00e9, le Vertex Input Layout, la m\u00e9thode d&rsquo;affichage, etc&#8230;<\/p>\n<p>Cette classe suivante vous permettra de <strong>restreindre ces difficult\u00e9s.<\/strong><\/p>\n<p><strong>Pr\u00e9requis : <\/strong><\/p>\n<p>&#8211; Savoir utiliser la classe ShaderTechnique. Voir cet article.<\/p>\n<p>&#8211; Savoir un peu utiliser DirectX 10.<\/p>\n<p><strong>Explications :<\/strong><\/p>\n<p>Voici le fichier Renderable.h :<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\n#ifndef RENDERABLE_H\r\n#define RENDERABLE_H\r\n\r\nclass ShaderTechnique;\r\n\r\nclass Renderable\r\n{\r\npublic:\r\n\u00a0\u00a0 \u00a0enum DrawMethod\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0DRAW_NORMAL,\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0DRAW_INDEXED\r\n\u00a0\u00a0 \u00a0};\r\n\r\n\u00a0\u00a0 \u00a0Renderable();\r\n\u00a0\u00a0 \u00a0virtual ~Renderable();\r\n\r\n\u00a0\u00a0 \u00a0virtual void Render(float fTimeSinceLastFrame);\r\n\r\n\u00a0\u00a0 \u00a0void SetShaderTechnique(ShaderTechnique* pShader);\r\n\u00a0\u00a0 \u00a0ShaderTechnique* GetShaderTechnique();\r\n\r\n\u00a0\u00a0 \u00a0void SetVertexType(VertexLayoutType vertexType);\r\n\u00a0\u00a0 \u00a0void SetDrawMethod(DrawMethod drawMethod);\r\n\u00a0\u00a0 \u00a0void SetTopology(D3D_PRIMITIVE_TOPOLOGY topology);\r\n\r\n\u00a0\u00a0 \u00a0void SetRenderableName(const std::string&amp; sName);\r\n\u00a0\u00a0 \u00a0std::string GetRenderableName();\r\n\r\nprotected:\r\n\u00a0\u00a0 \u00a0void SetVertexBuffer(ID3D10Buffer* pBuffer);\r\n\u00a0\u00a0 \u00a0void SetIndexBuffer(ID3D10Buffer* pBuffer);\r\n\r\n\u00a0\u00a0 \u00a0ID3D10Buffer* GetVertexBuffer();\r\n\u00a0\u00a0 \u00a0ID3D10Buffer* GetIndexBuffer();\r\n\r\nprotected:\r\n\u00a0\u00a0 \u00a0unsigned int m_iVerticesCount;\r\n\u00a0\u00a0 \u00a0unsigned int m_iIndicesCount;\r\n\r\n\u00a0\u00a0 \u00a0ID3D10Buffer* m_pVertexBuffer;\r\n\u00a0\u00a0 \u00a0ID3D10Buffer* m_pIndexBuffer;\r\n\r\nprivate:\r\n\u00a0\u00a0 \u00a0void Draw();\r\n\u00a0\u00a0 \u00a0void InitVertexBuffer();\r\n\u00a0\u00a0 \u00a0void InitIndexBuffer();\r\n\r\nprivate:\r\n\u00a0\u00a0 \u00a0VertexLayoutType m_vertexType;\r\n\u00a0\u00a0 \u00a0DrawMethod m_drawMethod;\r\n\u00a0\u00a0 \u00a0D3D_PRIMITIVE_TOPOLOGY m_topology;\r\n\r\n\u00a0\u00a0 \u00a0ShaderTechnique* m_pShader;\r\n\r\n\u00a0\u00a0 \u00a0std::string m_sName;\r\n};\r\n\r\n#endif\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p>Voici le fichier Renderale.cpp :<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\n#include &quot;Renderable.h&quot;\r\n\r\nRenderable::Renderable() :\r\nm_pShader(nullptr),\r\nm_vertexType(VertexLayoutType::PTN_VERTEX),\r\nm_drawMethod(DrawMethod::DRAW_NORMAL),\r\nm_topology(D3D_PRIMITIVE_TOPOLOGY::D3D10_PRIMITIVE_TOPOLOGY_TRIANGLELIST),\r\nm_iIndicesCount(0),\r\nm_iVerticesCount(0),\r\nm_pVertexBuffer(nullptr),\r\nm_pIndexBuffer(nullptr)\r\n{\r\n}\r\n\r\nRenderable::~Renderable()\r\n{\r\n\u00a0\u00a0 \u00a0SAFE_RELEASE(m_pIndexBuffer);\r\n\u00a0\u00a0 \u00a0SAFE_RELEASE(m_pVertexBuffer);\r\n}\r\n\r\nvoid Renderable::SetShaderTechnique(ShaderTechnique* pShader)\r\n{\r\n\u00a0\u00a0 \u00a0Assert(pShader);\r\n\r\n\u00a0\u00a0 \u00a0bool bSucess = pShader-&gt;Initialize();\r\n\r\n\u00a0\u00a0 \u00a0if (bSucess)\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0m_pShader = pShader;\r\n\u00a0\u00a0 \u00a0}\r\n}\r\n\r\nShaderTechnique* Renderable::GetShaderTechnique()\r\n{\r\n\u00a0\u00a0 \u00a0return m_pShader;\r\n}\r\n\r\nvoid Renderable::Render(float fTimeSinceLastFrame)\r\n{\r\n\u00a0\u00a0 \u00a0if (m_pShader == nullptr)\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0return;\r\n\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0D3D10_RENDERER-&gt;GetDevice()-&gt;IASetInputLayout(m_pShader-&gt;GetVertexLayout());\r\n\u00a0\u00a0 \u00a0D3D10_RENDERER-&gt;GetDevice()-&gt;IASetPrimitiveTopology(m_topology);\r\n\r\n\u00a0\u00a0 \u00a0InitIndexBuffer();\r\n\u00a0\u00a0 \u00a0InitVertexBuffer();\r\n\r\n\u00a0\u00a0 \u00a0m_pShader-&gt;Update(fTimeSinceLastFrame);\r\n\r\n\u00a0\u00a0 \u00a0D3D10_TECHNIQUE_DESC techDesc;\r\n\u00a0\u00a0 \u00a0ID3D10EffectTechnique* pTechnique = m_pShader-&gt;GetShaderTechnique();\r\n\r\n\u00a0\u00a0 \u00a0pTechnique-&gt;GetDesc(&amp;techDesc);\r\n\r\n\u00a0\u00a0 \u00a0for (unsigned int p = 0; p &lt; techDesc.Passes; p++)\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0pTechnique-&gt;GetPassByIndex(p)-&gt;Apply(0);\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0Draw();\r\n\u00a0\u00a0 \u00a0}\r\n}\r\n\r\nvoid Renderable::Draw()\r\n{\r\n\u00a0\u00a0 \u00a0if (m_drawMethod == DrawMethod::DRAW_NORMAL)\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0D3D10_RENDERER-&gt;GetDevice()-&gt;Draw(m_iVerticesCount, 0);\r\n\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0else if (m_drawMethod == DrawMethod::DRAW_INDEXED)\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0D3D10_RENDERER-&gt;GetDevice()-&gt;DrawIndexed(m_iIndicesCount, 0, 0);\r\n\u00a0\u00a0 \u00a0}\r\n}\r\n\r\nvoid Renderable::InitVertexBuffer()\r\n{\r\n\u00a0\u00a0 \u00a0if (m_pVertexBuffer)\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0UINT stride = D3D10_RENDERER-&gt;GetVertexBytesSize(m_vertexType);\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0UINT offset = 0;\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0D3D10_RENDERER-&gt;GetDevice()-&gt;IASetVertexBuffers(0, 1, &amp;m_pVertexBuffer, &amp;stride, &amp;offset);\r\n\u00a0\u00a0 \u00a0}\r\n}\r\n\r\nvoid Renderable::InitIndexBuffer()\r\n{\r\n\u00a0\u00a0 \u00a0if (m_pIndexBuffer)\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0D3D10_RENDERER-&gt;GetDevice()-&gt;IASetIndexBuffer(m_pIndexBuffer, DXGI_FORMAT_R16_UINT, 0);\r\n\u00a0\u00a0 \u00a0}\r\n}\r\n\r\nvoid Renderable::SetDrawMethod(DrawMethod drawMethod)\r\n{\r\n\u00a0\u00a0 \u00a0m_drawMethod = drawMethod;\r\n}\r\n\r\nvoid Renderable::SetTopology(D3D_PRIMITIVE_TOPOLOGY topology)\r\n{\r\n\u00a0\u00a0 \u00a0m_topology = topology;\r\n}\r\n\r\nvoid Renderable::SetVertexType(VertexLayoutType vertexType)\r\n{\r\n\u00a0\u00a0 \u00a0m_vertexType = vertexType;\r\n}\r\n\r\nvoid Renderable::SetRenderableName(const std::string&amp; sName)\r\n{\r\n\u00a0\u00a0 \u00a0m_sName = sName;\r\n}\r\n\r\nstd::string Renderable::GetRenderableName()\r\n{\r\n\u00a0\u00a0 \u00a0return m_sName;\r\n}\r\n\r\nvoid Renderable::SetVertexBuffer(ID3D10Buffer* pBuffer)\r\n{\r\n\u00a0\u00a0 \u00a0m_pVertexBuffer = pBuffer;\r\n}\r\n\r\nvoid Renderable::SetIndexBuffer(ID3D10Buffer* pBuffer)\r\n{\r\n\u00a0\u00a0 \u00a0m_pIndexBuffer = pBuffer;\r\n}\r\n\r\nID3D10Buffer* Renderable::GetVertexBuffer()\r\n{\r\n\u00a0\u00a0 \u00a0return m_pVertexBuffer;\r\n}\r\n\r\nID3D10Buffer* Renderable::GetIndexBuffer()\r\n{\r\n\u00a0\u00a0 \u00a0return m_pIndexBuffer;\r\n}\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p><strong>R\u00e9sum\u00e9 :<\/strong><\/p>\n<p>Cette classe pourra servir \u00e0 \u00eatre d\u00e9riv\u00e9e pour afficher vos contenus 3D : image, quad de post-effect, rendu 3D, etc..<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Intro : Pour afficher rapidement du contenu 3D, il est laborieux de d\u00e9clarer \u00e0 chaque fois les vertex et index buffers, le shader associ\u00e9, le Vertex Input Layout, la m\u00e9thode d&rsquo;affichage, etc&#8230; Cette classe suivante vous permettra de restreindre ces difficult\u00e9s. Pr\u00e9requis : &#8211; Savoir utiliser la classe ShaderTechnique. Voir cet article. &#8211; Savoir un [&hellip;]<\/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\/3154"}],"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=3154"}],"version-history":[{"count":12,"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=\/wp\/v2\/posts\/3154\/revisions"}],"predecessor-version":[{"id":5095,"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=\/wp\/v2\/posts\/3154\/revisions\/5095"}],"wp:attachment":[{"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=3154"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=3154"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=3154"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}