{"id":1482,"date":"2015-03-09T17:03:17","date_gmt":"2015-03-09T17:03:17","guid":{"rendered":"http:\/\/anthroponaute.fr\/blog-informatique\/?p=1482"},"modified":"2015-06-01T14:09:11","modified_gmt":"2015-06-01T14:09:11","slug":"introduction-a-directx-10-lumiere-partie-4","status":"publish","type":"post","link":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/?p=1482","title":{"rendered":"Introduction \u00e0 DirectX 10 \u2013 Lumi\u00e8re \u2013 partie 4"},"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 quatri\u00e8me partie, nous allons apprendre \u00e0 int\u00e9grer une lumi\u00e8re afin d&rsquo;\u00e9clairer notre cube.<\/p>\n<p><strong>Pr\u00e9requis :<\/strong><\/p>\n<p>Avoir suivi la troisi\u00e8me partie de ce tutoriel.<\/p>\n<h2><strong>Quatri\u00e8me partie :<\/strong><\/h2>\n<p>Afficher un petit cube \u00e9clair\u00e9 d&rsquo;une lumi\u00e8re.<\/p>\n<p><strong>Explications :<\/strong><\/p>\n<p>Nous allons utiliser cette structure de vertex :<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\nstruct SimpleVertex\r\n{\r\n\u00a0\u00a0\u00a0 D3DXVECTOR3 Pos;\r\n\u00a0\u00a0\u00a0 D3DXVECTOR2 Tex;\r\n\u00a0\u00a0\u00a0 D3DXVECTOR3 Normal;\r\n};\r\n<\/pre>\n<p>Elle contient un attribut suppl\u00e9mentaire par rapport \u00e0 la partie 3 : la normale.<\/p>\n<p>La normale d&rsquo;un vertex est un vecteur perpendiculaire \u00e0 celui-ci ; nous l&rsquo;utiliserons afin de calculer le degr\u00e9 de nuance de lumi\u00e8re \u00e0 cet endroit.<br \/>\nC&rsquo;est par ce principe que nous effectuerons globalement le calcul lumineux.<\/p>\n<p>Voir cet article pour comprendre comment mod\u00e9liser la lumi\u00e8re dans un rendu 3D.<\/p>\n<p>&nbsp;<\/p>\n<hr \/>\n<p>&nbsp;<\/p>\n<p>Nous allons utiliser ce programme HLSL &#8211; partie4.fx :<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\n\/\/--------------------------------------------------------------------------------------\r\n\/\/ Constant Buffer Variables\r\n\/\/--------------------------------------------------------------------------------------\r\nmatrix World;\r\nmatrix View;\r\nmatrix Projection;\r\nfloat4 vLightDir;\r\nTexture2D txDiffuse;\r\n\r\nSamplerState samLinear\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\n\/\/--------------------------------------------------------------------------------------\r\nstruct VS_INPUT\r\n{\r\n\u00a0\u00a0\u00a0 float4 Pos : POSITION;\r\n\u00a0\u00a0\u00a0 float2 Tex : TEXCOORD;\r\n\u00a0\u00a0\u00a0 float3 Norm : NORMAL;\r\n};\r\n\r\nstruct PS_INPUT\r\n{\r\n\u00a0\u00a0\u00a0 float4 Pos : SV_POSITION;\r\n\u00a0\u00a0\u00a0 float2 Tex : TEXCOORD0;\r\n\u00a0\u00a0\u00a0 float3 Norm : TEXCOORD1;\r\n};\r\n\r\n\/\/--------------------------------------------------------------------------------------\r\n\/\/ Vertex Shader\r\n\/\/--------------------------------------------------------------------------------------\r\nPS_INPUT VS( VS_INPUT input )\r\n{\r\n\u00a0\u00a0\u00a0 PS_INPUT output = (PS_INPUT)0;\r\n\u00a0\u00a0\u00a0 output.Pos = mul( input.Pos, World );\r\n\u00a0\u00a0\u00a0 output.Pos = mul( output.Pos, View );\r\n\u00a0\u00a0\u00a0 output.Pos = mul( output.Pos, Projection );\r\n\u00a0\u00a0\u00a0 output.Norm = mul( input.Norm, World );\r\n\u00a0\u00a0\u00a0 output.Tex = input.Tex;\r\n\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0\u00a0 return output;\r\n}\r\n\r\n\/\/--------------------------------------------------------------------------------------\r\n\/\/ Pixel Shader\r\n\/\/--------------------------------------------------------------------------------------\r\nfloat4 PS( PS_INPUT input) : SV_Target\r\n{\r\n\u00a0\u00a0 \u00a0float4 finalColor = (saturate( dot( (float3)vLightDir, input.Norm) )\r\n\u00a0\u00a0 \u00a0* txDiffuse.Sample( samLinear, input.Tex ));\r\n\u00a0\u00a0\u00a0 finalColor.a = 1;\r\n\u00a0\u00a0\u00a0 return finalColor;\r\n}\r\n\r\n\/\/--------------------------------------------------------------------------------------\r\ntechnique10 Render\r\n{\r\n\u00a0\u00a0\u00a0 pass P0\r\n\u00a0\u00a0\u00a0 {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 SetVertexShader( CompileShader( vs_4_0, VS() ) );\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 SetGeometryShader( NULL );\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 SetPixelShader( CompileShader( ps_4_0, PS() ) );\r\n\u00a0\u00a0\u00a0 }\r\n}\r\n\r\n<\/pre>\n<p>Si vous ne comprenez rien \u00e0 ce programme : consulter cet article.<\/p>\n<p>Il faut aussi conna\u00eetre la notion de matrices et le principe de transformations de coordonn\u00e9es<br \/>\npour comprendre ce code : voir cet article.<\/p>\n<p>&nbsp;<\/p>\n<p>Dans votre fichier D3D10Renderer.h, rajoutez :<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\n\/\/ Variables matrices en cours\r\nID3D10EffectMatrixVariable* m_pWorldVariable;\r\nID3D10EffectMatrixVariable* m_pViewVariable;\r\nID3D10EffectMatrixVariable* m_pProjectionVariable;\r\n\r\nID3D10EffectVectorVariable* m_pLightDirVariable;\r\nID3D10EffectVectorVariable* m_pLightColorVariable; \r\n\r\n\/\/ Variable texture en cours\r\nID3D10EffectShaderResourceVariable* m_pDiffuseVariable;\r\n<\/pre>\n<p>Ce sont les variables que l&rsquo;on enverra au shader HLSL.<\/p>\n<p>&nbsp;<\/p>\n<p>Ensuite dans votre fichier D3D10Renderer.cpp \u00e0 la fonction Initialize(bool bFullScreen), rajoutez :<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\n\/******************** Partie 2 &amp; 3 &amp; 4 ********************\/\r\n\r\nDWORD dwShaderFlags = D3D10_SHADER_ENABLE_STRICTNESS;\r\n\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\/\/ Pour la cr\u00e9ation du shader, on le compile\r\nhr = D3DX10CreateEffectFromFile(L&quot;Partie4.fx&quot;, NULL, NULL, &quot;fx_4_0&quot;, dwShaderFlags, 0, m_pd3dDevice, NULL,\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 \u00a0NULL, &amp;m_pEffect, NULL, NULL);\r\nif (FAILED(hr))\r\n\u00a0\u00a0 \u00a0return false;\r\n\r\n\/\/ On acquiert la technique du shader HLSL\r\nm_pTechnique = m_pEffect-&gt;GetTechniqueByName(&quot;Render&quot;);\r\n\r\n\/\/ On acquiert les variables du shader HLSL\r\n\/\/ cela permettra de faire le lien avec l'application et le programme shader HLSL\r\nm_pWorldVariable = m_pEffect-&gt;GetVariableByName(&quot;World&quot;)-&gt;AsMatrix();\r\nm_pViewVariable = m_pEffect-&gt;GetVariableByName(&quot;View&quot;)-&gt;AsMatrix();\r\nm_pProjectionVariable = m_pEffect-&gt;GetVariableByName(&quot;Projection&quot;)-&gt;AsMatrix();\r\nm_pLightDirVariable = m_pEffect-&gt;GetVariableByName( &quot;vLightDir&quot; )-&gt;AsVector();\r\nm_pDiffuseVariable = m_pEffect-&gt;GetVariableByName(&quot;txDiffuse&quot;)-&gt;AsShaderResource();\r\n\r\n\/******************\/ \r\n\r\n\/\/ On d\u00e9finit la structure d'un vertex, ici 3 attributs sont d\u00e9clar\u00e9s\r\nD3D10_INPUT_ELEMENT_DESC layout[] =\r\n{\r\n\u00a0\u00a0 \u00a0{ &quot;POSITION&quot;, 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D10_INPUT_PER_VERTEX_DATA, 0 },\r\n\u00a0\u00a0 \u00a0{ &quot;TEXCOORD&quot;, 0, DXGI_FORMAT_R32G32_FLOAT, 0, 12, D3D10_INPUT_PER_VERTEX_DATA, 0 },\r\n\u00a0\u00a0 \u00a0{ &quot;NORMAL&quot;, 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 20, D3D10_INPUT_PER_VERTEX_DATA, 0 },\r\n};\r\nUINT numElements = sizeof( layout ) \/ sizeof( layout[0] );\r\n\r\nD3D10_PASS_DESC PassDesc;\r\nm_pTechnique-&gt;GetPassByIndex(0)-&gt;GetDesc(&amp;PassDesc);\r\nhr = m_pd3dDevice-&gt;CreateInputLayout(layout, numElements, 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 \u00a0\u00a0\u00a0 \u00a0 PassDesc.IAInputSignatureSize, &amp;m_pVertexLayout);\r\nif (FAILED(hr))\r\n\u00a0\u00a0 \u00a0return false;\r\n\r\nm_pd3dDevice-&gt;IASetInputLayout(m_pVertexLayout);\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p>On cr\u00e9\u00e9 le vertex buffer d&rsquo;un cube : il est compos\u00e9 de la position, des coordon\u00e9es de la texture et des normales de chaque vertex.<\/p>\n<p>Les voici : <code class=\"cpp comments\"><\/code><\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\n\/\/ D\u00e9claration des vertices\r\nSimpleVertex vertices[] =\r\n{\r\n\u00a0\u00a0 \u00a0{ D3DXVECTOR3( -1.0f, 1.0f, -1.0f ), D3DXVECTOR2( 0.0f, 0.0f ), D3DXVECTOR3( 0.0f, 1.0f, 0.0f ) },\r\n\u00a0\u00a0 \u00a0{ D3DXVECTOR3( 1.0f, 1.0f, -1.0f ), D3DXVECTOR2( 1.0f, 0.0f ), D3DXVECTOR3( 0.0f, 1.0f, 0.0f ) },\r\n\u00a0\u00a0 \u00a0{ D3DXVECTOR3( 1.0f, 1.0f, 1.0f ), D3DXVECTOR2( 1.0f, 1.0f ), D3DXVECTOR3( 0.0f, 1.0f, 0.0f ) },\r\n\u00a0\u00a0 \u00a0{ D3DXVECTOR3( -1.0f, 1.0f, 1.0f ), D3DXVECTOR2( 0.0f, 1.0f ), D3DXVECTOR3( 0.0f, 1.0f, 0.0f ) },\r\n\r\n\u00a0\u00a0 \u00a0{ D3DXVECTOR3( -1.0f, -1.0f, -1.0f ), D3DXVECTOR2( 0.0f, 0.0f ), D3DXVECTOR3( 0.0f, -1.0f, 0.0f ) },\r\n\u00a0\u00a0 \u00a0{ D3DXVECTOR3( 1.0f, -1.0f, -1.0f ), D3DXVECTOR2( 1.0f, 0.0f ), D3DXVECTOR3( 0.0f, -1.0f, 0.0f ) },\r\n\u00a0\u00a0 \u00a0{ D3DXVECTOR3( 1.0f, -1.0f, 1.0f ), D3DXVECTOR2( 1.0f, 1.0f ),\u00a0 D3DXVECTOR3( 0.0f, -1.0f, 0.0f ) },\r\n\u00a0\u00a0 \u00a0{ D3DXVECTOR3( -1.0f, -1.0f, 1.0f ), D3DXVECTOR2( 0.0f, 1.0f ),\u00a0 D3DXVECTOR3( 0.0f, -1.0f, 0.0f ) },\r\n\r\n\u00a0\u00a0 \u00a0{ D3DXVECTOR3( -1.0f, -1.0f, 1.0f ), D3DXVECTOR2( 0.0f, 0.0f ),\u00a0 D3DXVECTOR3( -1.0f, 0.0f, 0.0f ) },\r\n\u00a0\u00a0 \u00a0{ D3DXVECTOR3( -1.0f, -1.0f, -1.0f ), D3DXVECTOR2( 1.0f, 0.0f ), D3DXVECTOR3( -1.0f, 0.0f, 0.0f ) },\r\n\u00a0\u00a0 \u00a0{ D3DXVECTOR3( -1.0f, 1.0f, -1.0f ), D3DXVECTOR2( 1.0f, 1.0f ),\u00a0 D3DXVECTOR3( -1.0f, 0.0f, 0.0f ) },\r\n\u00a0\u00a0 \u00a0{ D3DXVECTOR3( -1.0f, 1.0f, 1.0f ), D3DXVECTOR2( 0.0f, 1.0f ),\u00a0 D3DXVECTOR3( -1.0f, 0.0f, 0.0f ) },\r\n\r\n\u00a0\u00a0 \u00a0{ D3DXVECTOR3( 1.0f, -1.0f, 1.0f ), D3DXVECTOR2( 0.0f, 0.0f ), D3DXVECTOR3( 1.0f, 0.0f, 0.0f ) },\r\n\u00a0\u00a0 \u00a0{ D3DXVECTOR3( 1.0f, -1.0f, -1.0f ), D3DXVECTOR2( 1.0f, 0.0f ), D3DXVECTOR3( 1.0f, 0.0f, 0.0f ) },\r\n\u00a0\u00a0 \u00a0{ D3DXVECTOR3( 1.0f, 1.0f, -1.0f ), D3DXVECTOR2( 1.0f, 1.0f ), D3DXVECTOR3( 1.0f, 0.0f, 0.0f ) },\r\n\u00a0\u00a0 \u00a0{ D3DXVECTOR3( 1.0f, 1.0f, 1.0f ), D3DXVECTOR2( 0.0f, 1.0f ),\u00a0\u00a0 \u00a0D3DXVECTOR3( 1.0f, 0.0f, 0.0f ) },\r\n\r\n\u00a0\u00a0 \u00a0{ D3DXVECTOR3( -1.0f, -1.0f, -1.0f ), D3DXVECTOR2( 0.0f, 0.0f ), D3DXVECTOR3( 0.0f, 0.0f, -1.0f ) },\r\n\u00a0\u00a0 \u00a0{ D3DXVECTOR3( 1.0f, -1.0f, -1.0f ), D3DXVECTOR2( 1.0f, 0.0f ),\u00a0 D3DXVECTOR3( 0.0f, 0.0f, -1.0f ) },\r\n\u00a0\u00a0 \u00a0{ D3DXVECTOR3( 1.0f, 1.0f, -1.0f ), D3DXVECTOR2( 1.0f, 1.0f ),\u00a0 D3DXVECTOR3( 0.0f, 0.0f, -1.0f ) },\r\n\u00a0\u00a0 \u00a0{ D3DXVECTOR3( -1.0f, 1.0f, -1.0f ), D3DXVECTOR2( 0.0f, 1.0f ),\u00a0 D3DXVECTOR3( 0.0f, 0.0f, -1.0f ) },\r\n\r\n\u00a0\u00a0 \u00a0{ D3DXVECTOR3( -1.0f, -1.0f, 1.0f ), D3DXVECTOR2( 0.0f, 0.0f ), D3DXVECTOR3( 0.0f, 0.0f, 1.0f ) },\r\n\u00a0\u00a0 \u00a0{ D3DXVECTOR3( 1.0f, -1.0f, 1.0f ), D3DXVECTOR2( 1.0f, 0.0f ),\u00a0 D3DXVECTOR3( 0.0f, 0.0f, 1.0f ) },\r\n\u00a0\u00a0 \u00a0{ D3DXVECTOR3( 1.0f, 1.0f, 1.0f ), D3DXVECTOR2( 1.0f, 1.0f ),\u00a0\u00a0 \u00a0 D3DXVECTOR3( 0.0f, 0.0f, 1.0f ) },\r\n\u00a0\u00a0 \u00a0{ D3DXVECTOR3( -1.0f, 1.0f, 1.0f ), D3DXVECTOR2( 0.0f, 1.0f ),\u00a0 D3DXVECTOR3( 0.0f, 0.0f, 1.0f ) },\r\n};\r\n\/\/ D\u00e9claration des indices\r\nDWORD indices[] =\r\n{\r\n\u00a0\u00a0 \u00a03,1,0,\r\n\u00a0\u00a0 \u00a02,1,3,\r\n\r\n\u00a0\u00a0 \u00a06,4,5,\r\n\u00a0\u00a0 \u00a07,4,6,\r\n\r\n\u00a0\u00a0 \u00a011,9,8,\r\n\u00a0\u00a0 \u00a010,9,11,\r\n\r\n\u00a0\u00a0 \u00a014,12,13,\r\n\u00a0\u00a0 \u00a015,12,14,\r\n\r\n\u00a0\u00a0 \u00a019,17,16,\r\n\u00a0\u00a0 \u00a018,17,19,\r\n\r\n\u00a0\u00a0 \u00a022,20,21,\r\n\u00a0\u00a0 \u00a023,20,22\r\n};\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p>Toujours dans votre fichier D3D10Renderer.cpp \u00e0 la fonction Initialize(bool bFullScreen), rajoutez :<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\nD3DXMatrixIdentity(&amp;m_worldMatrix);\r\n\r\nD3DXVECTOR3 Eye(0.0f, 3.0f, -6.0f);\r\nD3DXVECTOR3 At(0.0f, 0.0f, 0.0f);\r\nD3DXVECTOR3 Up(0.0f, 1.0f, 0.0f);\r\n\r\nD3DXMatrixLookAtLH(&amp;m_viewMatrix, &amp;Eye, &amp;At, &amp;Up);\r\n\r\n\/\/ Initialize the projection matrix\r\nD3DXMatrixPerspectiveFovLH( &amp;m_projectionMatrix, ( float )D3DX_PI * 0.25f, width \/ ( FLOAT )height, 0.1f, 100.0f );\r\n\r\n\/\/ Update Variables that never change\r\nm_pViewVariable-&gt;SetMatrix( ( float* )&amp;m_viewMatrix );\r\nm_pProjectionVariable-&gt;SetMatrix( ( float* )&amp;m_projectionMatrix );\r\nm_pDiffuseVariable-&gt;SetResource( m_pTextureRV );\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p>Toujours dans votre fichier D3D10Renderer.cpp :<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\nvoid D3D10Renderer::Render()\r\n{\r\n    \/\/ Couleur du fond de rendu\r\n\u00a0\u00a0\u00a0 static float afClearColor[4] = {0.0f, 0.125f, 0.3f, 1.0f}; \r\n\r\n\u00a0\u00a0\u00a0 \/\/ Efface la surface de rendu\r\n\u00a0\u00a0\u00a0 m_pd3dDevice-&gt;ClearRenderTargetView(m_pRenderTargetView, afClearColor);\r\n\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0 \u00a0\/*********** Donn\u00e9e d'une variable de temps ***********\/\r\n\u00a0\r\n\u00a0\u00a0 \u00a0static float t = 0.0f;\r\n\u00a0\u00a0\u00a0 static DWORD dwTimeStart = 0;\r\n\u00a0\u00a0\u00a0 DWORD dwTimeCur = GetTickCount();\r\n\u00a0\u00a0\u00a0 if( dwTimeStart == 0 )\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 dwTimeStart = dwTimeCur;\r\n\u00a0\u00a0\u00a0 t = ( dwTimeCur - dwTimeStart ) \/ 1000.0f;\r\n\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0\u00a0 \/*******************************************************\/\r\n\u00a0\u00a0 \u00a0\r\n    \/\/ Direction de la lumi\u00e8re\r\n\u00a0\u00a0\u00a0 D3DXVECTOR4 vLightDirs( -1.577f, 0.577f, -0.577f, 1.0f );\r\n\r\n\u00a0\u00a0\u00a0 D3DXMATRIX mRotate;\r\n\u00a0\u00a0\u00a0 D3DXVECTOR4 vOutDir;\r\n\u00a0\u00a0\u00a0 D3DXMatrixRotationZ( &amp;mRotate, -2.0f * t );\r\n\u00a0\u00a0\u00a0 D3DXVec3Transform( &amp;vLightDirs, ( D3DXVECTOR3* )&amp;vLightDirs, &amp;mRotate );\r\n\r\n\u00a0\u00a0 \u00a0\/\/ On met \u00e0 jour les variables du shader HLSL\r\n\u00a0\u00a0 \u00a0m_pWorldVariable-&gt;SetMatrix((float*)&amp;m_worldMatrix);\r\n\u00a0\u00a0\u00a0 m_pLightDirVariable-&gt;SetFloatVectorArray((float*)vLightDirs, 0, 2);\r\n\r\n\u00a0\u00a0 \u00a0\/**********************\/\r\n\r\n\u00a0\u00a0 \u00a0\/\/ Affiche le cube\r\n\u00a0\u00a0\u00a0 D3D10_TECHNIQUE_DESC techDesc;\r\n\u00a0\u00a0\u00a0 m_pTechnique-&gt;GetDesc(&amp;techDesc);\r\n\u00a0\u00a0\u00a0 for (UINT p = 0; p &lt; techDesc.Passes; ++p)\r\n\u00a0\u00a0\u00a0 {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 m_pTechnique-&gt;GetPassByIndex( p )-&gt;Apply( 0 );\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 m_pd3dDevice-&gt;DrawIndexed( 36, 0, 0 );\r\n\u00a0\u00a0\u00a0 }\r\n\r\n\u00a0\u00a0 \u00a0\/**********************\/\r\n\r\n\u00a0\u00a0 \u00a0\/\/ On affiche le front buffer\r\n\u00a0\u00a0\u00a0 m_pSwapChain-&gt;Present( 0, 0 );\r\n}\r\n<\/pre>\n<p><strong>R\u00e9sum\u00e9 :<\/strong><\/p>\n<p>Nous avons int\u00e9gr\u00e9 une lumi\u00e8re pr\u00e8s de notre cube afin de l&rsquo;\u00e9clairer.<\/p>\n<p><a href=\"https:\/\/anthropoya.cluster014.ovh.net\/blog-informatique\/wp-content\/uploads\/2015\/03\/partie4.png\"><img decoding=\"async\" loading=\"lazy\" class=\"alignnone  wp-image-1499\" src=\"https:\/\/anthropoya.cluster014.ovh.net\/blog-informatique\/wp-content\/uploads\/2015\/03\/partie4.png\" alt=\"partie4\" width=\"516\" height=\"405\" srcset=\"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/wp-content\/uploads\/2015\/03\/partie4.png 812w, https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/wp-content\/uploads\/2015\/03\/partie4-300x236.png 300w, https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/wp-content\/uploads\/2015\/03\/partie4-624x490.png 624w\" sizes=\"(max-width: 516px) 100vw, 516px\" \/><\/a><\/p>\n<p>Voici<strong> l\u2019archive<\/strong> du code complet pour cette partie :\u00a0 <a href=\"https:\/\/anthropoya.cluster014.ovh.net\/blog-informatique\/data\/DirectX%2010%20Tutoriel%20-%20Partie%204.zip\">DirectX 10 Tutoriel \u2013 Partie 4.zip <\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Intro : Dans cette quatri\u00e8me partie, nous allons apprendre \u00e0 int\u00e9grer une lumi\u00e8re afin d&rsquo;\u00e9clairer notre cube. Pr\u00e9requis : Avoir suivi la troisi\u00e8me partie de ce tutoriel. Quatri\u00e8me partie : Afficher un petit cube \u00e9clair\u00e9 d&rsquo;une lumi\u00e8re. Explications : Nous allons utiliser cette structure de vertex : Elle contient un attribut suppl\u00e9mentaire par rapport \u00e0 [&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\/1482"}],"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=1482"}],"version-history":[{"count":41,"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=\/wp\/v2\/posts\/1482\/revisions"}],"predecessor-version":[{"id":2604,"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=\/wp\/v2\/posts\/1482\/revisions\/2604"}],"wp:attachment":[{"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1482"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1482"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1482"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}