{"id":4829,"date":"2016-02-08T08:47:27","date_gmt":"2016-02-08T08:47:27","guid":{"rendered":"http:\/\/anthroponaute.fr\/blog-informatique\/?p=4829"},"modified":"2016-07-16T18:42:02","modified_gmt":"2016-07-16T18:42:02","slug":"le-back-face-culling","status":"publish","type":"post","link":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/?p=4829","title":{"rendered":"La technique du back-face culling"},"content":{"rendered":"<p><a href=\"https:\/\/anthropoya.cluster014.ovh.net\/blog-informatique\/wp-content\/uploads\/2016\/02\/backface.png\"><img decoding=\"async\" loading=\"lazy\" class=\"alignnone  wp-image-4832\" src=\"https:\/\/anthropoya.cluster014.ovh.net\/blog-informatique\/wp-content\/uploads\/2016\/02\/backface.png\" alt=\"backface\" width=\"432\" height=\"216\" srcset=\"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/wp-content\/uploads\/2016\/02\/backface.png 350w, https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/wp-content\/uploads\/2016\/02\/backface-300x150.png 300w\" sizes=\"(max-width: 432px) 100vw, 432px\" \/><\/a><\/p>\n<p><strong>Intro :<\/strong><\/p>\n<p>La technique du <em>back-face culling<\/em> permet d&rsquo;<strong>ignorer<\/strong> le rendu des triangles qui ne sont <strong>pas visible <\/strong>par l&rsquo;<em>observateur<\/em> ou la <em>cam\u00e9ra<\/em>.<\/p>\n<p><strong>Pr\u00e9requis :<\/strong><\/p>\n<p>&#8211;\u00a0\u00a0Savoir ce qu&rsquo;est un <em>produit scalaire<\/em><\/p>\n<p><strong>Explications :<\/strong><\/p>\n<p>Par exemple, les triangles de l&rsquo;<strong>int\u00e9rieur<\/strong> d&rsquo;un <em>mod\u00e8le <\/em>ou<em> personnage<\/em> ne seront pas rendu si l&rsquo;on rentre et se positionne <strong>dedans<\/strong> !<\/p>\n<p><a href=\"https:\/\/anthropoya.cluster014.ovh.net\/blog-informatique\/wp-content\/uploads\/2016\/02\/Bacfaceculling.png\"><img decoding=\"async\" loading=\"lazy\" class=\"alignnone  wp-image-4938\" src=\"https:\/\/anthropoya.cluster014.ovh.net\/blog-informatique\/wp-content\/uploads\/2016\/02\/Bacfaceculling.png\" alt=\"Bacfaceculling\" width=\"312\" height=\"189\" srcset=\"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/wp-content\/uploads\/2016\/02\/Bacfaceculling.png 663w, https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/wp-content\/uploads\/2016\/02\/Bacfaceculling-300x182.png 300w, https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/wp-content\/uploads\/2016\/02\/Bacfaceculling-624x378.png 624w\" sizes=\"(max-width: 312px) 100vw, 312px\" \/><\/a><\/p>\n<p>Dans DirectX, les vertices d&rsquo;un triangle sont d\u00e9finis dans <strong>un certain ordre<\/strong> (il existe deux sens : le sens \u00ab\u00a0<em>counter clockwise<\/em>\u00a0\u00bb et le sens \u00ab\u00a0<em>closewise\u00bb<\/em>). Cet ordre va d\u00e9finir <strong>dans quel sens<\/strong> est orient\u00e9 la <strong>normale<\/strong> du triangle en question (voir l&rsquo;article sur la normale).<\/p>\n<p><a href=\"https:\/\/anthropoya.cluster014.ovh.net\/blog-informatique\/wp-content\/uploads\/2016\/02\/clock_wise.png\"><img decoding=\"async\" loading=\"lazy\" class=\"alignnone  wp-image-4926\" src=\"https:\/\/anthropoya.cluster014.ovh.net\/blog-informatique\/wp-content\/uploads\/2016\/02\/clock_wise.png\" alt=\"clock_wise\" width=\"314\" height=\"190\" srcset=\"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/wp-content\/uploads\/2016\/02\/clock_wise.png 761w, https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/wp-content\/uploads\/2016\/02\/clock_wise-300x182.png 300w, https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/wp-content\/uploads\/2016\/02\/clock_wise-624x379.png 624w\" sizes=\"(max-width: 314px) 100vw, 314px\" \/><\/a><\/p>\n<h4><span style=\"text-decoration: underline;\">Comment \u00e7a fonctionne ?<\/span><\/h4>\n<p>Soit le vecteur repr\u00e9sentant la <em>position<\/em> de la <strong>cam\u00e9ra<\/strong> <img src='https:\/\/s0.wp.com\/latex.php?latex=%5Cvec%7Bc%7D+&#038;bg=ffffff&#038;fg=000000&#038;s=2' alt='\\vec{c} ' title='\\vec{c} ' class='latex' \/> ; et le vecteur repr\u00e9sentant la position du <em>centre<\/em> du <strong>polygone<\/strong> \u00e0 tester <img src='https:\/\/s0.wp.com\/latex.php?latex=%5Cvec%7Bp%7D+&#038;bg=ffffff&#038;fg=000000&#038;s=2' alt='\\vec{p} ' title='\\vec{p} ' class='latex' \/>.<\/p>\n<p>On calcule donc le vecteur <img src='https:\/\/s0.wp.com\/latex.php?latex=%5Cvec%7Bv%7D+%3D+%5Cvec%7Bp%7D+-+%5Cvec%7Bc%7D+&#038;bg=ffffff&#038;fg=000000&#038;s=2' alt='\\vec{v} = \\vec{p} - \\vec{c} ' title='\\vec{v} = \\vec{p} - \\vec{c} ' class='latex' \/><\/p>\n<p>On a aussi le vecteur <strong>normal<\/strong> \u00e0 ce m\u00eame <em>polygone <img src='https:\/\/s0.wp.com\/latex.php?latex=%5Cvec%7Bn%7D+&#038;bg=ffffff&#038;fg=000000&#038;s=2' alt='\\vec{n} ' title='\\vec{n} ' class='latex' \/><\/em><\/p>\n<p><strong>Math\u00e9matiquement :<\/strong><\/p>\n<img src='https:\/\/s0.wp.com\/latex.php?latex=k+%3D+%5Cvec%7Bv%7D+%5Ccdot+%5Cvec%7Bn%7D+&#038;bg=ffffff&#038;fg=000000&#038;s=2' alt='k = \\vec{v} \\cdot \\vec{n} ' title='k = \\vec{v} \\cdot \\vec{n} ' class='latex' \/>\n<p>&nbsp;<\/p>\n<p>Si le <strong>produit scalaire<\/strong> <img src='https:\/\/s0.wp.com\/latex.php?latex=k+&#038;bg=ffffff&#038;fg=000000&#038;s=2' alt='k ' title='k ' class='latex' \/> est <em>positif<\/em> (en fait cela d\u00e9pend du type de culling) alors cela signifie que le triangle est orient\u00e9 dans le <strong>m\u00eame sens<\/strong> que la vue (il nous tourne le dos), et il peut donc \u00eatre \u00e9limin\u00e9 du rendu.<\/p>\n<p>Voil\u00e0 c&rsquo;est tout simple !<\/p>\n<p>Il faut savoir aussi que cet algorithme est g\u00e9r\u00e9 <strong>automatiquement<\/strong> par DirectX et la carte graphique.<\/p>\n<p>On peut le <strong>configurer<\/strong> comme suit :<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\nD3D10_RASTERIZER_DESC rasterizerState;\r\n\r\nrasterizerState.CullMode = D3D10_CULL_NONE;\r\nrasterizerState.FillMode = D3D10_FILL_SOLID;\r\nrasterizerState.FrontCounterClockwise = true;\r\n\r\nm_pd3dDevice-&gt;CreateRasterizerState(&amp;rasterizerState, &amp;m_pRasterizerState);\u00a0\u00a0 \u00a0\r\nm_pd3dDevice-&gt;RSSetState(m_pRasterizerState);\r\n\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p><strong>R\u00e9sum\u00e9 :<\/strong><\/p>\n<p>Pour conclure, le backface culling est<strong> l&rsquo;\u00e9limination des faces<\/strong> qui \u00ab\u00a0tournent le dos\u00a0\u00bb \u00e0 la cam\u00e9ra et que l&rsquo;on ne voit donc pas.<\/p>\n<p><strong>R\u00e9f\u00e9rences :<\/strong><\/p>\n<p>&#8211; http:\/\/jeux.developpez.com\/faq\/3d\/?page=culling<\/p>\n<p>&#8211; http:\/\/stackoverflow.com\/questions\/3595087\/opengl-newbie-question-what-is-back-face-culling<\/p>\n<p>&#8211; http:\/\/www.gamedev.net\/page\/resources\/_\/technical\/graphics-programming-and-theory\/3d-backface-culling-r1088<\/p>\n<p>&#8211; https:\/\/en.wikipedia.org\/wiki\/Back-face_culling<\/p>\n<p>&#8211; https:\/\/fr.wikipedia.org\/wiki\/D%C3%A9termination_des_surfaces_cach%C3%A9es<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Intro : La technique du back-face culling permet d&rsquo;ignorer le rendu des triangles qui ne sont pas visible par l&rsquo;observateur ou la cam\u00e9ra. Pr\u00e9requis : &#8211;\u00a0\u00a0Savoir ce qu&rsquo;est un produit scalaire Explications : Par exemple, les triangles de l&rsquo;int\u00e9rieur d&rsquo;un mod\u00e8le ou personnage ne seront pas rendu si l&rsquo;on rentre et se positionne dedans ! [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[19],"tags":[],"_links":{"self":[{"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=\/wp\/v2\/posts\/4829"}],"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=4829"}],"version-history":[{"count":59,"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=\/wp\/v2\/posts\/4829\/revisions"}],"predecessor-version":[{"id":5102,"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=\/wp\/v2\/posts\/4829\/revisions\/5102"}],"wp:attachment":[{"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=4829"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=4829"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=4829"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}