{"id":1301,"date":"2015-03-07T05:39:52","date_gmt":"2015-03-07T05:39:52","guid":{"rendered":"http:\/\/anthroponaute.fr\/blog-informatique\/?p=1301"},"modified":"2015-11-13T09:17:43","modified_gmt":"2015-11-13T09:17:43","slug":"directx-10-vertex-input-layout","status":"publish","type":"post","link":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/?p=1301","title":{"rendered":"Les Vertex Input Layouts"},"content":{"rendered":"<p>&nbsp;<\/p>\n<p><strong><a href=\"https:\/\/anthropoya.cluster014.ovh.net\/blog-informatique\/wp-content\/uploads\/2015\/03\/nvidia-quadro-graphics-card.jpg\"><img decoding=\"async\" loading=\"lazy\" class=\"alignnone  wp-image-1352\" src=\"https:\/\/anthropoya.cluster014.ovh.net\/blog-informatique\/wp-content\/uploads\/2015\/03\/nvidia-quadro-graphics-card.jpg\" alt=\"nvidia-quadro-graphics-card\" width=\"395\" height=\"264\" srcset=\"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/wp-content\/uploads\/2015\/03\/nvidia-quadro-graphics-card.jpg 1280w, https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/wp-content\/uploads\/2015\/03\/nvidia-quadro-graphics-card-300x201.jpg 300w, https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/wp-content\/uploads\/2015\/03\/nvidia-quadro-graphics-card-1024x685.jpg 1024w, https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/wp-content\/uploads\/2015\/03\/nvidia-quadro-graphics-card-624x417.jpg 624w\" sizes=\"(max-width: 395px) 100vw, 395px\" \/><\/a><\/strong><\/p>\n<p><strong>Intro\u00a0 :<\/strong><\/p>\n<p>Dans le cas basique, et en g\u00e9n\u00e9ral, un vertex a pour attribut seulement sa <strong>position<\/strong>. Il existe cependant un m\u00e9canisme o\u00f9 il est possible de rajouter d&rsquo;autres attributs comme : une<strong> normale<\/strong>, une <strong>couleur<\/strong>, des <strong>coordonn\u00e9es de textures<\/strong>, etc&#8230; Je vais tenter de vous expliquer ce m\u00e9canisme.<\/p>\n<p><strong>Explications :<\/strong><\/p>\n<p>Avant tout, lors de l&rsquo;\u00e9tape de rendu Input Assembler (voir cet <a href=\"https:\/\/anthropoya.cluster014.ovh.net\/blog-informatique\/?p=654\">article<\/a>) les donn\u00e9es g\u00e9om\u00e9triques pr\u00e9sentes dans la m\u00e9moire vid\u00e9o (compos\u00e9es de ces attributs) sont re\u00e7ues puis trait\u00e9es par le Vertex Shader.<\/p>\n<p>Dans DirectX 10, la configuration de ces attributs s&rsquo;op\u00e8re sur l&rsquo;initialisation d&rsquo;une structure appel\u00e9e D3D10_INPUT_ELEMENT_DESC.<\/p>\n<p>Ici en tant qu&rsquo;exemple cette structure (appel\u00e9e dans le jargon anglais \u00ab\u00a0Vertex Input Layout\u00a0\u00bb) s&rsquo;impl\u00e9mente ainsi :<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\n\r\n\/\/ D\u00e9fini un tableau de composition d'entr\u00e9e (nomm\u00e9e Input Layout)\r\nD3D10_INPUT_ELEMENT_DESC layout[] =\r\n{\r\n    { L&quot;POSITION&quot;, 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D10_INPUT_PER_VERTEX_DATA, 0 },\r\n};\r\n\r\n<\/pre>\n<p>Elle permet de d\u00e9finir en m\u00e9moire vid\u00e9o la fa\u00e7on dont sont <strong>agenc\u00e9es les vertex<\/strong>.<br \/>\nRemarque : La taille d&rsquo;un vertex en m\u00e9moire \u00e9quivaut \u00e0 la taille de cette structure impl\u00e9ment\u00e9e.<\/p>\n<p>Une structure correspondante est aussi utilis\u00e9e dans notre programme :<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\nstruct SimpleVertex\r\n{\r\n    D3DXVECTOR3 Pos;\r\n};\r\n<\/pre>\n<p>&nbsp;<\/p>\n<hr \/>\n<p>&nbsp;<\/p>\n<p>Voici les variables de cette fameuse structure :<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\ntypedef struct D3D10_INPUT_ELEMENT_DESC {\r\n  LPCSTR \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0SemanticName;\r\n  UINT \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0SemanticIndex;\r\n  DXGI_FORMAT \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Format;\r\n  UINT \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0InputSlot;\r\n  UINT \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0AlignedByteOffset;\r\n  D3D10_INPUT_CLASSIFICATION InputSlotClass;\r\n  UINT \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0InstanceDataStepRate;\r\n} D3D10_INPUT_ELEMENT_DESC;\r\n\r\n<\/pre>\n<h2>Param\u00e8tres :<\/h2>\n<p><strong>SemanticName :<\/strong><\/p>\n<p>Nom de la \u00ab\u00a0s\u00e9mantique\u00a0\u00bb de la variable.<\/p>\n<p>Une \u00ab\u00a0s\u00e9mantique\u00a0\u00bb est une cha\u00eene de caract\u00e8re qui indique dans quel but la variable doit \u00eatre utilis\u00e9e.<\/p>\n<p>Ici son r\u00f4le est la position donc on met : \u00ab\u00a0POSITION\u00a0\u00bb.<br \/>\nOn peut mettre aussi \u00ab\u00a0NORMAL\u00a0\u00bb, \u00ab\u00a0COLOR\u00a0\u00bb, \u00ab\u00a0TEXCOORD\u00a0\u00bb, etc&#8230;<\/p>\n<p><strong>SemanticIndex :<\/strong><\/p>\n<p>C&rsquo;est un index (un nombre entier) qui d\u00e9signe le num\u00e9ro d&rsquo;un s\u00e9mantique qui a d\u00e9j\u00e0 \u00e9t\u00e9 d\u00e9clar\u00e9.<\/p>\n<p>Par exemple, si on d\u00e9clare deux textures avec s\u00e9mantique \u00ab\u00a0TEXTURE\u00a0\u00bb, on mettra comme SemanticIndex pour le premier champ \u00ab\u00a00\u00a0\u00bb et pour le deuxi\u00e8me champ \u00ab\u00a01\u00a0\u00bb.<\/p>\n<p><strong>Format :<br \/>\n<\/strong><\/p>\n<p>Le format d\u00e9finit le type de donn\u00e9es qui sera utilis\u00e9 pour cet \u00e9l\u00e9ment.<\/p>\n<p>Par exemple, pour DXGI_FORMAT_R32G32B32_FLOAT : il s&rsquo;agit d&rsquo;un attribut avec comme type un flottant et 8 octets allou\u00e9s par couleur.<\/p>\n<p><strong>InputSlot<\/strong> :<\/p>\n<p>Dans l&rsquo;\u00e9tape Input Assembler on peut d\u00e9finir jusqu&rsquo;\u00e0 16 Vertex buffer qui peuvent \u00eatre utilis\u00e9s par la carte graphique avant d&rsquo;\u00eatre envoy\u00e9s au Vertex Shader.<\/p>\n<p>Ici on sp\u00e9cifie quel Vertex buffer doit \u00eatre utilis\u00e9 par cet attribut.<\/p>\n<p><strong>AlignedByteOffset<\/strong> :<\/p>\n<p>Ce champ dit \u00e0 la carte graphique quel l&#8217;emplacement m\u00e9moire pour commencer \u00e0 aller chercher les donn\u00e9es pour cet attribut.<br \/>\nIndiquez D3D10_APPEND_ALIGNED_ELEMENT pour que cet emplacement soit d\u00e9fini de mani\u00e8re automatique.<\/p>\n<p><strong>InputSlotClass<\/strong> :<\/p>\n<p>Cet attribut est utilis\u00e9 pour g\u00e9rer l&rsquo;Instancing. Voir cet article.<\/p>\n<p><strong>InstanceDataStepRate<\/strong> :<\/p>\n<p>Cet attribut est utilis\u00e9 pour g\u00e9rer l&rsquo;Instancing. Voir cet article.<\/p>\n<p>Au final on peut cr\u00e9er cette composition de vertex par le biais de cette m\u00e9thode : ID3D10Device::CreateInputLayout.<\/p>\n<p>&nbsp;<\/p>\n<hr \/>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p><strong>R\u00e9sum\u00e9 :<\/strong><\/p>\n<p>La d\u00e9claration d&rsquo;une structure \/ composition de vertex permet \u00e0 la carte graphique de regrouper les informations utiles concernant les vertex en m\u00e9moire vid\u00e9o avant d&rsquo;\u00eatre trait\u00e9s et envoy\u00e9s au Vertex Shader.<\/p>\n<p><strong>R\u00e9f\u00e9rences :<\/strong><\/p>\n<p>&#8211; http:\/\/msdn.developpez.com\/direct3d\/10\/tutoriels\/base\/<\/p>\n<p>&#8211; https:\/\/msdn.microsoft.com\/en-us\/library\/windows\/desktop\/bb205316%28v=vs.85%29.aspx<\/p>\n<p>&#8211; https:\/\/msdn.microsoft.com\/en-us\/library\/windows\/desktop\/bb509647%28v=vs.85%29.aspx<\/p>\n","protected":false},"excerpt":{"rendered":"<p>&nbsp; Intro\u00a0 : Dans le cas basique, et en g\u00e9n\u00e9ral, un vertex a pour attribut seulement sa position. Il existe cependant un m\u00e9canisme o\u00f9 il est possible de rajouter d&rsquo;autres attributs comme : une normale, une couleur, des coordonn\u00e9es de textures, etc&#8230; Je vais tenter de vous expliquer ce m\u00e9canisme. Explications : Avant tout, lors [&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\/1301"}],"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=1301"}],"version-history":[{"count":101,"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=\/wp\/v2\/posts\/1301\/revisions"}],"predecessor-version":[{"id":3391,"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=\/wp\/v2\/posts\/1301\/revisions\/3391"}],"wp:attachment":[{"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1301"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1301"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1301"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}