{"id":3543,"date":"2015-11-15T19:14:06","date_gmt":"2015-11-15T19:14:06","guid":{"rendered":"http:\/\/anthroponaute.fr\/blog-informatique\/?p=3543"},"modified":"2020-02-25T10:58:41","modified_gmt":"2020-02-25T10:58:41","slug":"la-tessellation","status":"publish","type":"post","link":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/?p=3543","title":{"rendered":"La tessellation &#8211; Th\u00e9orie (DirectX 11)"},"content":{"rendered":"<p><a href=\"https:\/\/anthropoya.cluster014.ovh.net\/blog-informatique\/wp-content\/uploads\/2015\/11\/tessellation.jpg\"><img decoding=\"async\" loading=\"lazy\" class=\"alignnone size-full wp-image-3544\" src=\"https:\/\/anthropoya.cluster014.ovh.net\/blog-informatique\/wp-content\/uploads\/2015\/11\/tessellation.jpg\" alt=\"tessellation\" width=\"627\" height=\"279\" srcset=\"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/wp-content\/uploads\/2015\/11\/tessellation.jpg 627w, https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/wp-content\/uploads\/2015\/11\/tessellation-300x133.jpg 300w, https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/wp-content\/uploads\/2015\/11\/tessellation-624x278.jpg 624w\" sizes=\"(max-width: 627px) 100vw, 627px\" \/><\/a><\/p>\n<p><strong>Intro :<\/strong><\/p>\n<p>Le principe de la tessellation est simple : on transforme un<strong> polygone<\/strong> et on le d\u00e9compose en <strong>morceaux<\/strong> plus petits.<\/p>\n<p><strong>Pr\u00e9requis :<\/strong><\/p>\n<p>&#8211; Savoir comment fonctionne un programme <em>HLSL<\/em><\/p>\n<p>&#8211; Savoir comment utiliser DirectX 11<\/p>\n<p><strong>Explications :<\/strong><\/p>\n<p>Si on prend un carr\u00e9 et qu&rsquo;on le coupe en deux le long de sa diagonale, on op\u00e8re une \u00ab\u00a0<strong>tessellation<\/strong>\u00a0\u00bb en deux triangles.<\/p>\n<p>Dans DirectX 11, la tessellation est op\u00e9r\u00e9e <strong>directement<\/strong> par le <strong>GPU<\/strong> (c&rsquo;est-\u00e0-dire par le processeur de la <strong>carte graphique<\/strong>).<\/p>\n<p>Elle peut \u00eatre utilis\u00e9e dans le rendu en faisant du \u00ab\u00a0Displacement Mapping\u00a0\u00bb. Au lieu de pr\u00e9charger, dans la m\u00e9moire vid\u00e9o, un mod\u00e8le tr\u00e8s d\u00e9taill\u00e9 : on peut augmenter ses d\u00e9tails par le GPU ; en effet le <em>Displacement Mapping<\/em><strong> va de paire<\/strong> avec la <em>tessellation<\/em>.<\/p>\n<p>Par exemple au lieu d&rsquo;impl\u00e9menter une<strong> grille plate<\/strong> tr\u00e8s d\u00e9taill\u00e9e, \u00e0 la place, on peut augmenter les d\u00e9tails d&rsquo;un <strong>polygone carr\u00e9<\/strong> par le proc\u00e9d\u00e9 de tessellation.<\/p>\n<p>En cons\u00e9quence et d&rsquo;autre part, il devient possible de faire varier progressivement le niveau de d\u00e9tail g\u00e9om\u00e9trique des mod\u00e8les.<\/p>\n<p><span style=\"text-decoration: underline;\">Les avantages :<\/span><\/p>\n<p>&#8211; R\u00e9duit la m\u00e9moire et la bande passante utilis\u00e9es<\/p>\n<p>&#8211; Permet de complexifier des mod\u00e8les basse r\u00e9solution en des mod\u00e8les tr\u00e8s d\u00e9taill\u00e9s et ceci <em>\u00e0 la vol\u00e9e<\/em><\/p>\n<p>&#8211; D\u00e9place le calcul classique de modification g\u00e9om\u00e9trique effectu\u00e9 par le CPU vers un calcul effectu\u00e9 par le GPU<\/p>\n<p>&#8211; Facilite le LOD (Level of Detail) des objets distants. En effet la <em>tessellation<\/em> permet de faire varier dynamiquement le niveau de d\u00e9tail d&rsquo;un mod\u00e8le<\/p>\n<p>&#8211; On peut effectuer le calcul physique de collision ou d&rsquo;animation avec un mod\u00e8le non d\u00e9taill\u00e9 en m\u00e9moire centrale tout en affichant un mod\u00e8le tr\u00e8s d\u00e9taill\u00e9 au rendu<\/p>\n<p>&#8211; Possibilit\u00e9 d&rsquo;affichage de meilleurs mod\u00e8les d\u00e9taill\u00e9s<\/p>\n<p><span style=\"text-decoration: underline;\">Trois nouvelles \u00e9tapes de shader :<br \/>\n<\/span><\/p>\n<p><a href=\"https:\/\/anthropoya.cluster014.ovh.net\/blog-informatique\/wp-content\/uploads\/2015\/11\/dx11_pipeline.png\"><img decoding=\"async\" loading=\"lazy\" class=\"alignnone size-full wp-image-3704\" src=\"https:\/\/anthropoya.cluster014.ovh.net\/blog-informatique\/wp-content\/uploads\/2015\/11\/dx11_pipeline.png\" alt=\"dx11_pipeline\" width=\"319\" height=\"380\" srcset=\"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/wp-content\/uploads\/2015\/11\/dx11_pipeline.png 319w, https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/wp-content\/uploads\/2015\/11\/dx11_pipeline-252x300.png 252w\" sizes=\"(max-width: 319px) 100vw, 319px\" \/><\/a><\/p>\n<p>DirectX 11 impl\u00e9mente la tessellation par <strong>3 nouvelles \u00e9tapes<\/strong> de cha\u00eene de rendu : l&rsquo;\u00e9tape <strong>Hull <\/strong>Shader, l&rsquo;\u00e9tape <strong>Tessellator<\/strong> et l&rsquo;\u00e9tape<strong> Domain<\/strong>.<\/p>\n<p>Ces trois \u00e9tapes suive l&rsquo;\u00e9tape <em>Vertex Shader<\/em> et pr\u00e9c\u00e8de l&rsquo;\u00e9tape <em>Geometry Shader<\/em>.<\/p>\n<p><span style=\"text-decoration: underline;\">Avant tout, d\u00e9finissons quelques concepts li\u00e9s \u00e0 la tessellation par DirectX 11 :<\/span><\/p>\n<p>&#8211; <strong>Patch<\/strong> :<br \/>\n&#8211; <strong>Control Point<\/strong> :<br \/>\n&#8211; <strong>Tessellation factor<\/strong> :<br \/>\n&#8211; <strong>Input primitive<\/strong> :<\/p>\n<p>Lorsque ces deux \u00e9tapes (Hull Shader &amp; Domain Shader) sont d\u00e9finis dans un fichier shader<em> \u00ab\u00a0.fx\u00a0\u00bb<\/em>, l&rsquo;\u00e9tape Vertex Shader ne renvoie pas sp\u00e9cialement un vertex mais renvoie ce qu&rsquo;on appel un \u00ab\u00a0<strong>control point<\/strong>\u00a0\u00bb qui repr\u00e9sente le vertex d&rsquo;un triangle ou d&rsquo;une face. Ce sera la derni\u00e8re \u00e9tape de la \u00ab\u00a0Pipeline\u00a0\u00bb qui se chargera de renvoyer le vertex au Pixel Shader.<\/p>\n<p><span style=\"text-decoration: underline;\">Hull Shader :<\/span><\/p>\n<p>Est invoqu\u00e9 une fois par \u00ab\u00a0<em>control point<\/em>\u00a0\u00bb et renvoie des \u00ab\u00a0<em>tessellator factors <\/em>\u00bb. Cette \u00e9tape est programmable. Cette \u00e9tape de shader permet de faire savoir \u00e0 l&rsquo;\u00e9tape suivante Tesselator comment op\u00e9rer la tesselation sur les donn\u00e9es d&rsquo;entr\u00e9es.<\/p>\n<p><a href=\"https:\/\/anthropoya.cluster014.ovh.net\/blog-informatique\/wp-content\/uploads\/2015\/11\/TesselatorLevel.png\"><img decoding=\"async\" loading=\"lazy\" src=\"https:\/\/anthropoya.cluster014.ovh.net\/blog-informatique\/wp-content\/uploads\/2015\/11\/TesselatorLevel.png\" alt=\"TesselatorLevel\" width=\"439\" height=\"151\" class=\"alignnone size-full wp-image-5956\" srcset=\"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/wp-content\/uploads\/2015\/11\/TesselatorLevel.png 439w, https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/wp-content\/uploads\/2015\/11\/TesselatorLevel-300x103.png 300w\" sizes=\"(max-width: 439px) 100vw, 439px\" \/><\/a><\/p>\n<p><span style=\"text-decoration: underline;\">Tessellator Stage :<\/span><\/p>\n<p>G\u00e9n\u00e8re de nouvelles vertices. Plus les \u00ab\u00a0<em>tessellator factors<\/em>\u00a0\u00bb re\u00e7ues sont \u00e9lev\u00e9s plus il y a de triangles cr\u00e9\u00e9s. Cette \u00e9tape est non-programmable.<\/p>\n<p><span style=\"text-decoration: underline;\">Domain Shader :<\/span><\/p>\n<p>Cette \u00e9tape est programmable. Est ex\u00e9cut\u00e9e une fois par vertex. Convertis et fait correspondre les donn\u00e9es (u, v) vers les donn\u00e9es d&rsquo;attributs (x, y, z, w).<\/p>\n<p><span style=\"text-decoration: underline;\">Exemples :<\/span><\/p>\n<p><strong>1) <\/strong> Un carr\u00e9 subissant une \u00ab\u00a0tessellation\u00a0\u00bb<\/p>\n<p><a href=\"https:\/\/anthropoya.cluster014.ovh.net\/blog-informatique\/wp-content\/uploads\/2015\/11\/tesselator.png\"><img decoding=\"async\" loading=\"lazy\" class=\"alignnone  wp-image-3673\" src=\"https:\/\/anthropoya.cluster014.ovh.net\/blog-informatique\/wp-content\/uploads\/2015\/11\/tesselator.png\" alt=\"tesselator\" width=\"413\" height=\"125\" srcset=\"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/wp-content\/uploads\/2015\/11\/tesselator.png 1149w, https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/wp-content\/uploads\/2015\/11\/tesselator-300x91.png 300w, https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/wp-content\/uploads\/2015\/11\/tesselator-1024x310.png 1024w, https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/wp-content\/uploads\/2015\/11\/tesselator-624x189.png 624w\" sizes=\"(max-width: 413px) 100vw, 413px\" \/><\/a><\/p>\n<p><strong>\u00a02)<\/strong> Puis utilisation d&rsquo;une \u00ab\u00a0displacement map\u00a0\u00bb<\/p>\n<p><a href=\"https:\/\/anthropoya.cluster014.ovh.net\/blog-informatique\/wp-content\/uploads\/2015\/11\/tesselator_2.png\"><img decoding=\"async\" loading=\"lazy\" class=\"alignnone  wp-image-3675\" src=\"https:\/\/anthropoya.cluster014.ovh.net\/blog-informatique\/wp-content\/uploads\/2015\/11\/tesselator_2.png\" alt=\"tesselator_2\" width=\"414\" height=\"225\" srcset=\"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/wp-content\/uploads\/2015\/11\/tesselator_2.png 1157w, https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/wp-content\/uploads\/2015\/11\/tesselator_2-300x163.png 300w, https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/wp-content\/uploads\/2015\/11\/tesselator_2-1024x557.png 1024w, https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/wp-content\/uploads\/2015\/11\/tesselator_2-624x339.png 624w\" sizes=\"(max-width: 414px) 100vw, 414px\" \/><\/a><\/p>\n<p><strong>3) <\/strong>Enfin utilisation d&rsquo;une texture et bump mapping<\/p>\n<p><a href=\"https:\/\/anthropoya.cluster014.ovh.net\/blog-informatique\/wp-content\/uploads\/2015\/11\/Tessellation3.png\"><img decoding=\"async\" loading=\"lazy\" class=\"alignnone  wp-image-4249\" src=\"https:\/\/anthropoya.cluster014.ovh.net\/blog-informatique\/wp-content\/uploads\/2015\/11\/Tessellation3.png\" alt=\"Tessellation3\" width=\"400\" height=\"216\" srcset=\"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/wp-content\/uploads\/2015\/11\/Tessellation3.png 1149w, https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/wp-content\/uploads\/2015\/11\/Tessellation3-300x162.png 300w, https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/wp-content\/uploads\/2015\/11\/Tessellation3-1024x552.png 1024w, https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/wp-content\/uploads\/2015\/11\/Tessellation3-624x336.png 624w\" sizes=\"(max-width: 400px) 100vw, 400px\" \/><\/a><\/p>\n<p><strong>R\u00e9sum\u00e9 :<\/strong><\/p>\n<p><strong>R\u00e9f\u00e9rences :<\/strong><\/p>\n<p>&#8211; http:\/\/www.nvidia.fr\/object\/tessellation_fr.html<\/p>\n<p>&#8211; https:\/\/msdn.microsoft.com\/en-us\/library\/windows\/desktop\/ff476340%28v=vs.85%29.aspx<\/p>\n<p>&#8211; http:\/\/www.rastertek.com\/dx11tut38.html<\/p>\n<p>&#8211; http:\/\/richardssoftware.net\/Home\/Post\/28<\/p>\n<p>&#8211; 3D Game Programming with DirectX 11 &#8211; Franck D. Luna<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Intro : Le principe de la tessellation est simple : on transforme un polygone et on le d\u00e9compose en morceaux plus petits. Pr\u00e9requis : &#8211; Savoir comment fonctionne un programme HLSL &#8211; Savoir comment utiliser DirectX 11 Explications : Si on prend un carr\u00e9 et qu&rsquo;on le coupe en deux le long de sa diagonale, [&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\/3543"}],"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=3543"}],"version-history":[{"count":137,"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=\/wp\/v2\/posts\/3543\/revisions"}],"predecessor-version":[{"id":4254,"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=\/wp\/v2\/posts\/3543\/revisions\/4254"}],"wp:attachment":[{"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=3543"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=3543"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=3543"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}