{"id":3108,"date":"2015-07-07T15:20:57","date_gmt":"2015-07-07T15:20:57","guid":{"rendered":"http:\/\/anthroponaute.fr\/blog-informatique\/?p=3108"},"modified":"2016-02-05T17:38:05","modified_gmt":"2016-02-05T17:38:05","slug":"une-classe-gestionnaire-de-shaders-pour-gerer-vos-fichiers-deffets-speciaux","status":"publish","type":"post","link":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/?p=3108","title":{"rendered":"Une classe ShaderTechnique pour repr\u00e9senter facilement vos effets shaders"},"content":{"rendered":"<p><a href=\"https:\/\/anthropoya.cluster014.ovh.net\/blog-informatique\/wp-content\/uploads\/2015\/07\/shader_tech1.png\"><img decoding=\"async\" loading=\"lazy\" class=\"alignnone  wp-image-4761\" src=\"https:\/\/anthropoya.cluster014.ovh.net\/blog-informatique\/wp-content\/uploads\/2015\/07\/shader_tech1.png\" alt=\"shader_tech\" width=\"532\" height=\"300\" srcset=\"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/wp-content\/uploads\/2015\/07\/shader_tech1.png 600w, https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/wp-content\/uploads\/2015\/07\/shader_tech1-300x169.png 300w\" sizes=\"(max-width: 532px) 100vw, 532px\" \/><\/a><\/p>\n<p>todo : changer en m_pLayoutDesc<\/p>\n<p>todo : enlever le prefixe des enums !<\/p>\n<p><strong>Intro :<\/strong><\/p>\n<p>Voici une classe qui vous aidera \u00e0 <strong>d\u00e9clarer<\/strong> et \u00e0 <strong>d\u00e9finir<\/strong> vos fichiers shaders facilement.<\/p>\n<p>Cette classe gestionnaire vous permettra de d\u00e9finir les variables shaders utilis\u00e9es et m\u00eame de param\u00e9trer <strong>automatiquement<\/strong> certaines types de variables.<\/p>\n<p><strong>Explications :<br \/>\n<\/strong><\/p>\n<p>Voici le fichier ShaderTechnique.h :<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\n#ifndef SHADER_TECHNIQUE_H\r\n#define SHADER_TECHNIQUE_H\r\n\r\nenum ShaderVariableType\r\n{\r\n\u00a0\u00a0\u00a0 WORLD,\r\n\u00a0\u00a0\u00a0 VIEW,\r\n\u00a0\u00a0\u00a0 PROJECTION,\r\n\u00a0\u00a0\u00a0 WVP,\r\n\u00a0\u00a0\u00a0 WORLD_INVERSE,\r\n\u00a0\u00a0\u00a0 WORLD_INVERSE_TRANSPOSE,\r\n\u00a0\u00a0\u00a0 LIGHT_POS,\r\n\u00a0\u00a0\u00a0 EYE_POS,\r\n\u00a0\u00a0\u00a0 TEXTURE_0,\r\n\u00a0\u00a0\u00a0 TEXTURE_1,\r\n\u00a0\u00a0\u00a0 TEXTURE_2,\r\n\u00a0\u00a0\u00a0 ANY\r\n};\r\n\r\nclass ShaderTechnique\u00a0\u00a0 \u00a0\r\n{\r\npublic:\r\n\u00a0\u00a0\u00a0 ShaderTechnique(const std::string&amp; sEffectFileName, const std::string&amp; sEffectTechniqueName,\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0VertexLayoutType layoutType = VertexLayoutType::PTN_VERTEX);\r\n\u00a0\u00a0\u00a0 virtual ~ShaderTechnique();\r\n\r\n\u00a0\u00a0\u00a0 virtual bool Initialize();\r\n\r\n\u00a0\u00a0\u00a0 ID3D10EffectTechnique* GetShaderTechnique();\r\n\r\n\u00a0\u00a0\u00a0 ID3D10InputLayout* GetVertexLayout();\r\n\u00a0\u00a0\u00a0 D3D10_INPUT_ELEMENT_DESC* GetLayout();\r\n\r\n\u00a0\u00a0\u00a0 void AddTexture(const std::string&amp; sTextureFileName);\r\n\r\n\u00a0\u00a0\u00a0 void RegisterMatrixVariable(std::string sVariableName,\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0ShaderVariableType variableType = ShaderVariableType::ANY);\r\n\r\n\u00a0\u00a0\u00a0 void RegisterVectorVariable(std::string sVariableName,\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0ShaderVariableType variableType = ShaderVariableType::ANY);\r\n\r\n\u00a0\u00a0\u00a0 void RegisterScalarVariable(std::string sVariableName,\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0ShaderVariableType variableType = ShaderVariableType::ANY);\r\n\r\n\u00a0\u00a0\u00a0 void RegisterVariable(std::string sVariableName,\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0ShaderVariableType variableType = ShaderVariableType::ANY);\r\n\r\n\u00a0\u00a0\u00a0 void RegisterTextureVariable(std::string sTextureName,\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0ShaderVariableType variableType = ShaderVariableType::ANY);\r\n\r\n\u00a0\u00a0\u00a0 void SetMatrix(const std::string&amp; sMatrixName, D3DXMATRIX* mat);\r\n\u00a0\u00a0\u00a0 void SetColor(const std::string&amp; sVectorName, D3DXCOLOR&amp; col);\r\n\u00a0\u00a0\u00a0 void SetVector(const std::string&amp; sVectorName, D3DXVECTOR3&amp; vec);\r\n\u00a0\u00a0\u00a0 void SetVector(const std::string&amp; sVectorName, D3DXVECTOR2&amp; vec);\r\n\u00a0\u00a0\u00a0 void SetScalar(const std::string&amp; sScalarName, float fValue);\r\n\u00a0\u00a0\u00a0 void SetVariable(const std::string&amp; sVariableName, void* pValue, unsigned int iSizeInBytes);\r\n\r\n\u00a0\u00a0\u00a0 void SetTexture(const std::string&amp; sTextureName, const std::string&amp; sTextureAlias);\r\n\u00a0\u00a0\u00a0 void SetTexture(const std::string&amp; sTextureName, unsigned int iSlot);\r\n\u00a0\u00a0\u00a0 void SetTextureRV(const std::string&amp; sTextureName, ID3D10ShaderResourceView* pTextureRV);\r\n\r\n\u00a0\u00a0\u00a0 std::string GetShaderVariableName(ShaderVariableType variableType);\r\n\r\n\u00a0\u00a0\u00a0 void SetAutoMatrix(ShaderVariableType variableType);\r\n\u00a0\u00a0\u00a0 void SetAutoVector(ShaderVariableType variableType);\r\n\r\n\u00a0\u00a0\u00a0 virtual void SetupShaderVariables() {}\r\n\u00a0\u00a0\u00a0 virtual void Update(float fTimeSinceLastFrame) {}\r\n\r\n\u00a0\u00a0\u00a0 void SetCurrentWorldMatrix(const D3DXMATRIX&amp; pWorldMatrix);\r\n\r\nprivate:\r\n\u00a0\u00a0\u00a0 ID3D10Effect* m_pEffect;\r\n\u00a0\u00a0\u00a0 ID3D10EffectTechnique* m_pTechnique;\r\n\r\n\u00a0\u00a0\u00a0 D3D10_INPUT_ELEMENT_DESC* m_layout;\r\n\r\n\u00a0\u00a0\u00a0 ID3D10InputLayout* m_pVertexLayout;\r\n\r\n\u00a0\u00a0\u00a0 std::map&lt;std::string, ID3D10EffectMatrixVariable*&gt; m_matrixVariables;\r\n\u00a0\u00a0\u00a0 std::map&lt;std::string, ID3D10EffectVectorVariable*&gt; m_vectorVariables;\r\n\u00a0\u00a0\u00a0 std::map&lt;std::string, ID3D10EffectScalarVariable*&gt; m_scalarVariables;\r\n\r\n\u00a0\u00a0\u00a0 \/\/ On peut se servir de variables g\u00e9n\u00e9riques afin de passer des structures\r\n\u00a0\u00a0\u00a0 \/\/ au programme shader\r\n\u00a0\u00a0\u00a0 std::map&lt;std::string, ID3D10EffectVariable*&gt; m_variables;\r\n\r\n\u00a0\u00a0\u00a0 std::map&lt;std::string, ID3D10EffectShaderResourceVariable*&gt; m_ressourceVariables;\r\n\r\n\u00a0\u00a0\u00a0 std::map&lt;std::string, unsigned int&gt; m_texturesAliasSlot;\r\n\r\n\u00a0\u00a0\u00a0 \/\/ Un tableau pour la gestion automatique des variables shader\r\n\u00a0\u00a0\u00a0 std::map&lt;ShaderVariableType, std::string&gt; m_variablesTypes;\r\n\r\n\u00a0\u00a0\u00a0 std::string m_sEffectFileName;\r\n\u00a0\u00a0\u00a0 std::string m_sEffectTechniqueName;\r\n\u00a0\u00a0\u00a0 VertexLayoutType m_layoutType;\r\n\r\n\u00a0\u00a0\u00a0 bool m_bInitDone;\r\n\r\n\u00a0\u00a0\u00a0 D3DXMATRIX m_pCurrentWorld;\r\n\u00a0\u00a0\u00a0 unsigned int m_iCurrentTextureSlot;\u00a0\u00a0 \u00a0\r\n\r\n\u00a0\u00a0\u00a0 static unsigned int m_iCurrentShaderTechnique;\r\n};\r\n\r\n#endif\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p>Voici le fichier ShaderTechnique.cpp :<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\n#include &quot;ShaderTechnique.h&quot;\r\n\r\nunsigned int ShaderTechnique::m_iCurrentShaderTechnique = 0;\r\n\r\nShaderTechnique::ShaderTechnique(const std::string&amp; sEffectFileName, const std::string&amp; sEffectTechniqueName, VertexLayoutType layoutType) :\r\nm_pEffect(nullptr),\r\nm_pTechnique(nullptr),\r\nm_pVertexLayout(nullptr),\r\nm_layout(nullptr),\r\nm_bInitDone(false),\r\nm_sEffectFileName(sEffectFileName),\r\nm_sEffectTechniqueName(sEffectTechniqueName),\r\nm_layoutType(layoutType),\r\nm_iCurrentTextureSlot(0)\r\n{\r\n\u00a0\u00a0 \u00a0D3DXMatrixIdentity(&amp;m_pCurrentWorld);\r\n\u00a0\u00a0 \u00a0m_iCurrentShaderTechnique++;\r\n}\r\n\r\nShaderTechnique::~ShaderTechnique()\r\n{\r\n\u00a0\u00a0 \u00a0SAFE_RELEASE(m_pEffect);\r\n\u00a0\u00a0 \u00a0SAFE_RELEASE(m_pVertexLayout);\r\n}\r\n\r\nbool ShaderTechnique::Initialize()\r\n{\r\n\u00a0\u00a0 \u00a0if (m_bInitDone)\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 \u00a0DWORD dwShaderFlags = D3D10_SHADER_ENABLE_STRICTNESS;\r\n\u00a0\r\n#if defined( DEBUG ) || defined( _DEBUG )\r\n\/\/ Permet d'afficher les \u00e9ventuelles erreurs de la compilation d'un shader\r\ndwShaderFlags |= D3D10_SHADER_DEBUG;\r\n#endif\r\n\r\n\u00a0\u00a0 \u00a0HRESULT hr;\r\n\u00a0\r\n\u00a0\u00a0 \u00a0ID3D10Blob* pBlob = nullptr;\r\n\u00a0\u00a0 \u00a0\/\/ Pour la cr\u00e9ation du shader, on le compile\r\n\u00a0\u00a0 \u00a0hr = D3DX10CreateEffectFromFileA(m_sEffectFileName.c_str(), nullptr, nullptr, &quot;fx_4_0&quot;, dwShaderFlags, 0, D3D10_RENDERER-&gt;GetDevice(), nullptr,\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 \u00a0nullptr, &amp;m_pEffect, &amp;pBlob, nullptr);\r\n\u00a0\r\n\u00a0\u00a0 \u00a0if (FAILED(hr))\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0if (pBlob)\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\/\/ Affiche l'erreur de compilation du shader\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0MessageBoxA(NULL, (PCSTR)pBlob-&gt;GetBufferPointer(), &quot;Erreur sur le fichier shader&quot;, MB_ICONHAND | MB_OK);\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0else\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0ShowMessageBoxDXError(hr);\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\u00a0\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0return false;\r\n\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0unsigned int iNumElements = 0;\r\n\r\n\u00a0\u00a0 \u00a0if (m_layoutType == PTN_VERTEX) \/\/ Position, texture, normal\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0m_layout = new D3D10_INPUT_ELEMENT_DESC[3];\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0memcpy(m_layout, layoutPTN, sizeof(D3D10_INPUT_ELEMENT_DESC) * 3);\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0iNumElements = sizeof( layoutPTN ) \/ sizeof( layoutPTN[0] );\r\n\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0else if (m_layoutType == PT_VERTEX)\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0m_layout = new D3D10_INPUT_ELEMENT_DESC[2];\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0memcpy(m_layout, layoutPT, sizeof(D3D10_INPUT_ELEMENT_DESC) * 2);\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0iNumElements = sizeof( layoutPT ) \/ sizeof( layoutPT[0] );\r\n\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0else if (m_layoutType == PN_VERTEX) \/\/ Position, Normal\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0m_layout = new D3D10_INPUT_ELEMENT_DESC[2];\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0memcpy(m_layout, layoutPN, sizeof(D3D10_INPUT_ELEMENT_DESC) * 2);\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0iNumElements = sizeof( layoutPN ) \/ sizeof( layoutPN[0] );\r\n\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0else if (m_layoutType == PC_VERTEX) \/\/ Position, couleur\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0m_layout = new D3D10_INPUT_ELEMENT_DESC[2];\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0memcpy(m_layout, layoutPC, sizeof(D3D10_INPUT_ELEMENT_DESC) * 2);\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0iNumElements = sizeof( layoutPC ) \/ sizeof( layoutPC[0] );\r\n\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0else if (m_layoutType == PTC_VERTEX) \/\/ Position, couleur\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0m_layout = new D3D10_INPUT_ELEMENT_DESC[3];\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0memcpy(m_layout, layoutPTC, sizeof(D3D10_INPUT_ELEMENT_DESC) * 3);\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0iNumElements = sizeof( layoutPTC ) \/ sizeof( layoutPTC[0] );\r\n\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0else if (m_layoutType == WATER_VERTEX)\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0m_layout = new D3D10_INPUT_ELEMENT_DESC[3];\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0memcpy(m_layout, layoutWater, sizeof(D3D10_INPUT_ELEMENT_DESC) * 3);\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0iNumElements = sizeof( layoutWater ) \/ sizeof( layoutWater[0] );\r\n\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0else\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0FastMessageBox(&quot;Erreur de type de layout !&quot;);\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0return false;\r\n\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0\/\/ On acquiert la technique du shader HLSL\r\n\u00a0\u00a0 \u00a0m_pTechnique = m_pEffect-&gt;GetTechniqueByName(m_sEffectTechniqueName.c_str());\r\n\r\n\u00a0\u00a0 \u00a0if (m_pTechnique == nullptr)\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0FastMessageBox(&quot;Erreur du nom de la technique pass\u00e9 en param\u00e8tre&quot;);\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0return false;\r\n\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0D3D10_PASS_DESC PassDesc;\r\n\u00a0\u00a0 \u00a0m_pTechnique-&gt;GetPassByIndex(0)-&gt;GetDesc(&amp;PassDesc);\r\n\r\n\u00a0\u00a0 \u00a0if (!m_pTechnique-&gt;IsValid())\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0std::string sErrorMsg = &quot;Erreur sur la technique du fichier shader : &quot; + m_sEffectFileName;\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0FastMessageBox(sErrorMsg.c_str());\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0return false;\r\n\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0hr = D3D10_RENDERER-&gt;GetDevice()-&gt;CreateInputLayout(m_layout, iNumElements, PassDesc.pIAInputSignature,\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 \u00a0PassDesc.IAInputSignatureSize, &amp;m_pVertexLayout);\r\n\r\n\u00a0\u00a0 \u00a0if (FAILED(hr))\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0ShowMessageBoxDXError(hr);\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0return false;\r\n\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0m_bInitDone = true;\r\n\r\n\u00a0\u00a0 \u00a0return true;\r\n}\r\n\r\nID3D10EffectTechnique* ShaderTechnique::GetShaderTechnique()\r\n{\r\n\u00a0\u00a0 \u00a0return m_pTechnique;\r\n}\r\n\r\nID3D10InputLayout* ShaderTechnique::GetVertexLayout()\r\n{\r\n\u00a0\u00a0 \u00a0return m_pVertexLayout;\r\n}\r\n\r\nD3D10_INPUT_ELEMENT_DESC* ShaderTechnique::GetLayout()\r\n{\r\n\u00a0\u00a0 \u00a0return m_layout;\r\n}\r\n\r\n\/\/ Ajoute une texture au gestionnaire de texture et fait correspondre\r\n\/\/ un slot \u00e0 cette classe\r\nvoid ShaderTechnique::AddTexture(const std::string&amp; sTextureFileName)\r\n{\r\n\u00a0\u00a0 \u00a0std::string sTextureAliasName = std::to_string(m_iCurrentShaderTechnique) + std::to_string(m_iCurrentTextureSlot++);\r\n\r\n\u00a0\u00a0 \u00a0m_texturesAliasSlot[sTextureAliasName] = m_iCurrentTextureSlot;\r\n\r\n\u00a0\u00a0 \u00a0TEXTURE_MANAGER-&gt;AddTexture(sTextureFileName, sTextureAliasName);\r\n}\r\n\r\nvoid ShaderTechnique::RegisterTextureVariable(std::string sTextureName, ShaderVariableType variableType)\r\n{\r\n\u00a0\u00a0 \u00a0ID3D10EffectShaderResourceVariable* pDiffuseVariable = nullptr;\r\n\r\n\u00a0\u00a0 \u00a0pDiffuseVariable = m_pEffect-&gt;GetVariableByName(sTextureName.c_str())-&gt;AsShaderResource();\r\n\r\n\u00a0\u00a0 \u00a0m_ressourceVariables[sTextureName] = pDiffuseVariable;\r\n}\r\n\r\nvoid ShaderTechnique::RegisterMatrixVariable(std::string sVariableName, ShaderVariableType variableType)\r\n{\r\n\u00a0\u00a0 \u00a0ID3D10EffectMatrixVariable* pMatrixVariable = nullptr;\r\n\r\n\u00a0\u00a0 \u00a0pMatrixVariable = m_pEffect-&gt;GetVariableByName(sVariableName.c_str())-&gt;AsMatrix();\r\n\r\n\u00a0\u00a0 \u00a0m_matrixVariables[sVariableName] = pMatrixVariable;\r\n\r\n\u00a0\u00a0 \u00a0m_variablesTypes[variableType] = sVariableName;\r\n}\r\n\r\nvoid ShaderTechnique::RegisterVectorVariable(std::string sVariableName, ShaderVariableType variableType)\r\n{\r\n\u00a0\u00a0 \u00a0ID3D10EffectVectorVariable* pVectorVariable = nullptr;\r\n\r\n\u00a0\u00a0 \u00a0pVectorVariable = m_pEffect-&gt;GetVariableByName(sVariableName.c_str())-&gt;AsVector();\r\n\r\n\u00a0\u00a0 \u00a0m_vectorVariables[sVariableName] = pVectorVariable;\r\n\r\n\u00a0\u00a0 \u00a0m_variablesTypes[variableType] = sVariableName;\r\n}\r\n\r\nvoid ShaderTechnique::RegisterScalarVariable(std::string sVariableName, ShaderVariableType variableType)\r\n{\r\n\u00a0\u00a0 \u00a0ID3D10EffectScalarVariable* pScalarVariable = nullptr;\r\n\r\n\u00a0\u00a0 \u00a0pScalarVariable = m_pEffect-&gt;GetVariableByName(sVariableName.c_str())-&gt;AsScalar();\r\n\r\n\u00a0\u00a0 \u00a0m_scalarVariables[sVariableName] = pScalarVariable;\r\n\r\n\u00a0\u00a0 \u00a0m_variablesTypes[variableType] = sVariableName;\r\n}\r\n\r\nvoid ShaderTechnique::RegisterVariable(std::string sVariableName, ShaderVariableType variableType)\r\n{\r\n\u00a0\u00a0 \u00a0ID3D10EffectVariable* pVariable = nullptr;\r\n\r\n\u00a0\u00a0 \u00a0pVariable = m_pEffect-&gt;GetVariableByName(sVariableName.c_str());\r\n\r\n\u00a0\u00a0 \u00a0m_variables[sVariableName] = pVariable;\r\n\r\n\u00a0\u00a0 \u00a0m_variablesTypes[variableType] = sVariableName;\r\n}\r\n\r\nvoid ShaderTechnique::SetMatrix(const std::string&amp; sMatrixName, D3DXMATRIX* mat)\r\n{\r\n\u00a0\u00a0 \u00a0if (m_matrixVariables.count(sMatrixName) &gt; 0)\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0m_matrixVariables[sMatrixName]-&gt;SetMatrix((float*)mat);\r\n\u00a0\u00a0 \u00a0}\r\n}\r\n\r\nvoid ShaderTechnique::SetColor(const std::string&amp; sVectorName, D3DXCOLOR&amp; col)\r\n{\r\n\u00a0\u00a0 \u00a0if (m_vectorVariables.count(sVectorName) &gt; 0)\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0m_vectorVariables[sVectorName]-&gt;SetFloatVector(col);\r\n\u00a0\u00a0 \u00a0}\r\n}\r\n\r\nvoid ShaderTechnique::SetVector(const std::string&amp; sVectorName, D3DXVECTOR3&amp; vec)\r\n{\r\n\u00a0\u00a0 \u00a0if (m_vectorVariables.count(sVectorName) &gt; 0)\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0m_vectorVariables[sVectorName]-&gt;SetFloatVector(vec);\r\n\u00a0\u00a0 \u00a0}\r\n}\r\n\r\nvoid ShaderTechnique::SetVector(const std::string&amp; sVectorName, D3DXVECTOR2&amp; vec)\r\n{\r\n\u00a0\u00a0 \u00a0if (m_vectorVariables.count(sVectorName) &gt; 0)\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0m_vectorVariables[sVectorName]-&gt;SetFloatVector(vec);\r\n\u00a0\u00a0 \u00a0}\r\n}\r\n\r\nvoid ShaderTechnique::SetScalar(const std::string&amp; sScalarName, float fValue)\r\n{\r\n\u00a0\u00a0 \u00a0if (m_scalarVariables.count(sScalarName) &gt; 0)\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0m_scalarVariables[sScalarName]-&gt;SetFloat(fValue);\r\n\u00a0\u00a0 \u00a0}\r\n}\r\n\r\nvoid ShaderTechnique::SetVariable(const std::string&amp; sVariableName, void* pValue, unsigned int iSizeInBytes)\r\n{\r\n\u00a0\u00a0 \u00a0if (m_variables.count(sVariableName) &gt; 0)\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0m_variables[sVariableName]-&gt;SetRawValue(pValue, 0, iSizeInBytes);\r\n\u00a0\u00a0 \u00a0}\r\n}\r\n\r\nvoid ShaderTechnique::SetTexture(const std::string&amp; sTextureName, unsigned int iSlot)\r\n{\r\n\u00a0\u00a0 \u00a0std::string sTextureAliasName = std::to_string(m_iCurrentShaderTechnique) + std::to_string(iSlot);\r\n\r\n\u00a0\u00a0 \u00a0if (m_texturesAliasSlot.count(sTextureAliasName) &gt; 0)\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0ID3D10ShaderResourceView* pTextureRV = TEXTURE_MANAGER-&gt;GetTexture(sTextureAliasName);\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0if (pTextureRV != nullptr)\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0m_ressourceVariables[sTextureName]-&gt;SetResource(pTextureRV);\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0}\r\n}\r\n\r\nvoid ShaderTechnique::SetTexture(const std::string&amp; sTextureName, const std::string&amp; sTextureAlias)\r\n{\r\n\u00a0\u00a0 \u00a0if (TEXTURE_MANAGER-&gt;HasTexture(sTextureAlias))\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0ID3D10ShaderResourceView* pTextureRV = TEXTURE_MANAGER-&gt;GetTexture(sTextureAlias);\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0if (pTextureRV != nullptr)\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0m_ressourceVariables[sTextureName]-&gt;SetResource(pTextureRV);\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0}\r\n}\r\n\r\nvoid ShaderTechnique::SetTextureRV(const std::string&amp; sTextureName, ID3D10ShaderResourceView* pTextureRV)\r\n{\r\n\u00a0\u00a0 \u00a0if (m_ressourceVariables.count(sTextureName) &gt; 0)\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0m_ressourceVariables[sTextureName]-&gt;SetResource(pTextureRV);\r\n\u00a0\u00a0 \u00a0}\r\n}\r\n\r\nstd::string ShaderTechnique::GetShaderVariableName(ShaderVariableType variableType)\r\n{\r\n\u00a0\u00a0 \u00a0if (m_variablesTypes.count(variableType))\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0return m_variablesTypes[variableType];\r\n\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0else\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0return UNKNOWN;\r\n\u00a0\u00a0 \u00a0}\r\n}\r\n\r\nvoid ShaderTechnique::SetCurrentWorldMatrix(const D3DXMATRIX&amp; pWorldMatrix)\r\n{\r\n\u00a0\u00a0 \u00a0m_pCurrentWorld = pWorldMatrix;\r\n}\r\n\r\nvoid ShaderTechnique::SetAutoMatrix(ShaderVariableType variableType)\r\n{\r\n\u00a0\u00a0 \u00a0std::string sVariableName = GetShaderVariableName(variableType);\r\n\r\n\u00a0\u00a0 \u00a0switch (variableType)\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0case ShaderVariableType::WORLD:\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0SetMatrix(sVariableName, &amp;m_pCurrentWorld);\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0break;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0case ShaderVariableType::VIEW:\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0SetMatrix(sVariableName, SCENE_MANAGER-&gt;GetActiveCamera()-&gt;GetViewMatrix());\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0break;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0case ShaderVariableType::PROJECTION:\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0SetMatrix(sVariableName, SCENE_MANAGER-&gt;GetActiveCamera()-&gt;GetProjectionMatrix());\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0break;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0case ShaderVariableType::WORLD_INVERSE:\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0D3DXMATRIX worldInverse;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0D3DXMatrixIdentity(&amp;m_pCurrentWorld);\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0D3DXMatrixInverse(&amp;worldInverse, nullptr, &amp;m_pCurrentWorld);\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0SetMatrix(sVariableName, &amp;worldInverse);\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0break;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0case ShaderVariableType::WORLD_INVERSE_TRANSPOSE:\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0D3DXMATRIX worldInverseTranspose;\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0D3DXMatrixTranspose(&amp;worldInverseTranspose, &amp;worldInverseTranspose);\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0D3DXMatrixInverse(&amp;worldInverseTranspose, nullptr, &amp;m_pCurrentWorld);\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0SetMatrix(sVariableName, &amp;worldInverseTranspose);\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0break;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0}\r\n}\r\n\r\nvoid ShaderTechnique::SetAutoVector(ShaderVariableType variableType)\r\n{\r\n\u00a0\u00a0 \u00a0std::string sVariableName = GetShaderVariableName(variableType);\r\n\r\n\u00a0\u00a0 \u00a0switch (variableType)\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0case ShaderVariableType::EYE_POS:\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0SetVector(sVariableName, SCENE_MANAGER-&gt;GetActiveCamera()-&gt;GetPosition());\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0break;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0case ShaderVariableType::LIGHT_POS:\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0static float r = 0.0f;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0r += 0.00008f;\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0D3DXVECTOR3 lightPos = D3D10_RENDERER-&gt;MatrixRotationAxis(D3DXVECTOR3(0.0f, 1.0f, 0.0f), D3DXVECTOR3(0.0f, 0.0f, -5.0f), r);\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0SetVector(sVariableName, lightPos);\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0break;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0}\r\n}\r\n\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p><strong>R\u00e9sum\u00e9 :<\/strong><\/p>\n<p>Cette classe vous permettra de param\u00e9trer vos fichiers shaders facilement.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>todo : changer en m_pLayoutDesc todo : enlever le prefixe des enums ! Intro : Voici une classe qui vous aidera \u00e0 d\u00e9clarer et \u00e0 d\u00e9finir vos fichiers shaders facilement. Cette classe gestionnaire vous permettra de d\u00e9finir les variables shaders utilis\u00e9es et m\u00eame de param\u00e9trer automatiquement certaines types de variables. Explications : 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":[13],"tags":[],"_links":{"self":[{"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=\/wp\/v2\/posts\/3108"}],"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=3108"}],"version-history":[{"count":23,"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=\/wp\/v2\/posts\/3108\/revisions"}],"predecessor-version":[{"id":4762,"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=\/wp\/v2\/posts\/3108\/revisions\/4762"}],"wp:attachment":[{"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=3108"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=3108"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=3108"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}