{"id":3519,"date":"2015-11-15T12:01:27","date_gmt":"2015-11-15T12:01:27","guid":{"rendered":"http:\/\/anthroponaute.fr\/blog-informatique\/?p=3519"},"modified":"2020-02-04T10:55:14","modified_gmt":"2020-02-04T10:55:14","slug":"le-langage-shader-hlsl","status":"publish","type":"post","link":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/?p=3519","title":{"rendered":"Le langage shader HLSL"},"content":{"rendered":"<p><a href=\"https:\/\/anthropoya.cluster014.ovh.net\/blog-informatique\/wp-content\/uploads\/2015\/11\/shader2.png\"><img decoding=\"async\" loading=\"lazy\" class=\"alignnone size-full wp-image-3534\" src=\"https:\/\/anthropoya.cluster014.ovh.net\/blog-informatique\/wp-content\/uploads\/2015\/11\/shader2.png\" alt=\"shader\" width=\"600\" height=\"359\" srcset=\"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/wp-content\/uploads\/2015\/11\/shader2.png 600w, https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/wp-content\/uploads\/2015\/11\/shader2-300x180.png 300w\" sizes=\"(max-width: 600px) 100vw, 600px\" \/><\/a><\/p>\n<p><strong>Intro :<\/strong><\/p>\n<p>Le HLSL signifie : <span style=\"font-size: small;\"><b>H<\/b><\/span>igh <strong>L<\/strong>evel <strong>S<\/strong>hading <strong>L<\/strong>anguage. C&rsquo;est un langage (qui a la m\u00eame syntaxe que le C) qui permet de programmer le processeur de la carte graphique afin d&rsquo;effectuer des algorithmes de rendus sp\u00e9cifiques.<\/p>\n<p><strong>Pr\u00e9requis :<\/strong><\/p>\n<p>&#8211; Savoir configurer DirectX 10<\/p>\n<p><strong>Explications :<\/strong><\/p>\n<p>Le HLSL permet de g\u00e9n\u00e9rer la diffusion de la lumi\u00e8re, la texture \u00e0 utiliser, les r\u00e9flexions et r\u00e9fractions, l&rsquo;ombrage, le d\u00e9placement de primitives et les effets post-traitement.<\/p>\n<p>C&rsquo;est un outil tr\u00e8s puissant qui permet de cr\u00e9er une vaste gamme d&rsquo;effets graphiques et esth\u00e9tiques pour les jeux modernes.<\/p>\n<p>Avant l&rsquo;existence du langage HLSL il fallait \u00e9crire les instructions en langage d&rsquo;assembleur pour la carte graphique.<\/p>\n<p>Un programme HLSL (en <strong>DirectX 11<\/strong>) est constitu\u00e9 par<strong> 5\u00a0\u00e9tapes<\/strong> de cha\u00eene rendu :<\/p>\n<p>&#8211; Le <em>vertex<\/em> shader<br \/>\n&#8211; Le <em>compute<\/em> shader<br \/>\n&#8211; Le <em>geometry<\/em> shader<br \/>\n<span style=\"line-height: 1.71429; font-size: 1rem;\">&#8211; Le <\/span><em style=\"line-height: 1.71429; font-size: 1rem;\">tessellation<\/em><span style=\"line-height: 1.71429; font-size: 1rem;\"> shader<br \/>\n<\/span><span style=\"line-height: 1.71429; font-size: 1rem;\">&#8211; Le <\/span><em style=\"line-height: 1.71429; font-size: 1rem;\">domain<\/em><span style=\"line-height: 1.71429; font-size: 1rem;\"> shader<br \/>\n<\/span><span style=\"line-height: 1.71429; font-size: 1rem;\">&#8211; Le <\/span><em style=\"line-height: 1.71429; font-size: 1rem;\">pixel<\/em><span style=\"line-height: 1.71429; font-size: 1rem;\"> shader<\/span><\/p>\n<p>Les <em>vertex<\/em> et <em>pixel<\/em> <em>shaders\u00a0<\/em>doivent \u00eatre <strong>obligatoirement<\/strong> programm\u00e9s ; les autres ne doivent <strong>pas \u00eatre n\u00e9cessairement<\/strong> \u00eatre programm\u00e9s.<\/p>\n<p><span style=\"text-decoration: underline;\">Le vertex shader :<\/span><\/p>\n<p>Le vertex shader op\u00e8re les transformations de rep\u00e8re, le <em>skinning<\/em> (l&rsquo;animation squelettale), le d\u00e9placement de vertex et le calcul d&rsquo;attributs de vertex pour les <em>materials<\/em>.<\/p>\n<p><span style=\"text-decoration: underline;\">Le pixel shader :<\/span><\/p>\n<p>Le pixel shader op\u00e8re le <em>blending<\/em>\u00a0de texturage, le calcul lumineux, etc&#8230;<\/p>\n<p><span style=\"text-decoration: underline;\">Exemple :<\/span><\/p>\n<p>Voici quelques fonctions <strong>intrins\u00e8ques<\/strong> utilisables dans le HLSL :<\/p>\n<p><em>abs(x)<\/em> : valeur absolue<br \/>\n<em>ceil(x)<\/em> : retourne le plus petit entier qui est \u00e9gale ou sup\u00e9rieur \u00e0 x<br \/>\n<em>clamp(x, min, max)<\/em> : retourne x dans l&rsquo;intervalle [min, max]<br \/>\n<em>cos(x)<\/em> : retourne le cosinus de x<br \/>\n<em>clip<\/em>(x) : ignore le pixel en cours si x est inf\u00e9rieur \u00e0 0<br \/>\n<em>cross(x, y)<\/em> : retourne le produit vectoriel de deux vecteurs 3D<br \/>\n<em>dot(x, y)<\/em> : retourne le produit scalaire de deux vecteurs<br \/>\n<em>length(v)<\/em> : retourne la longueur du vecteur v<br \/>\n<em>lerp(x, y, s)<\/em> : retourne x + s(y &#8211; x)<br \/>\n<em>normalize(x)<\/em> : retourne un vecteur normalis\u00e9<br \/>\n<em>max(x, y)<\/em> : retourne le plus grand entier entre x et y<br \/>\n<em>min(x, y)<\/em> : retourne le plus petit entier entre x et y<br \/>\n<em>mul(x, y)<\/em> : retourne la multiplication des matrices x et y<br \/>\n<em>reflect(i, n)<\/em> : retourne un vecteur de reflection en utilisant le rayon d&rsquo;insidence et la normale \u00e0 la surface<br \/>\n<em>refract(i, n, \u03b7)<\/em> : retourne un vecteur de refraction en utilisant un rayon d&rsquo;entr\u00e9e, la normale \u00e0 la surface, et un index de refraction<br \/>\n<em>saturate(x)<\/em> : clamp entre les valeurs 0 et 1<br \/>\n<em>sqrt(x)<\/em> : retourne la racine carr\u00e9e de x<br \/>\n<em>transpose(x)<\/em> : retourne la matrice transpos\u00e9e de x<br \/>\n<em>tex2D(s, t)<\/em> : retourne une texture sampl\u00e9e<\/p>\n<p>&nbsp;<\/p>\n<hr \/>\n<p>&nbsp;<\/p>\n<p>Les <strong>variables globales<\/strong> se d\u00e9clarent et se d\u00e9finissent ainsi\u00a0:<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\nstatic const float2 bodyTexSize = {512, 512};\r\nstatic const float2 faceLowerTexSize = {256, 128};\r\nstatic const float2 faceUpperTexSize = {256, 64};\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p>Voici un <strong>petit exemple<\/strong> d&rsquo;un programme \u00e9crit en HLSL qui cr\u00e9\u00e9 un effet \u00ab\u00a0bois\u00a0\u00bb proc\u00e9dural en tant que texture.<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\nmatrix WorldViewProjMatrix;\r\nmatrix TextureMatrix;\r\n\r\nstruct VS_OUTPUT\r\n{\r\n\tfloat4 Pos : POSITION;\r\n\tfloat3 Pshade : TEXCOORD0;\r\n};\r\n\r\nVS_OUTPUT main (float4 vPosition : POSITION)\r\n{\r\n\tVS_OUTPUT Out = (VS_OUTPUT) 0; \r\n\r\n\t\/\/ Transforme la position du vertex vers l'espace 2D de l'\u00e9cran\r\n\tOut.Pos = mul (WorldViewProjectionMatrix, vPosition);\r\n\r\n\t\/\/ Transforme les coordonn\u00e9es de la texture\r\n\tOut.Pshade = mul (texture_matrix0, vPosition);\r\n\r\n\treturn Out;\r\n}\r\n<\/pre>\n<h4><span style=\"text-decoration: underline;\">Comment cr\u00e9er un effet shader \u00e0 parti d&rsquo;un fichier .fx :<\/span><strong><br \/>\n<\/strong><\/h4>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\nHRESULT D3DX10CreateEffectFromFile(\r\n\u00a0 _In_\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LPCTSTR\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 pFileName, \/\/ Nom du fichier shader .fx\r\n\u00a0 _In_\u00a0 const D3D10_SHADER_MACRO *pDefines, \/\/ Liste de macros\u00a0 (peut \u00eatre mis \u00e0 nullptr)\r\n\u00a0 _In_\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ID3D10Include\u00a0\u00a0\u00a0\u00a0\u00a0 *pInclude, \/\/ Inteface d'include (peut \u00eatre mis \u00e0 nullptr)\r\n\u00a0 _In_\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LPCSTR\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 pProfile, \/\/ Sp\u00e9cifie le profile ; ex : &quot;fx_4_0&quot;\r\n\u00a0 _In_\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 UINT\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 HLSLFlags, \/\/ Options du compilateur\r\n\u00a0 _In_\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 UINT\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 FXFlags, \/\/ Options de l'effet shader\r\n\u00a0 _In_\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ID3D10Device\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 *pDevice, \/\/ Le device de DirectX 10.1\r\n\u00a0 _In_\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ID3D10EffectPool\u00a0\u00a0 *pEffectPool,\r\n\u00a0 _In_\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ID3DX10ThreadPump\u00a0 *pPump,\r\n\u00a0 _Out_\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ID3D10Effect\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 **ppEffect, \/\/ Pointeur de retour vers l'effet cr\u00e9\u00e9\r\n\u00a0 _Out_\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ID3D10Blob\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 **ppErrors, \/\/ Pointeur de retour vers un objet repr\u00e9sentant les erreurs\r\n\u00a0 _Out_\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 HRESULT\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 *pHResult\r\n);\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p><strong>R\u00e9sum\u00e9 :<\/strong><\/p>\n<p>Le langage shader HLSL est un outil tr\u00e8s puissant pour le rendu graphique des jeux vid\u00e9o.<\/p>\n<p>Tous les effets graphiques dans les jeux DirectX d&rsquo;aujourd&rsquo;hui sont construits \u00e0 partir de fichier script\u00a0shader\u00a0HLSL.<\/p>\n<p><strong>R\u00e9f\u00e9rences :<\/strong><\/p>\n<p>&#8211; http:\/\/www.neatware.com\/lbstudio\/web\/hlsl.html<\/p>\n<p>&#8211;\u00a0https:\/\/msdn.microsoft.com\/fr-fr\/library\/ms810449.aspx<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Intro : Le HLSL signifie : High Level Shading Language. C&rsquo;est un langage (qui a la m\u00eame syntaxe que le C) qui permet de programmer le processeur de la carte graphique afin d&rsquo;effectuer des algorithmes de rendus sp\u00e9cifiques. Pr\u00e9requis : &#8211; Savoir configurer DirectX 10 Explications : Le HLSL permet de g\u00e9n\u00e9rer la diffusion de [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[13],"tags":[],"_links":{"self":[{"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=\/wp\/v2\/posts\/3519"}],"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=3519"}],"version-history":[{"count":66,"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=\/wp\/v2\/posts\/3519\/revisions"}],"predecessor-version":[{"id":5902,"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=\/wp\/v2\/posts\/3519\/revisions\/5902"}],"wp:attachment":[{"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=3519"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=3519"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=3519"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}