{"id":1277,"date":"2015-03-05T10:21:36","date_gmt":"2015-03-05T10:21:36","guid":{"rendered":"http:\/\/anthroponaute.fr\/blog-informatique\/?p=1277"},"modified":"2015-03-09T15:43:24","modified_gmt":"2015-03-09T15:43:24","slug":"introduction-a-directx-10-texturing-partie-3","status":"publish","type":"post","link":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/?p=1277","title":{"rendered":"Introduction \u00e0 DirectX 10 &#8211; Texturing &#8211; partie 3"},"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 troisi\u00e8me partie, nous allons apprendre comment ajouter une texture \u00e0 un petit cube auto g\u00e9n\u00e9r\u00e9.<\/p>\n<p><strong>Pr\u00e9requis :<\/strong><\/p>\n<p>Avoir suivi la deuxi\u00e8me partie de ce tutoriel.<\/p>\n<h2><strong>Troisi\u00e8me partie :<\/strong><\/h2>\n<p>Afficher un petit cube avec une texture appliqu\u00e9e dessus.<\/p>\n<p><strong>Explications :<\/strong><\/p>\n<p>Dans ce tutoriel 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};\r\n\r\n<\/pre>\n<p>La deuxi\u00e8me variable indique que l&rsquo;on va utiliser les coordonn\u00e9es de la texture appliqu\u00e9s au cube.<\/p>\n<p>Rajoutez dans votre fichier D3D10Renderer.h :<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\n\r\n\/* Variables HLSL des matrix.\r\n   Ces variables seront utilis\u00e9es et envoy\u00e9es\r\n   au vertex shader HLSL. *\/\r\nID3D10EffectMatrixVariable* m_pWorldVariable;\r\nID3D10EffectMatrixVariable* m_pViewVariable;\r\nID3D10EffectMatrixVariable* m_pProjectionVariable;\r\n\r\n\/\/ Variable de la texture\r\nID3D10EffectShaderResourceVariable* m_pDiffuseVariable;\r\n\r\n\/\/ Les matrix pour afficher le rendu\r\nD3DXMATRIX m_worldMatrix;\r\nD3DXMATRIX m_viewMatrix;\r\nD3DXMATRIX m_projectionMatrix;\r\n\r\nID3D10ShaderResourceView* m_pTextureRV;\r\n\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p>Voici le fichier effet HLSL utilis\u00e9 &#8211; partie3.fx :<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\n\/\/--------------------------------------------------------------------------------------\r\n\/\/ Constant Buffer Variables\r\n\/\/--------------------------------------------------------------------------------------\r\nTexture2D txDiffuse;\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\ncbuffer cbNeverChanges\r\n{\r\n\u00a0\u00a0\u00a0 matrix View;\r\n};\r\n\r\ncbuffer cbChangeOnResize\r\n{\r\n\u00a0\u00a0\u00a0 matrix Projection;\r\n};\r\n\r\ncbuffer cbChangesEveryFrame\r\n{\r\n\u00a0\u00a0\u00a0 matrix World;\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};\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};\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.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\u00a0 return txDiffuse.Sample( samLinear, input.Tex );\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>&nbsp;<\/p>\n<p>Dans le fichier D3D10Renderer.cpp \u00e0 la fonction Initialize(bool bFullScreen) :<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\n\/******************** Partie 2 &amp; 3 ********************\/\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;Partie3.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\/* Voici les variables matrix utilis\u00e9es par le 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_pMeshColorVariable = m_pEffect-&gt;GetVariableByName(&quot;vMeshColor&quot;)-&gt;AsVector();\r\nm_pDiffuseVariable = m_pEffect-&gt;GetVariableByName(&quot;txDiffuse&quot;)-&gt;AsShaderResource();\r\n\r\n\/******************************************************\/\r\n<\/pre>\n<p>Voir cet article si vous ne comprenez pas \u00e0 quoi sert les matrices World, View et Projection.<\/p>\n<p>On d\u00e9finit la nouvelle structure d&rsquo;un vertex :<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\n\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};\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\r\n\/******************************************************\/\r\n\r\n<\/pre>\n<p>On d\u00e9finit les informations de vertex et index buffers d&rsquo;un cube :<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\n\/\/ On cr\u00e9\u00e9 le vertex buffer d'un cube\r\nSimpleVertex vertices[] =\r\n{\r\n\u00a0\u00a0 \u00a0{ D3DXVECTOR3( -1.0f, 1.0f, -1.0f ), D3DXVECTOR2( 0.0f, 0.0f ) },\r\n\u00a0\u00a0 \u00a0{ D3DXVECTOR3( 1.0f, 1.0f, -1.0f ), D3DXVECTOR2( 1.0f, 0.0f ) },\r\n\u00a0\u00a0 \u00a0{ D3DXVECTOR3( 1.0f, 1.0f, 1.0f ), D3DXVECTOR2( 1.0f, 1.0f ) },\r\n\u00a0\u00a0 \u00a0{ D3DXVECTOR3( -1.0f, 1.0f, 1.0f ), D3DXVECTOR2( 0.0f, 1.0f ) },\r\n\r\n\u00a0\u00a0 \u00a0{ D3DXVECTOR3( -1.0f, -1.0f, -1.0f ), D3DXVECTOR2( 0.0f, 0.0f ) },\r\n\u00a0\u00a0 \u00a0{ D3DXVECTOR3( 1.0f, -1.0f, -1.0f ), D3DXVECTOR2( 1.0f, 0.0f ) },\r\n\u00a0\u00a0 \u00a0{ D3DXVECTOR3( 1.0f, -1.0f, 1.0f ), D3DXVECTOR2( 1.0f, 1.0f ) },\r\n\u00a0\u00a0 \u00a0{ D3DXVECTOR3( -1.0f, -1.0f, 1.0f ), D3DXVECTOR2( 0.0f, 1.0f ) },\r\n\r\n\u00a0\u00a0 \u00a0{ D3DXVECTOR3( -1.0f, -1.0f, 1.0f ), D3DXVECTOR2( 0.0f, 0.0f ) },\r\n\u00a0\u00a0 \u00a0{ D3DXVECTOR3( -1.0f, -1.0f, -1.0f ), D3DXVECTOR2( 1.0f, 0.0f ) },\r\n\u00a0\u00a0 \u00a0{ D3DXVECTOR3( -1.0f, 1.0f, -1.0f ), D3DXVECTOR2( 1.0f, 1.0f ) },\r\n\u00a0\u00a0 \u00a0{ D3DXVECTOR3( -1.0f, 1.0f, 1.0f ), D3DXVECTOR2( 0.0f, 1.0f ) },\r\n\r\n\u00a0\u00a0 \u00a0{ D3DXVECTOR3( 1.0f, -1.0f, 1.0f ), D3DXVECTOR2( 0.0f, 0.0f ) },\r\n\u00a0\u00a0 \u00a0{ D3DXVECTOR3( 1.0f, -1.0f, -1.0f ), D3DXVECTOR2( 1.0f, 0.0f ) },\r\n\u00a0\u00a0 \u00a0{ D3DXVECTOR3( 1.0f, 1.0f, -1.0f ), D3DXVECTOR2( 1.0f, 1.0f ) },\r\n\u00a0\u00a0 \u00a0{ D3DXVECTOR3( 1.0f, 1.0f, 1.0f ), D3DXVECTOR2( 0.0f, 1.0f ) },\r\n\r\n\u00a0\u00a0 \u00a0{ D3DXVECTOR3( -1.0f, -1.0f, -1.0f ), D3DXVECTOR2( 0.0f, 0.0f ) },\r\n\u00a0\u00a0 \u00a0{ D3DXVECTOR3( 1.0f, -1.0f, -1.0f ), D3DXVECTOR2( 1.0f, 0.0f ) },\r\n\u00a0\u00a0 \u00a0{ D3DXVECTOR3( 1.0f, 1.0f, -1.0f ), D3DXVECTOR2( 1.0f, 1.0f ) },\r\n\u00a0\u00a0 \u00a0{ D3DXVECTOR3( -1.0f, 1.0f, -1.0f ), D3DXVECTOR2( 0.0f, 1.0f ) },\r\n\r\n\u00a0\u00a0 \u00a0{ D3DXVECTOR3( -1.0f, -1.0f, 1.0f ), D3DXVECTOR2( 0.0f, 0.0f ) },\r\n\u00a0\u00a0 \u00a0{ D3DXVECTOR3( 1.0f, -1.0f, 1.0f ), D3DXVECTOR2( 1.0f, 0.0f ) },\r\n\u00a0\u00a0 \u00a0{ D3DXVECTOR3( 1.0f, 1.0f, 1.0f ), D3DXVECTOR2( 1.0f, 1.0f ) },\r\n\u00a0\u00a0 \u00a0{ D3DXVECTOR3( -1.0f, 1.0f, 1.0f ), D3DXVECTOR2( 0.0f, 1.0f ) },\r\n};\r\n\r\n\/\/ On cr\u00e9\u00e9 l'index buffer de ce cube\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\r\n<\/pre>\n<p>Voir cet article si vous ne comprenez pas \u00e0 quoi sert les vertex buffer et index buffer.<\/p>\n<p>On impl\u00e9mente les vertex et index buffers :<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\n\/********** Vertex buffer **********\/\r\n\r\nD3D10_BUFFER_DESC bd;\r\nbd.Usage = D3D10_USAGE_DEFAULT;\r\n\/\/ Taille d'une entr\u00e9e vertex\r\nbd.ByteWidth = sizeof(SimpleVertex) * 24;\r\nbd.BindFlags = D3D10_BIND_VERTEX_BUFFER;\r\nbd.CPUAccessFlags = 0;\r\nbd.MiscFlags = 0;\r\nD3D10_SUBRESOURCE_DATA InitData;\r\nInitData.pSysMem = vertices;\r\nhr = m_pd3dDevice-&gt;CreateBuffer(&amp;bd, &amp;InitData, &amp;m_pVertexBuffer);\r\nif(FAILED(hr))\r\n\u00a0\u00a0 \u00a0return false;\r\n\r\nUINT stride = sizeof(SimpleVertex);\r\nUINT offset = 0;\r\nm_pd3dDevice-&gt;IASetVertexBuffers(0, 1, &amp;m_pVertexBuffer, &amp;stride, &amp;offset);\r\n\r\n\/********** Index buffer **********\/\r\n\r\nbd.Usage = D3D10_USAGE_DEFAULT;\r\n\/\/ Taille d'une entr\u00e9e index\r\nbd.ByteWidth = sizeof( DWORD ) * 36;\r\nbd.BindFlags = D3D10_BIND_INDEX_BUFFER;\r\nbd.CPUAccessFlags = 0;\r\nbd.MiscFlags = 0;\r\nInitData.pSysMem = indices;\r\nhr = m_pd3dDevice-&gt;CreateBuffer(&amp;bd, &amp;InitData, &amp;m_pIndexBuffer);\r\nif(FAILED(hr))\r\n\u00a0\u00a0 \u00a0return false;\r\n\r\n\/\/ Set index buffer\r\nm_pd3dDevice-&gt;IASetIndexBuffer( m_pIndexBuffer, DXGI_FORMAT_R32_UINT, 0 );\r\n\r\n\/* On d\u00e9finit le type de primitive *\/\r\nm_pd3dDevice-&gt;IASetPrimitiveTopology(D3D10_PRIMITIVE_TOPOLOGY_TRIANGLELIST);\r\n\r\n\/******************************************************\/\r\n\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p>On charge la texture qui sera utilis\u00e9e :<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\n\/\/ On charge la texture\r\nhr = D3DX10CreateShaderResourceViewFromFile(m_pd3dDevice, L&quot;seafloor.dds&quot;, NULL, NULL, &amp;m_pTextureRV, NULL);\r\nif(FAILED(hr))\r\n\u00a0\u00a0  return false;\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p>On initialise les matrices et la texture :<\/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><strong>R\u00e9sum\u00e9 :<\/strong><\/p>\n<p>Au final nous avons affich\u00e9 un petit cube textur\u00e9.<\/p>\n<p><a href=\"https:\/\/anthropoya.cluster014.ovh.net\/blog-informatique\/wp-content\/uploads\/2015\/03\/partie31.png\"><img decoding=\"async\" loading=\"lazy\" class=\"alignnone  wp-image-1449\" src=\"https:\/\/anthropoya.cluster014.ovh.net\/blog-informatique\/wp-content\/uploads\/2015\/03\/partie31.png\" alt=\"partie3\" width=\"499\" height=\"390\" srcset=\"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/wp-content\/uploads\/2015\/03\/partie31.png 815w, https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/wp-content\/uploads\/2015\/03\/partie31-300x234.png 300w, https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/wp-content\/uploads\/2015\/03\/partie31-624x488.png 624w\" sizes=\"(max-width: 499px) 100vw, 499px\" \/><\/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%203.zip\">DirectX 10 Tutoriel &#8211; Partie 3.zip <\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Intro : Dans cette troisi\u00e8me partie, nous allons apprendre comment ajouter une texture \u00e0 un petit cube auto g\u00e9n\u00e9r\u00e9. Pr\u00e9requis : Avoir suivi la deuxi\u00e8me partie de ce tutoriel. Troisi\u00e8me partie : Afficher un petit cube avec une texture appliqu\u00e9e dessus. Explications : Dans ce tutoriel nous allons utiliser cette structure de vertex : La [&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\/1277"}],"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=1277"}],"version-history":[{"count":64,"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=\/wp\/v2\/posts\/1277\/revisions"}],"predecessor-version":[{"id":1481,"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=\/wp\/v2\/posts\/1277\/revisions\/1481"}],"wp:attachment":[{"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1277"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1277"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1277"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}