<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	>

<channel>
	<title>Blog MTI</title>
	<atom:link href="http://www.mti.epita.fr/blogs/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.mti.epita.fr/blogs</link>
	<description>Multimédia et Technologies de l'Information</description>
	<pubDate>Tue, 16 Mar 2010 06:00:38 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.6.5</generator>
	<language>fr</language>
			<item>
		<title>Découverte d’ASP.NET MVC 1.0</title>
		<link>http://www.mti.epita.fr/blogs/2010/03/16/decouverte-d%e2%80%99aspnet-mvc-10/</link>
		<comments>http://www.mti.epita.fr/blogs/2010/03/16/decouverte-d%e2%80%99aspnet-mvc-10/#comments</comments>
		<pubDate>Tue, 16 Mar 2010 06:00:38 +0000</pubDate>
		<dc:creator>Baptiste Courtois</dc:creator>
		
		<category><![CDATA[.Net]]></category>

		<category><![CDATA[Microsoft]]></category>

		<category><![CDATA[Web]]></category>

		<category><![CDATA[ASP]]></category>

		<category><![CDATA[MVC]]></category>

		<guid isPermaLink="false">http://www.mti.epita.fr/blogs/?p=5598</guid>
		<description><![CDATA[Le patron de conception MVC ou Modèle – Vue – Contrôleur a été créé en 1979, au temps ou Internet n’était même pas au stade de projet. C’est pourtant les sites web qui plus tard ont fait le succès de ce pattern, un des plus connus et utilisés par les développeurs web. On retrouve en [...]]]></description>
			<content:encoded><![CDATA[<p>Le patron de conception MVC ou Modèle – Vue – Contrôleur a été créé en 1979, au temps ou Internet n’était même pas au stade de projet. C’est pourtant les sites web qui plus tard ont fait le succès de ce pattern, un des plus connus et utilisés par les développeurs web. On retrouve en effet MVC dans de nombreux Framework web, pour la majorité des langages utilisés. De ce fait Microsoft a créé il y a peu le Framework ASP.NET MVC, véritable surcouche au Framework ASP.NET qui utilise pleinement ledit pattern.</p>
<p><a href="http://www.mti.epita.fr/blogs/wp-content/uploads/2009/08/article_mvc.pdf">L'Article ASP .NET</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.mti.epita.fr/blogs/2010/03/16/decouverte-d%e2%80%99aspnet-mvc-10/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Identité Graphique</title>
		<link>http://www.mti.epita.fr/blogs/2010/03/13/identite-graphique/</link>
		<comments>http://www.mti.epita.fr/blogs/2010/03/13/identite-graphique/#comments</comments>
		<pubDate>Sat, 13 Mar 2010 06:00:43 +0000</pubDate>
		<dc:creator>orvill_c</dc:creator>
		
		<category><![CDATA[Autres]]></category>

		<category><![CDATA[Design]]></category>

		<category><![CDATA[Graphisme]]></category>

		<category><![CDATA[identite]]></category>

		<guid isPermaLink="false">http://www.mti.epita.fr/blogs/?p=3406</guid>
		<description><![CDATA[Le but principal de cet article est  de décrire ce qu’est le « graphisme » d’un projet et  de mettre en avant l’importance de la mise en œuvre d’une identité graphique, il n’y aura donc aucune installation à faire.
Il sera abordé:

Des définitions
L'élaboration d'une identité graphique

Télecharger le fichier
]]></description>
			<content:encoded><![CDATA[<p>Le but principal de cet article est  de décrire ce qu’est le « graphisme » d’un projet et  de mettre en avant l’importance de la mise en œuvre d’une identité graphique, il n’y aura donc aucune installation à faire.</p>
<p>Il sera abordé:</p>
<ol>
<li>Des définitions</li>
<li>L'élaboration d'une identité graphique</li>
</ol>
<p><a href="http://www.mti.epita.fr/blogs/wp-content/uploads/pdf_logo.gif"><img class="alignnone size-medium wp-image-406" title="pdf_logo" src="http://www.mti.epita.fr/blogs/wp-content/uploads/pdf_logo.gif" alt="" width="48" height="51" /></a><a href="http://www.mti.epita.fr/blogs/wp-content/uploads/2009/04/identite-graphique1.pdf">Télecharger le fichier</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.mti.epita.fr/blogs/2010/03/13/identite-graphique/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Encoder vos vidéos avec VirtualDub</title>
		<link>http://www.mti.epita.fr/blogs/2010/03/10/encoder-vos-videos-avec-virtualdub/</link>
		<comments>http://www.mti.epita.fr/blogs/2010/03/10/encoder-vos-videos-avec-virtualdub/#comments</comments>
		<pubDate>Wed, 10 Mar 2010 15:36:34 +0000</pubDate>
		<dc:creator>Jean-Charles Pin</dc:creator>
		
		<category><![CDATA[Autres]]></category>

		<category><![CDATA[Audio]]></category>

		<category><![CDATA[compression]]></category>

		<category><![CDATA[Encoder]]></category>

		<category><![CDATA[tutorial]]></category>

		<category><![CDATA[video]]></category>

		<category><![CDATA[VirtualDub]]></category>

		<guid isPermaLink="false">http://www.mti.epita.fr/blogs/?p=5243</guid>
		<description><![CDATA[La compression vidéo est un procédé incontournable dans la vie de tous les jours. Qui dit compression vidéo, dit encodage vidéo. Nous allons donc voir différentes manières et astuces pour encoder vos vidéos à travers le logiciel VirtualDub. Pourquoi celui-là et pas un autre ? Pour la simple et bonne raison qu’il se positionne actuellement [...]]]></description>
			<content:encoded><![CDATA[<p>La compression vidéo est un procédé incontournable dans la vie de tous les jours. Qui dit compression vidéo, dit encodage vidéo. Nous allons donc voir différentes manières et astuces pour encoder vos vidéos à travers le logiciel <em>VirtualDub</em>. Pourquoi celui-là et pas un autre ? Pour la simple et bonne raison qu’il se positionne actuellement comme le plus performant et le plus complet des logiciels gratuits d’encodage.</p>
<p>Il présente tellement de fonctionnalités, que nous n'aborderons qu’une petite partie de ces possibilités, afin de prendre en main ce logiciel. Nous verrons donc comment encoder indépendamment le flux vidéo et le flux audio.</p>
<p><span id="more-5243"></span></p>
<h2>Encoder les flux vidéo et audio</h2>
<h3>Le flux vidéo</h3>
<p>Dans cette partie, nous allons voir comment encoder le flux vidéo. Avant toute chose, vous devez sélectionner le mode « Full processing mode » afin de spécifier au logiciel que vous allez personnaliser l’encodage vidéo :</p>
<div style="text-align: center;"><a href="http://www.mti.epita.fr/blogs/wp-content/uploads/2009/07/video_mode.png"><img class="alignnone size-medium wp-image-5248" style="text-align: center" title="video_mode" src="http://www.mti.epita.fr/blogs/wp-content/uploads/2009/07/video_mode-300x283.png" alt="" width="300" height="283" /></a></div>
<p>Une fois ceci réalisé, nous allons indiquer à <em>VirtualDub</em> le format de sortie désiré. Pour ce faire, allez dans l’onglet « Video » et cliquez sur « Compression… » :</p>
<div style="text-align: center;"><a href="http://www.mti.epita.fr/blogs/wp-content/uploads/2009/07/video_compression.png"><img class="alignnone size-medium wp-image-5251" style="text-align: center" title="video_compression" src="http://www.mti.epita.fr/blogs/wp-content/uploads/2009/07/video_compression-300x283.png" alt="" width="300" height="283" /></a></div>
<p>Une nouvelle fenêtre apparaît alors. Cette dernière regroupe l’ensemble des formats vidéo vers lesquels vous pouvez encoder votre vidéo. Bien évidemment, cette liste dépend de votre configuration et donc des codecs vidéo installés sur votre ordinateur. Si vous ne trouvez pas le format de sortie souhaité, vous pouvez alors vous rendre sur des sites spécialisés et télécharger le codec correspondant.</p>
<div style="text-align: center;"><a href="http://www.mti.epita.fr/blogs/wp-content/uploads/2009/07/video_window.png"><img class="alignnone size-medium wp-image-5252" style="text-align: center" title="video_window" src="http://www.mti.epita.fr/blogs/wp-content/uploads/2009/07/video_window-300x176.png" alt="" width="300" height="176" /></a></div>
<p>Dans cet exemple, nous allons choisir le codec « XviD MPEG-4 ». En effet, ce dernier est très répandu et offre un rapport poids/qualité très correct.</p>
<p>Cliquez ensuite sur « OK » et vous en avez fini pour le flux vidéo.</p>
<h3>Le flux audio</h3>
<p>L’encodage du flux audio est très similaire à celui du flux vidéo. La première étape consiste également à sélectionner le mode « Full processing mode », pour les mêmes raisons citées précédemment.</p>
<div style="text-align: center;"><a href="http://www.mti.epita.fr/blogs/wp-content/uploads/2009/07/audio_mode.png"><img class="alignnone size-medium wp-image-5254" style="text-align: center" title="audio_mode" src="http://www.mti.epita.fr/blogs/wp-content/uploads/2009/07/audio_mode-300x251.png" alt="" width="300" height="251" /></a></div>
<p>Ensuite, pour déterminer le format de sortie, allez dans l’onglet « Audio », puis « Compression… »</p>
<div style="text-align: center;"><a href="http://www.mti.epita.fr/blogs/wp-content/uploads/2009/07/audio_compression.png"><img class="alignnone size-medium wp-image-5256" style="text-align: center" title="audio_compression" src="http://www.mti.epita.fr/blogs/wp-content/uploads/2009/07/audio_compression-300x251.png" alt="" width="300" height="251" /></a></div>
<p>Une fois cette opération effectuée, une nouvelle fenêtre apparaît avec tous les formats audio disponibles. Comme expliqué précédemment, ils dépendent toujours de votre configuration. Dans le cadre de cet exemple, nous allons choisir le format MP3, le plus répandu.</p>
<div style="text-align: center;"><a href="http://www.mti.epita.fr/blogs/wp-content/uploads/2009/07/audio_window.png"><img class="alignnone size-medium wp-image-5257" style="text-align: center" title="audio_window" src="http://www.mti.epita.fr/blogs/wp-content/uploads/2009/07/audio_window-300x229.png" alt="" width="300" height="229" /></a></div>
<p>Après avoir cliqué sur « MPEG Layer-3 », nous pouvons constater que dans la partie droite de la fenêtre se trouvent de nombreuses caractéristiques ; ces dernières correspondent au débit et la fréquence d'échantillonnage du flux audio. Elles vont influencer sur le poids et sur la qualité du son de sortie. Si vous n'avez le choix que jusqu'à un débit de 56 kBit/s, c'est qu'il vous faut télécharger un codec MP3 complet et non bridé (comme c’est le cas ici).</p>
<p>Une fois ces caractéristiques définies, cliquez sur « OK » pour terminer le choix de l’encodage du flux audio.</p>
<h3>Enregistrer le fichier</h3>
<p>Une fois arrivé à cette étape, vous avez déterminé l’ensemble des formats de sortie et leurs réglages. Cependant, le traitement n’a pas encore été effectué. Pour ce faire, allez dans l’onglet « File » et cliquez sur « Save as AVI… ». Spécifiez un nom de sortie et attendez… En effet, selon le type d’encodage, la configuration de votre ordinateur et la durée de la vidéo, cela peut prendre de nombreuses minutes.</p>
<div style="text-align: center;"><a href="http://www.mti.epita.fr/blogs/wp-content/uploads/2009/07/file_save.png"><img class="alignnone size-medium wp-image-5258" style="text-align: center" title="file_save" src="http://www.mti.epita.fr/blogs/wp-content/uploads/2009/07/file_save-253x300.png" alt="" width="253" height="300" /></a></div>
<h3>Remarque</h3>
<p>Dans cet exemple, nous avons à la fois encodé le flux vidéo ET le flux audio. Cependant, nous ne sommes pas obligés de réaliser cela, et il peut s’avérer parfois très utile d’encoder qu’un seul des deux flux. Reprenons par exemple le cas de la vidéo précédente, en décidant d’encoder seulement le flux vidéo, car le flux audio est déjà dans le format souhaité. La première partie (l’encodage du flux vidéo) va donc se dérouler de la même façon que précédemment. En ce qui concerne le flux audio, il faut préciser au logiciel que l’on souhaite garder le flux déjà existant. Pour ce faire, allez dans l’onglet « Audio » et cliquez sur « Direct stream copy » :</p>
<div style="text-align: center;"><a href="http://www.mti.epita.fr/blogs/wp-content/uploads/2009/07/audio_stream.png"><img class="alignnone size-medium wp-image-5259" style="text-align: center" title="audio_stream" src="http://www.mti.epita.fr/blogs/wp-content/uploads/2009/07/audio_stream-300x251.png" alt="" width="300" height="251" /></a></div>
<p>Bien évidemment, cette étape fonctionne également dans le sens inverse, c’est-à-dire dans le cas où l’on souhaite seulement encoder le flux audio, et garder le flux vidéo courant.</p>
<p>Nous savons donc maintenant encoder :</p>
<ul>
<li>le flux vidéo uniquement,</li>
<li>le flux audio uniquement,</li>
<li>les flux vidéo et audio.</li>
</ul>
<h2>Conclusion</h2>
<p><em>VirtualDub</em> est un logiciel vidéo très puissant, apportant d’innombrables possibilités. Avec ce tutoriel de prise en main, nous n’avons pu voir qu’une partie des fonctionnalités de ce merveilleux utilitaire. Je vous invite donc à approfondir vos connaissances dans ce sujet en le manipulant sans modération !</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mti.epita.fr/blogs/2010/03/10/encoder-vos-videos-avec-virtualdub/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Les VPN</title>
		<link>http://www.mti.epita.fr/blogs/2010/03/07/les-vpn/</link>
		<comments>http://www.mti.epita.fr/blogs/2010/03/07/les-vpn/#comments</comments>
		<pubDate>Sun, 07 Mar 2010 14:31:52 +0000</pubDate>
		<dc:creator>Jean-Charles Pin</dc:creator>
		
		<category><![CDATA[Autres]]></category>

		<category><![CDATA[Web]]></category>

		<category><![CDATA[LAN]]></category>

		<category><![CDATA[TUNNELING]]></category>

		<category><![CDATA[VPN]]></category>

		<guid isPermaLink="false">http://www.mti.epita.fr/blogs/?p=6386</guid>
		<description><![CDATA[Introduction
Les réseaux locaux d'entreprise (LAN : Local Area Network ou RLE: Réseau Local d'Entreprise) sont des réseaux internes à une organisation. Cela signifie que les liaisons entre les différentes machines appartiennent à cette même organisation (cf. figure 0.1).

Avec l’évolution du World Wide Web, ces réseaux sont de plus en plus souvent reliés à Internet par [...]]]></description>
			<content:encoded><![CDATA[<h1>Introduction</h1>
<p>Les réseaux locaux d'entreprise (LAN : Local Area Network ou RLE: Réseau Local d'Entreprise) sont des réseaux internes à une organisation. Cela signifie que les liaisons entre les différentes machines appartiennent à cette même organisation (cf. figure 0.1).</p>
<div id="attachment_6381" class="wp-caption alignnone" style="width: 261px"><a href="http://www.mti.epita.fr/blogs/wp-content/uploads/2009/12/1-lan.png"><img class="size-full wp-image-6381" title="LAN" src="http://www.mti.epita.fr/blogs/wp-content/uploads/2009/12/1-lan.png" alt="Figue 0.1 - Exemple d’une LAN de typologie étoile." width="251" height="275" /></a><p class="wp-caption-text">Figue 0.1 - Exemple d’une LAN de typologie étoile.</p></div>
<p><span id="more-6386"></span></p>
<p>Avec l’évolution du World Wide Web, ces réseaux sont de plus en plus souvent reliés à Internet par l'intermédiaire d'équipements d'interconnexion (concentrateurs, ponts...). Il arrive alors fréquemment que des entreprises éprouvent le besoin de communiquer avec des filiales, des clients ou même du personnel géographiquement éloignés via Internet.</p>
<p>Pour autant, les données transmises sur Internet sont beaucoup plus vulnérables que lorsqu'elles circulent sur un réseau interne à une organisation. En effet, le chemin emprunté n'est pas défini à l'avance, ce qui signifie que les données empruntent une infrastructure réseau publique appartenant à différents opérateurs. Ainsi, il n'est pas impossible que sur le chemin parcouru, le réseau soit écouté par un utilisateur indiscret ou même détourné (cf. figure 0.2). Il n'est donc pas imaginable de transmettre des informations sensibles pour l'organisation ou l'entreprise, dans de telles conditions.</p>
<div id="attachment_6382" class="wp-caption alignnone" style="width: 510px"><a href="http://www.mti.epita.fr/blogs/wp-content/uploads/2009/12/2-lan_internet.png"><img class="size-full wp-image-6382" title="LAN INTERNET" src="http://www.mti.epita.fr/blogs/wp-content/uploads/2009/12/2-lan_internet.png" alt="Figure 0.2 - Pirate écoutant le réseau reliant les divers pôles d’une entreprise via Internet." width="500" height="157" /></a><p class="wp-caption-text">Figure 0.2 - Pirate écoutant le réseau reliant les divers pôles d’une entreprise via Internet.</p></div>
<p>La première solution pour répondre à ce besoin de communication sécurisé consiste à relier les réseaux distants à l'aide de lignes spécialisées. Une ligne spécialisée est en fait une liaison permanente reliant deux points ensemble. Contrairement au réseau téléphonique commuté (i.e. l'ADSL) où les ressources sont partagées, une ligne spécialisée ne fait aucun partage en dehors de cette liaison. Ce genre de lien garantit qu'aucune entité tierce ne peut physiquement avoir accès aux données circulant à travers la ligne. Toutefois, la plupart des entreprises ne peuvent pas (par soucis techniques ou de prix) se permettre de relier deux réseaux locaux distants par une ligne spécialisée.</p>
<p>Un bon compromis consiste à utiliser Internet comme support de transmission en utilisant un protocole encapsulant les données à transmettre de façon chiffrée. On parle alors de réseau privé virtuel : VPN, pour Virtual Private Network.</p>
<h1>Le concept de réseau virtuel privé</h1>
<p>Ce type de réseau est dit « virtuel » car il fait la liaison entre deux réseaux physiques (réseaux locaux par exemple) à l'aide d'un réseau non fiable, Internet par exemple (cf. figure 1.1). En ce qui concerne le terme « privé », cela vient du fait que seuls les ordinateurs des réseaux locaux de part et d'autre du VPN peuvent « voir » les données.</p>
<p>Un système VPN permet de mettre en place une liaison sécurisée à moindre coût (cependant, cela dépend aussi des équipements terminaux utilisés). En contrepartie, il ne permet pas d'assurer une qualité de service comparable à une ligne spécialisée dans la mesure où le réseau physique est public et donc non garanti.</p>
<div id="attachment_6383" class="wp-caption alignnone" style="width: 510px"><a href="http://www.mti.epita.fr/blogs/wp-content/uploads/2009/12/3-vpn.png"><img class="size-full wp-image-6383" title="VPN" src="http://www.mti.epita.fr/blogs/wp-content/uploads/2009/12/3-vpn.png" alt="Figure 1.1 - Schéma représentant un réseau utilisant un système de réseau privé virtuel." width="500" height="400" /></a><p class="wp-caption-text">Figure 1.1 - Schéma représentant un réseau utilisant un système de réseau privé virtuel.</p></div>
<p>Un système de VPN est censé mettre en oeuvre les fonctionnalités suivantes :</p>
<ul>
<li>authentification d'utilisateur. Seuls les utilisateurs autorisés doivent pouvoir s'identifier sur le réseau virtuel. De plus, un historique des connexions et des actions effectuées sur le réseau doit être conservé.</li>
<li>gestion d'adresses. Chaque client sur le réseau doit avoir une adresse privée. Cette adresse privée doit rester confidentielle. Un nouveau client doit pouvoir se connecter facilement au réseau et recevoir une adresse.</li>
<li>cryptage des données. Lors de leurs transports sur le réseau public, les données doivent être protégées par un cryptage efficace.</li>
<li>gestion de clés. Les clés de cryptage pour le client et le serveur doivent pouvoir être générées et régénérées.</li>
<li>prise en charge multiprotocole. La solution VPN doit supporter les protocoles les plus utilisés sur les réseaux publics en particulier IP.</li>
</ul>
<p>Le VPN est un principe, il ne décrit pas l'implémentation effective de ces caractéristiques. C'est pourquoi il existe plusieurs produits différents sur le marché dont certains sont devenus standard, et même considérés comme des normes.</p>
<h1>Fonctionnement d'un VPN</h1>
<p>Les réseaux privés virtuels reposent sur la sécurité des données transmises au sein d'un réseau. Afin de rendre ces données sûres, il est nécessaire d'utiliser des algorithmes de cryptologie. Ces algorithmes sont regroupés dans ce que l'on appelle un « protocole de tunneling ». Ce protocole permet ainsi de sécuriser toutes les données qui transitent sur le réseau.</p>
<p>Lorsque l'on parle de VPN, on retrouve souvent le terme de « tunnel ». En effet, un réseau privé virtuel peut être assimilé à un tunnel dans lequel transitent des données. Le tunnel symbolise ici le fait qu'entre l'entrée et la sortie d'un VPN les données sont cryptées et, de ce fait, elles sont incompréhensibles par n'importe quelle personne située entre les deux extrémités. Dans le cas d'une connexion VPN entre deux machines, on appelle « client VPN » l'élément permettant de chiffrer/déchiffrer les données du côté utilisateur et « serveur VPN » le même élément du côté de l'organisation.</p>
<p>Voici un descriptif de la façon de communiquer d'un VPN :</p>
<ul>
<li>un utilisateur éprouve le besoin d'accéder au réseau privé virtuel d'une organisation (afin d'utiliser une ressource par exemple),</li>
<li>sa requête est alors transmise en clair au système passerelle (qui peut être une solution hardware ou software),</li>
<li>celui-ci se connecte au réseau distant par l'intermédiaire d'une infrastructure réseau public (non sûre) puis transmet la requête de façon chiffrée,</li>
<li>le serveur VPN (côté organisation) récupère cette requête puis la déchiffre et répond alors à l'utilisateur de façon chiffrée,</li>
<li>une fois la réponse reçue côté utilisateur, le système passerelle n'a plus qu'à déchiffrer et restituer les informations en clair à l'utilisateur.</li>
</ul>
<p>Voilà de façon très synthétique le fonctionnement d'un échange au travers d'une connexion VPN. L'ensemble des réseaux privés virtuels est basé sur un protocole de tunneling. C'est ce protocole qui techniquement donne tout son sens au terme de « tunnel » (les différents protocoles de tunneling sont traités dans la suite du document).</p>
<p>Il existe deux façons de mettre en pratique un VPN :</p>
<ul>
<li>la façon « LAN to LAN »,</li>
<li>la façon « RoadWarrior ».</li>
</ul>
<p>Un VPN de type « LAN to LAN » est assez proche du terme de « réseau virtuel ». En effet, cette pratique consiste à relier deux réseaux locaux (géographiquement éloignés) en un seul (cf. figure 2.1). Ce genre de VPN a pour vocation d'être permanent. Il convient donc, dans ce genre de cas, d'être très vigilant quant à la sécurité du tunnel ainsi créé. En effet, les échanges entre les deux réseaux étant permanents, un pirate aura plus de matière pour décoder les données qui transitent.</p>
<div id="attachment_6384" class="wp-caption alignnone" style="width: 509px"><a href="http://www.mti.epita.fr/blogs/wp-content/uploads/2009/12/4-vpn_lan_to_lan.png"><img class="size-full wp-image-6384" title="VPN LAN TO LAN" src="http://www.mti.epita.fr/blogs/wp-content/uploads/2009/12/4-vpn_lan_to_lan.png" alt="Figure 2.1 - Représentation d'un VPN de type « LAN to LAN »." width="499" height="160" /></a><p class="wp-caption-text">Figure 2.1 - Représentation d&#39;un VPN de type « LAN to LAN ».</p></div>
<p>En ce qui concerne un VPN de type « RoadWarrior », le principe est assez différent. En effet, dans ce cas de figure, un tunnel est créé entre un utilisateur distant et un réseau (cf. figure 2.2). Avec ce type de VPN, un employé a la possibilité d'accéder au réseau interne de son entreprise quelque soit sa localisation géographique. Il s'agit ici d'un VPN temporaire qui n'est pas destiné à être fixe. La connexion n'étant pas permanente, l'importance de la sécurité est « moindre » (bien qu'elle soit ici aussi importante).</p>
<div id="attachment_6385" class="wp-caption alignnone" style="width: 510px"><a href="http://www.mti.epita.fr/blogs/wp-content/uploads/2009/12/5-vpn_road_warrior.png"><img class="size-full wp-image-6385" title="VPN ROAD WARRIOR" src="http://www.mti.epita.fr/blogs/wp-content/uploads/2009/12/5-vpn_road_warrior.png" alt="Figure 2.2 - Représentation d'un VPN de type « RoadWarrior »." width="500" height="165" /></a><p class="wp-caption-text">Figure 2.2 - Représentation d&#39;un VPN de type « RoadWarrior ».</p></div>
<h1>Protocoles de tunneling</h1>
<p>La réalisation d'un tunnel à travers un réseau consiste, globalement, à établir et à maintenir une connexion logique entre deux points. A travers cette connexion, on envoie différentes données à l'aide d'un protocole VPN (dit de « tunneling »). Les VPNs supportent différentes fonctionnalités telles que l'encryptage ou encore l'authentification afin d'assurer la sécurité des données qui transitent dans les tunnels établis.</p>
<p>Il existe deux types de tunneling :</p>
<ul>
<li>le tunneling dit « volontaire ». Dans ce cas, le tunnel est basé sur un client VPN qui doit réaliser la connexion, créer le tunnel pour finalement l'utiliser. Avec ce genre de tunneling l'utilisateur doit gérer le type de connectivité et c'est à lui de démarrer et d'arrêter le client VPN.</li>
<li>le tunneling dit « transparent ». Celui-ci est basé sur un équipement matériel ou logiciel qui gère la connexion à l'insu de l'utilisateur. Celui-ci l'utilise d'une manière transparente et ne voit en aucun cas qu'il passe par un tunnel. Toutes les actions se font de manière transparente.</li>
</ul>
<p>Parmi les protocoles tunneling les plus utilisés, on retrouve : PPTP, L2TP, IPSec ou encore SSL. Ces protocoles sont incompatibles entre eux, cela signifie que les deux extrémités du tunnel doivent être définies pour supporter le même protocole. Il est donc impossible d'utiliser deux protocoles différents pour une même connexion.</p>
<p>Nous aborderons ces différents protocoles dans la seconde partie de l’article.</p>
<h1>Avantages et inconvénients d'un VPN</h1>
<h2>Avantages</h2>
<p>La technologie VPN présente deux avantages principaux. Tout d'abord, cette technologie permet de réduire grandement les coûts relatifs à la connectivité. En effet, il n'est plus nécessaire d'établir des connexions longues distances via des lignes privées (très coûteuses), il suffit d'implémenter des tunnels VPN afin de réaliser un réseau privé à travers Internet.</p>
<p>Le second avantage est la flexibilité de cette solution. Par exemple, dans le cadre d'une organisation ayant plusieurs localisations géographiquement éloignées, il est très facile d'ajouter un nouveau site. Pour cela, il suffit de le connecter à Internet et de l'inclure sur le VPN de l'organisation.</p>
<h2>Inconvénients</h2>
<p>Cette technologie apporte des avantages non négligeables. Cependant comme toute technologie, elle a ses limites. Tout d'abord, on peut souligner le fait que la disponibilité et les performances d'un VPN dépendent en grande partie des fournisseurs de services et autres sous-traitants. Une organisation utilisant une architecture VPN ne contrôle pas tous les paramètres.</p>
<p>Deuxièmement, l'établissement d'un VPN réclame une forte expertise et une bonne compréhension de la sécurité informatique. Il est aussi nécessaire de bien connaître les technologies VPN (différents protocoles, solutions hardware et software...) afin de déterminer la solution la plus adaptée.</p>
<p>Pour finir, les technologies VPN ne suivent pas de normes bien spécifiques, c'est pourquoi il est souvent inévitable d'utiliser des équipements provenant d'un même constructeur afin d'assurer un bon fonctionnement.</p>
<h1>Conclusion</h1>
<p>Les réseaux privés virtuels sont nés de la nécessité, qu'ont de nombreuses organisations, de relier des sites géographiquement éloignés. En effet, ces organisations ont, pour la plupart, besoin d'un transfert de données confidentiel permettant de partager des informations sensibles. Cependant, l'établissement d'une connexion directe entre les différents sites est très coûteux, voire inabordable. D'où la création de ce type de réseau.</p>
<p>La technologie VPN permet de transmettre des informations de façon sécurisée au sein d'un réseau qui, lui, ne l'est pas. La majeure partie des VPNs utilise Internet comme réseau d'interconnexion. Il permet d'éviter l'utilisation de lignes spécialisées si coûteuses.</p>
<p>La technologie VPN n'est pas spécifiquement établie. En effet, il n'existe aucune vraie référence, chaque constructeur décrit son propre fonctionnement (d'où parfois la nécessité d'utiliser du matériel provenant d'une même enseigne). Chaque VPN repose sur un protocole de tunneling qui permet d'assurer la sécurité des informations transmises. Chaque protocole à ses avantages et ses inconvénients. Il est donc important de bien définir les besoins ainsi que le niveau de sécurité que l'on souhaite avant de mettre en place une quelconque solution. On trouve de nombreuses solutions sur le marché qui vont du logiciel au matériel. Cette technologie peut s'avérer difficile à appréhender. En effet, le grand nombre de protocoles et les différentes façons de la mettre en place portent facilement à confusion.</p>
<p>Pour conclure, cette technologie est une très bonne alternative aux lignes spécialisées très coûteuse. Cependant, il est nécessaire d'avoir des compétences relativement étendues sur le sujet pour établir un réseau virtuel privé compétitif.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mti.epita.fr/blogs/2010/03/07/les-vpn/feed/</wfw:commentRss>
		</item>
		<item>
		<title>XNA 3.0: Faire de l&#8217;eau</title>
		<link>http://www.mti.epita.fr/blogs/2010/03/04/xna-30-faire-de-leau-12/</link>
		<comments>http://www.mti.epita.fr/blogs/2010/03/04/xna-30-faire-de-leau-12/#comments</comments>
		<pubDate>Thu, 04 Mar 2010 00:30:39 +0000</pubDate>
		<dc:creator>Gael Nieutin</dc:creator>
		
		<category><![CDATA[Jeux Vidéo]]></category>

		<category><![CDATA[Microsoft]]></category>

		<category><![CDATA[RIA/RDA]]></category>

		<category><![CDATA[mobile]]></category>

		<category><![CDATA[3D]]></category>

		<category><![CDATA[xna]]></category>

		<guid isPermaLink="false">http://www.mti.epita.fr/blogs/?p=5189</guid>
		<description><![CDATA[Dans le monde de la 3D, on considère généralement deux types d'eau: les lacs et les océans. Ces deux types couvrent les eaux stagnantes et vives. Un lac est une surface d'eau stagnante dont les vaguelettes à la surface sont produites sous l'action du vent, tandis que les vagues d'un océan sont régies par les [...]]]></description>
			<content:encoded><![CDATA[<p>Dans le monde de la 3D, on considère généralement deux types d'eau: les lacs et les océans. Ces deux types couvrent les eaux stagnantes et vives. Un lac est une surface d'eau stagnante dont les vaguelettes à la surface sont produites sous l'action du vent, tandis que les vagues d'un océan sont régies par les courants marins en plus du vent. Dans cette première phase du tutoriel, nous nous intéresserons au cas le plus simple: le cas du lac.</p>
<p><img class="alignnone size-medium wp-image-5410" title="sources1" src="http://www.mti.epita.fr/blogs/wp-content/uploads/2009/07/sources1.png" alt="" width="48" height="48" /><a href="http://www.mti.epita.fr/blogs/wp-content/uploads/2009/07/myfirstlake.zip">Sources du projet</a></p>
<p><span id="more-5189"></span></p>
<h2>Prérequis</h2>
<p>Bien entendu, lorsque l'on désire faire de l'eau, c'est pour la placer dans un décor. On imagine difficilement mettre de l'eau dans une scène noire. C'est pour ça que ce tutoriel se base sur un projet qui contient déjà une heightmap (<a href="http://www.mti.epita.fr/blogs/2009/07/18/xna-30-heightmap/">Comment faire une heightMap</a>), mais aussi une skybox. La skybox a toute son importance si l'on souhaite faire de l'eau en extérieur. En effet, la surface de l'eau va réfléchir le ciel de la skybox, donnant un peu plus de réalisme à notre réalisation.</p>
<p>Voilà en image notre terrain de départ :</p>
<div id="attachment_5329" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.mti.epita.fr/blogs/wp-content/uploads/2009/07/base_map.png"><img class="size-medium wp-image-5329" title="Map de départ" src="http://www.mti.epita.fr/blogs/wp-content/uploads/2009/07/base_map-300x236.png" alt="Map de départ" width="300" height="236" /></a><p class="wp-caption-text">Map de départ</p></div>
<p>Une petite précision, nous allons utiliser un repère un peu spécial, puisque l'axe représentant habituellement la profondeur (l'axe z) sera remplacé par l'axe y, l'axe z étant utilisé pour la hauteur. Si vous voulez appliquer le tutoriel suivant à d'autres types de repères, il vous suffira simplement de modifier les vecteurs que j'utilise pour les positions etc.</p>
<h2>Comment ça marche ?</h2>
<p>Pour comprendre comment faire de l'eau réaliste, il faut d'abord se mettre dans une situation réelle. Imaginons que je sois au bord d'un lac, quelque part dans notre beau pays. Un peu de soleil, de vent, quelques nuages. Si je regarde le lac, qu'est-ce que je vois?</p>
<p>Globalement, on voit le ciel être réfléchi dans l'eau, mais puisqu'il y a quelques vaguelettes à la surface du lac, cela déforme l'image du ciel dans l'eau. Si je me rapproche du lac, je vois aussi un peu au travers. Pour les mêmes raisons, ce que je vois du fond de l'eau est déformé.</p>
<p>On a donc grossièrement trois phénomènes : une part de réfraction de la lumière dans l'eau qui nous laisse entrevoir en profondeur, une part de réflexion qui nous fait voir le ciel à la surface de l'eau et un phénomène de déformation de ce que l'on voit à cause des vagues.</p>
<p>Maintenant si nous regardons en détails, on remarque que plus on regarde au loin sur le lac, moins on voit en profondeur, et plus le ciel est réfléchi. Inversement, si l'on regarde l'eau à nos pieds, la profondeur est plus visible que la réflexion du ciel.</p>
<p>Voilà! Maintenant que nous avons identifié comment notre œil perçois l'eau d'un lac, il ne nous reste plus qu'à imiter tous ces phénomènes pour avoir un lac en 3D plus vrai que nature!</p>
<h2>Principe utilisé</h2>
<p>La première idée que l'on peut avoir sur le "comment faire?", c'est d'imaginer une sorte de plan déformé par les vagues. Cela nous donnerait beaucoup de vertices à définir pour avoir un résultat réaliste. Seulement, faire bouger ces vertices pour rendre un effet de vague utiliserait beaucoup la ressource précieuse qu'est notre CPU. Nous allons donc ruser! Nous allons faire une surface plane et lisse composée de deux triangles uniquement, autrement dit six vertices! Mais alors, comment rendre la surface de l'eau mouvementée? Et bien nous allons appliquer une texture d'eau avec des vagues et la faire vivre dans le pixel shader! Vous aller voir que le résultat est plus que satisfaisant, et tout le calcul va donc se faire au niveau de la carte graphique. C'est parti!</p>
<h2>La réfraction</h2>
<p>Puisque nous allons jouer sur les textures pour faire notre rendu du lac, il nous faut une première texture qui représente ce que l'on voit sous la surface de l'eau. Nous avons donc besoin de quelques variables pour stocker tout ça :</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">// Indique la hauteur de l'eau</span>
public <span style="color: #993333;">const</span> <span style="color: #993333;">float</span> waterHeight <span style="color: #339933;">=</span> <span style="color:#800080;">5.0f</span><span style="color: #339933;">;</span>
RenderTarget2D refractionRenderTarget<span style="color: #339933;">;</span>
Texture2D refractionMap<span style="color: #339933;">;</span></pre></div></div>

<p>Puisque nous allons utiliser une <a href="http://msdn.microsoft.com/fr-fr/library/bb976073(en-us).aspx">renderTarget</a> pour récupérer le rendu de la map lorsque l'on affiche uniquement la partie sous l'eau, il nous faut l'initialiser dans notre méthode LoadContent :</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;">PresentationParameters pp <span style="color: #339933;">=</span> device.<span style="color: #202020;">PresentationParameters</span><span style="color: #339933;">;</span>
refractionRenderTarget <span style="color: #339933;">=</span> new RenderTarget2D<span style="color: #009900;">&#40;</span>device<span style="color: #339933;">,</span> pp.<span style="color: #202020;">BackBufferWidth</span><span style="color: #339933;">,</span> pp.<span style="color: #202020;">BackBufferHeight</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">,</span> device.<span style="color: #202020;">DisplayMode</span>.<span style="color: #202020;">Format</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Nous voulons afficher uniquement la partie de la map qui est sous l'eau et cacher la partie au-dessus de l'eau. Pour ce faire, nous allons utiliser un plan horizontal, de sorte que la partie au-dessus de ce plan soit cachée. La manière la plus simple pour définir un plan mathématiquement est de définir la normale à ce plan et la distance qui le sépare de l'origine du repère (0,0,0). Voici la fonction qui sera chargée de créer notre plan :</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;">private Plane CreatePlane<span style="color: #009900;">&#40;</span><span style="color: #993333;">float</span> height<span style="color: #339933;">,</span> Vector3 planeNormalDirection<span style="color: #339933;">,</span> Matrix currentViewMatrix<span style="color: #339933;">,</span> bool clipSide<span style="color: #009900;">&#41;</span>
        <span style="color: #009900;">&#123;</span>
            planeNormalDirection.<span style="color: #202020;">Normalize</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            Vector4 planeCoeffs <span style="color: #339933;">=</span> new Vector4<span style="color: #009900;">&#40;</span>planeNormalDirection<span style="color: #339933;">,</span> height<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>clipSide<span style="color: #009900;">&#41;</span>
                planeCoeffs <span style="color: #339933;">*=</span> <span style="color: #339933;">-</span><span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>
            Matrix worldViewProjection <span style="color: #339933;">=</span> currentViewMatrix <span style="color: #339933;">*</span> this.<span style="color: #202020;">cam</span>.<span style="color: #202020;">projectionMatrix</span><span style="color: #339933;">;</span>
            Matrix inverseWorldViewProjection <span style="color: #339933;">=</span> Matrix.<span style="color: #202020;">Invert</span><span style="color: #009900;">&#40;</span>worldViewProjection<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            inverseWorldViewProjection <span style="color: #339933;">=</span> Matrix.<span style="color: #202020;">Transpose</span><span style="color: #009900;">&#40;</span>inverseWorldViewProjection<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            planeCoeffs <span style="color: #339933;">=</span> Vector4.<span style="color: #202020;">Transform</span><span style="color: #009900;">&#40;</span>planeCoeffs<span style="color: #339933;">,</span> inverseWorldViewProjection<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            Plane finalPlane <span style="color: #339933;">=</span> new Plane<span style="color: #009900;">&#40;</span>planeCoeffs<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            <span style="color: #b1b100;">return</span> finalPlane<span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span></pre></div></div>

<p>Comme je vous l'ai dit, nous avons besoin de la hauteur de ce plan (qui correspond à la hauteur de la surface de l'eau), du vecteur normal à ce plan, de la matrice de vue et d'un booléen qui va nous permettre d'afficher ce qui est au-dessous ou au-dessus du plan (utile pour la réflexion). Nous avons besoin de récupérer l'inverse de la matrice de la caméra pour modifier les coordonnées du plan car il sera affiché après que les vertices du terrain aient été placées dans la vue de la caméra. Pour ce faire, il suffit d'abord de prendre l'inverse de la matrice, puis de la transposer. Enfin on transforme les coordonnées du plan avec cette matrice avant de créer le plan en lui-même.</p>
<p>Il nous faut maintenant une fonction qui va être chargée de dessiner la map avec uniquement la partie sous le niveau de l'eau :</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;">private <span style="color: #993333;">void</span> DrawRefractionMap<span style="color: #009900;">&#40;</span>GameTime gameTime<span style="color: #009900;">&#41;</span>
        <span style="color: #009900;">&#123;</span>
            Plane refractionPlane <span style="color: #339933;">=</span> CreatePlane<span style="color: #009900;">&#40;</span>waterHeight <span style="color: #339933;">+</span> <span style="color:#800080;">1f</span><span style="color: #339933;">,</span> new Vector3<span style="color: #009900;">&#40;</span><span style="color: #0000dd;">0</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">,</span> <span style="color: #339933;">-</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> cam.<span style="color: #202020;">viewMatrix</span><span style="color: #339933;">,</span> <span style="color: #000000; font-weight: bold;">false</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            device.<span style="color: #202020;">ClipPlanes</span><span style="color: #009900;">&#91;</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#93;</span>.<span style="color: #202020;">Plane</span> <span style="color: #339933;">=</span> refractionPlane<span style="color: #339933;">;</span>
            device.<span style="color: #202020;">ClipPlanes</span><span style="color: #009900;">&#91;</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#93;</span>.<span style="color: #202020;">IsEnabled</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">true</span><span style="color: #339933;">;</span>
            device.<span style="color: #202020;">SetRenderTarget</span><span style="color: #009900;">&#40;</span><span style="color: #0000dd;">0</span><span style="color: #339933;">,</span> refractionRenderTarget<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            device.<span style="color: #202020;">Clear</span><span style="color: #009900;">&#40;</span>ClearOptions.<span style="color: #202020;">Target</span> <span style="color: #339933;">|</span> ClearOptions.<span style="color: #202020;">DepthBuffer</span><span style="color: #339933;">,</span> Color.<span style="color: #202020;">Black</span><span style="color: #339933;">,</span> <span style="color:#800080;">1.0f</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
            device.<span style="color: #202020;">RenderState</span>.<span style="color: #202020;">CullMode</span> <span style="color: #339933;">=</span> CullMode.<span style="color: #202020;">CullClockwiseFace</span><span style="color: #339933;">;</span>
&nbsp;
            heightMap.<span style="color: #202020;">DrawTerrain</span><span style="color: #009900;">&#40;</span>cam<span style="color: #339933;">,</span> this.<span style="color: #202020;">effect</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            device.<span style="color: #202020;">ClipPlanes</span><span style="color: #009900;">&#91;</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#93;</span>.<span style="color: #202020;">IsEnabled</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">false</span><span style="color: #339933;">;</span>
&nbsp;
            device.<span style="color: #202020;">SetRenderTarget</span><span style="color: #009900;">&#40;</span><span style="color: #0000dd;">0</span><span style="color: #339933;">,</span> <span style="color: #000000; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            refractionMap <span style="color: #339933;">=</span> refractionRenderTarget.<span style="color: #202020;">GetTexture</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span></pre></div></div>

<p>Ici nous appelons donc notre méthode qui va créer le plan en lui précisant que nous voulons un plan légèrement au dessus du niveau de l'eau et que nous voulons afficher la partie en dessous du plan (dernier paramètre à false).</p>
<p>Ensuite on indique au device d'utiliser ce plan pour enlever de la scène ce qui sera au dessus. On termine en dessinant la map dans la renderTarget, et en sauvegardant sous forme de texture le rendu.</p>
<p>Si vous voulez vérifier le rendu obtenu dans la renderTarget, vous pouvez utiliser l'instruction suivante à la fin de la fonction :</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;">refractionMap.<span style="color: #202020;">Save</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;refractionmap.jpg&quot;</span><span style="color: #339933;">,</span> ImageFileFormat.<span style="color: #202020;">Jpg</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Je vous préviens tout de suite, cela va grandement ralentir le FPS de votre application, puisque nous allons appeler notre méthode <code>DrawRefractionMap(GameTime gameTime)</code> au début de notre fonction <code>Draw()</code>. Je vous rappelle que par défaut cette fonction est appelée 60 fois par secondes. Imaginez ce que ça fait d'enregistrer un fichier sur le disque 60 fois par secondes... Donc une fois que vous aurez vérifié le résultat, je vous conseil d'enlever cette ligne!</p>
<p>Voici ce que l'on obtient avec notre map :</p>
<div id="attachment_5360" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.mti.epita.fr/blogs/wp-content/uploads/2009/07/refraction_map.png"><img class="size-medium wp-image-5360" title="Réfraction" src="http://www.mti.epita.fr/blogs/wp-content/uploads/2009/07/refraction_map-300x225.png" alt="Réfraction" width="300" height="225" /></a><p class="wp-caption-text">Réfraction</p></div>
<p>Cette image montre exactement la même map que nous avons vu au début, mais avec la partie au-dessus de l'eau coupée. On ne voit donc que ce qui est sous l'eau.</p>
<p>Voilà, nous avons récupéré la partie immergée de la map, qui sera visible à travers l'eau via la réfraction de la lumière. Passons au second phénomène : la réflexion!</p>
<h2>La réflexion</h2>
<p>Nous avons vu comment obtenir, dans une texture, uniquement la partie immergée de la map, nous allons maintenant nous intéresser à la partie réfléchie par l'eau, donc à la partie au-dessus de la surface. De la même manière que pour la réfraction, nous allons sauvegarder en mémoire la texture correspondant pour chaque pixel du lac aux pixels de l'environnement qui doivent être réfléchis. Il faut donc déclarer une nouvelle texture et une renderTarget spécifique dans notre classe :</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;">RenderTarget2D reflectionRenderTarget<span style="color: #339933;">;</span>
Texture2D reflectionMap<span style="color: #339933;">;</span></pre></div></div>

<p>Tout comme pour la réfraction, il faut initialiser notre renderTarget dans la méthode <code>LoadContent()</code> :</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;">reflectionRenderTarget <span style="color: #339933;">=</span> new RenderTarget2D<span style="color: #009900;">&#40;</span>device<span style="color: #339933;">,</span> pp.<span style="color: #202020;">BackBufferWidth</span><span style="color: #339933;">,</span>
pp.<span style="color: #202020;">BackBufferHeight</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">,</span> device.<span style="color: #202020;">DisplayMode</span>.<span style="color: #202020;">Format</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>La question qui se pose maintenant est comment afficher la partie réfléchie par le lac? En fait c'est assez simple. Puisque nous considérons notre lac comme une surface plane, cela veut dire que pour un point donné du lac, le pixel réfléchi se trouve sur un vecteur qu'il est possible de calculer en utilisant le vecteur incident et le vecteur normal au plan du lac :</p>
<div id="attachment_5363" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.mti.epita.fr/blogs/wp-content/uploads/2009/07/schema_reflexion.png"><img class="size-medium wp-image-5363" title="schema_reflexion" src="http://www.mti.epita.fr/blogs/wp-content/uploads/2009/07/schema_reflexion-300x258.png" alt="Réflexion" width="300" height="258" /></a><p class="wp-caption-text">Réflexion</p></div>
<p>A partir de cette observation, on en déduit que si on place la caméra sur le rayon réfléchi, à une position qui correspond exactement à l'application d'une symétrie horizontale dont l'axe est le niveau de l'eau, la caméra pourra voir la partie de l'environnement qui doit être réfléchie pour chaque pixel du lac</p>
<p>Dans notre projet, nous avons la classe Camera qui s'occupe complètement de la gestion de la caméra. Ajoutons la matrice de la seconde caméra qui se trouve sur le vecteur correspondant au rayon réfléchi :</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;">public Matrix reflectionViewMatrix<span style="color: #339933;">;</span></pre></div></div>

<p>Déterminer la position exacte de notre seconde caméra est chose facile à partir de la position de la caméra principale. Puisque nous appliquons une symétrie horizontal, seul la hauteur de la caméra va être différente, on modifie donc la coordonné Z de notre nouvelle caméra (si vous utilisez un repère classique, il s'agit de la coordonné Y) dans notre constructeur de caméra :</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;">Vector3 reflCameraPosition <span style="color: #339933;">=</span> cameraPosition<span style="color: #339933;">;</span>
reflCameraPosition.<span style="color: #202020;">Z</span> <span style="color: #339933;">=</span> <span style="color: #339933;">-</span>cameraPosition.<span style="color: #202020;">Z</span> <span style="color: #339933;">+</span> Game.<span style="color: #202020;">waterHeight</span> <span style="color: #339933;">*</span> <span style="color: #0000dd;">2</span><span style="color: #339933;">;</span>
Vector3 reflTargetPos <span style="color: #339933;">=</span> cameraFinalTarget<span style="color: #339933;">;</span>
reflTargetPos.<span style="color: #202020;">Z</span> <span style="color: #339933;">=</span> <span style="color: #339933;">-</span>cameraFinalTarget.<span style="color: #202020;">Z</span> <span style="color: #339933;">+</span> Game.<span style="color: #202020;">waterHeight</span> <span style="color: #339933;">*</span> <span style="color: #0000dd;">2</span><span style="color: #339933;">;</span>
reflectionViewMatrix <span style="color: #339933;">=</span> Matrix.<span style="color: #202020;">CreateLookAt</span><span style="color: #009900;">&#40;</span>reflCameraPosition<span style="color: #339933;">,</span> reflTargetPos<span style="color: #339933;">,</span> new Vector3<span style="color: #009900;">&#40;</span><span style="color: #0000dd;">0</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Si la caméra bouge, il faut mettre à jour la position de la seconde caméra dans la méthode <code>UpdateViewMatrix()</code> :</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;">Vector3 reflCameraPosition <span style="color: #339933;">=</span> cameraPosition<span style="color: #339933;">;</span>
reflCameraPosition.<span style="color: #202020;">Z</span> <span style="color: #339933;">=</span> <span style="color: #339933;">-</span>cameraPosition.<span style="color: #202020;">Z</span> <span style="color: #339933;">+</span> Game.<span style="color: #202020;">waterHeight</span> <span style="color: #339933;">*</span> <span style="color: #0000dd;">2</span><span style="color: #339933;">;</span>
Vector3 reflTargetPos <span style="color: #339933;">=</span> cameraFinalTarget<span style="color: #339933;">;</span>
reflTargetPos.<span style="color: #202020;">Z</span> <span style="color: #339933;">=</span> <span style="color: #339933;">-</span>cameraFinalTarget.<span style="color: #202020;">Z</span> <span style="color: #339933;">+</span> Game.<span style="color: #202020;">waterHeight</span> <span style="color: #339933;">*</span> <span style="color: #0000dd;">2</span><span style="color: #339933;">;</span>
Vector3 cameraRight <span style="color: #339933;">=</span> Vector3.<span style="color: #202020;">Transform</span><span style="color: #009900;">&#40;</span>new Vector3<span style="color: #009900;">&#40;</span><span style="color: #0000dd;">0</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> cameraRotation<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
Vector3 invUpVector <span style="color: #339933;">=</span> Vector3.<span style="color: #202020;">Cross</span><span style="color: #009900;">&#40;</span>cameraRight<span style="color: #339933;">,</span> reflTargetPos <span style="color: #339933;">-</span> reflCameraPosition<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
reflectionViewMatrix <span style="color: #339933;">=</span> Matrix.<span style="color: #202020;">CreateLookAt</span><span style="color: #009900;">&#40;</span>reflCameraPosition<span style="color: #339933;">,</span> reflTargetPos<span style="color: #339933;">,</span> invUpVector<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Maintenant que nous avons la caméra qui nous intéresse pour obtenir la partie de la scène qui sera réfléchie, nous allons créer la méthode <code>DrawReflectionMap()</code> pour sauvegarder dans une texture cette partie de la scène :</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;">private <span style="color: #993333;">void</span> DrawReflectionMap<span style="color: #009900;">&#40;</span>GameTime gameTime<span style="color: #009900;">&#41;</span>
        <span style="color: #009900;">&#123;</span>
            device.<span style="color: #202020;">RenderState</span>.<span style="color: #202020;">CullMode</span> <span style="color: #339933;">=</span> CullMode.<span style="color: #202020;">CullClockwiseFace</span><span style="color: #339933;">;</span>
            Plane reflectionPlane <span style="color: #339933;">=</span> CreatePlane<span style="color: #009900;">&#40;</span>waterHeight <span style="color: #339933;">-</span> <span style="color:#800080;">1f</span><span style="color: #339933;">,</span> new Vector3<span style="color: #009900;">&#40;</span><span style="color: #0000dd;">0</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">,</span> <span style="color: #339933;">-</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> cam.<span style="color: #202020;">reflectionViewMatrix</span><span style="color: #339933;">,</span> <span style="color: #000000; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            device.<span style="color: #202020;">ClipPlanes</span><span style="color: #009900;">&#91;</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#93;</span>.<span style="color: #202020;">Plane</span> <span style="color: #339933;">=</span> reflectionPlane<span style="color: #339933;">;</span>
            device.<span style="color: #202020;">ClipPlanes</span><span style="color: #009900;">&#91;</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#93;</span>.<span style="color: #202020;">IsEnabled</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">true</span><span style="color: #339933;">;</span>
            device.<span style="color: #202020;">SetRenderTarget</span><span style="color: #009900;">&#40;</span><span style="color: #0000dd;">0</span><span style="color: #339933;">,</span> reflectionRenderTarget<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            device.<span style="color: #202020;">Clear</span><span style="color: #009900;">&#40;</span>ClearOptions.<span style="color: #202020;">Target</span> <span style="color: #339933;">|</span> ClearOptions.<span style="color: #202020;">DepthBuffer</span><span style="color: #339933;">,</span> Color.<span style="color: #202020;">Black</span><span style="color: #339933;">,</span> <span style="color:#800080;">1.0f</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            heightMap.<span style="color: #202020;">DrawTerrain</span><span style="color: #009900;">&#40;</span>cam<span style="color: #339933;">,</span> this.<span style="color: #202020;">effect</span><span style="color: #339933;">,</span> <span style="color: #000000; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
            device.<span style="color: #202020;">RenderState</span>.<span style="color: #202020;">CullMode</span> <span style="color: #339933;">=</span> CullMode.<span style="color: #202020;">CullCounterClockwiseFace</span><span style="color: #339933;">;</span>
            skyBox.<span style="color: #202020;">DrawSkybox</span><span style="color: #009900;">&#40;</span>cam.<span style="color: #202020;">reflectionViewMatrix</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            device.<span style="color: #202020;">ClipPlanes</span><span style="color: #009900;">&#91;</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#93;</span>.<span style="color: #202020;">IsEnabled</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">false</span><span style="color: #339933;">;</span>
            device.<span style="color: #202020;">SetRenderTarget</span><span style="color: #009900;">&#40;</span><span style="color: #0000dd;">0</span><span style="color: #339933;">,</span> <span style="color: #000000; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            reflectionMap <span style="color: #339933;">=</span> reflectionRenderTarget.<span style="color: #202020;">GetTexture</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span></pre></div></div>

<p>On commence donc par créer le plan qui va couper la scène pour n'afficher que la partie au-dessus de l'eau, puis on dessine la map et la skybox. Vous remarquerez qu'avant de dessiner la skybox, on change le CullMode (qui permet de préciser de quelle façon les deux cotés d'un triangle doivent être dessiné) de sorte que la partie qui correspond au dos des triangles soit affichée. En effet, notre skybox constitue un énorme cube dont on a peint la partie intérieure.</p>
<p>On fini par sauvegarder dans une texture la scène affichée. De la même manière que pour la réfraction, vous pouvez ajouter une instruction pour sauvegarder dans une image la texture et vérifier que le résultat est satisfaisant. Dans le cas de notre map, on obtient le résultat suivant :</p>
<div id="attachment_5366" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.mti.epita.fr/blogs/wp-content/uploads/2009/07/reflexion.jpg"><img class="size-medium wp-image-5366" title="reflexion" src="http://www.mti.epita.fr/blogs/wp-content/uploads/2009/07/reflexion-300x225.jpg" alt="Partie réfléchie de la scène" width="300" height="225" /></a><p class="wp-caption-text">Partie réfléchis de la scène</p></div>
<p>Comme vous pouvez le constater, nous voyons uniquement le ciel. En effet, nous avons mis le niveau de l'eau au raz de celui de la terre. Cependant, si le niveau de l'eau avait été plus bas, vous vous doutez bien que l'on verrais apparaitre sur la texture les "bords" du lac. Voici un exemple en utilisant la même map, mais en diminuant le niveau de l'eau :</p>
<div id="attachment_5368" class="wp-caption alignnone" style="width: 310px"><a href="http://www.mti.epita.fr/blogs/wp-content/uploads/2009/07/reflexion1.jpg"><img class="size-medium wp-image-5368" title="reflexion2" src="http://www.mti.epita.fr/blogs/wp-content/uploads/2009/07/reflexion1-300x225.jpg" alt="Autre exemple de réflexion" width="300" height="225" /></a><p class="wp-caption-text">Autre exemple de réflexion</p></div>
<h2>1er rendu : le miroir</h2>
<p>Maintenant que les préparatifs sont terminés, il est temps d'afficher notre lac! Le principe va être d'appliquer notre texture de réflexion sur notre lac. Il nous faut donc déjà créer le lac. Ajoutons de nouveaux attributs à notre classe heightMap :</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;">VertexBuffer waterVertexBuffer<span style="color: #339933;">;</span>
VertexDeclaration waterVertexDeclaration<span style="color: #339933;">;</span></pre></div></div>

<p>Puis nous devons créer les deux triangles qui forment notre lac. Nous allons faire cela dans une nouvelle méthode :</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;">private <span style="color: #993333;">void</span> SetUpWaterVertices<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
        <span style="color: #009900;">&#123;</span>
            VertexPositionTexture<span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> waterVertices <span style="color: #339933;">=</span> new VertexPositionTexture<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">6</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
&nbsp;
            <span style="color: #993333;">int</span> width <span style="color: #339933;">=</span> this.<span style="color: #202020;">terrainWidth</span><span style="color: #339933;">;</span>
            <span style="color: #993333;">int</span> length <span style="color: #339933;">=</span> this.<span style="color: #202020;">terrainLength</span><span style="color: #339933;">;</span>
            <span style="color: #666666; font-style: italic;">// Oui...notre map est gigantesque...</span>
            this.<span style="color: #202020;">terrainLength</span> <span style="color: #339933;">=</span> <span style="color: #0000dd;">50000</span><span style="color: #339933;">;</span>
            this.<span style="color: #202020;">terrainWidth</span> <span style="color: #339933;">=</span> <span style="color: #0000dd;">50000</span><span style="color: #339933;">;</span>
&nbsp;
            <span style="color: #666666; font-style: italic;">// On place notre lac pour qu'il recouvre le trou au milieu de la map</span>
            waterVertices<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> new VertexPositionTexture<span style="color: #009900;">&#40;</span>new Vector3<span style="color: #009900;">&#40;</span><span style="color: #0000dd;">20000</span><span style="color: #339933;">,</span> <span style="color: #339933;">-</span><span style="color: #0000dd;">28000</span><span style="color: #339933;">,</span> Game.<span style="color: #202020;">waterHeight</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> new Vector2<span style="color: #009900;">&#40;</span><span style="color: #0000dd;">0</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            waterVertices<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">2</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> new VertexPositionTexture<span style="color: #009900;">&#40;</span>new Vector3<span style="color: #009900;">&#40;</span><span style="color: #0000dd;">35000</span><span style="color: #339933;">,</span> <span style="color: #339933;">-</span><span style="color: #0000dd;">28000</span><span style="color: #339933;">,</span> Game.<span style="color: #202020;">waterHeight</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> new Vector2<span style="color: #009900;">&#40;</span><span style="color: #0000dd;">1</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            waterVertices<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> new VertexPositionTexture<span style="color: #009900;">&#40;</span>new Vector3<span style="color: #009900;">&#40;</span><span style="color: #0000dd;">35000</span><span style="color: #339933;">,</span> <span style="color: #339933;">-</span><span style="color: #0000dd;">14000</span><span style="color: #339933;">,</span> Game.<span style="color: #202020;">waterHeight</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> new Vector2<span style="color: #009900;">&#40;</span><span style="color: #0000dd;">0</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
            waterVertices<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">3</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> new VertexPositionTexture<span style="color: #009900;">&#40;</span>new Vector3<span style="color: #009900;">&#40;</span><span style="color: #0000dd;">20000</span><span style="color: #339933;">,</span> <span style="color: #339933;">-</span><span style="color: #0000dd;">14000</span><span style="color: #339933;">,</span> Game.<span style="color: #202020;">waterHeight</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> new Vector2<span style="color: #009900;">&#40;</span><span style="color: #0000dd;">0</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            waterVertices<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">5</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> new VertexPositionTexture<span style="color: #009900;">&#40;</span>new Vector3<span style="color: #009900;">&#40;</span><span style="color: #0000dd;">35000</span><span style="color: #339933;">,</span> <span style="color: #339933;">-</span><span style="color: #0000dd;">14000</span><span style="color: #339933;">,</span> Game.<span style="color: #202020;">waterHeight</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> new Vector2<span style="color: #009900;">&#40;</span><span style="color: #0000dd;">1</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            waterVertices<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">4</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> new VertexPositionTexture<span style="color: #009900;">&#40;</span>new Vector3<span style="color: #009900;">&#40;</span><span style="color: #0000dd;">20000</span><span style="color: #339933;">,</span> <span style="color: #339933;">-</span><span style="color: #0000dd;">30000</span><span style="color: #339933;">,</span> Game.<span style="color: #202020;">waterHeight</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> new Vector2<span style="color: #009900;">&#40;</span><span style="color: #0000dd;">1</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
            waterVertexBuffer <span style="color: #339933;">=</span> new VertexBuffer<span style="color: #009900;">&#40;</span>device<span style="color: #339933;">,</span> waterVertices.<span style="color: #202020;">Length</span> <span style="color: #339933;">*</span> VertexPositionTexture.<span style="color: #202020;">SizeInBytes</span><span style="color: #339933;">,</span> BufferUsage.<span style="color: #202020;">WriteOnly</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            waterVertexBuffer.<span style="color: #202020;">SetData</span><span style="color: #009900;">&#40;</span>waterVertices<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
            this.<span style="color: #202020;">terrainWidth</span> <span style="color: #339933;">=</span> width<span style="color: #339933;">;</span>
            this.<span style="color: #202020;">terrainLength</span> <span style="color: #339933;">=</span> length<span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span></pre></div></div>

<p>On appelle maintenant la methode dans <code>LoadVertices()</code> :</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;">SetUpWaterVertices<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
waterVertexDeclaration <span style="color: #339933;">=</span> new VertexDeclaration<span style="color: #009900;">&#40;</span>device<span style="color: #339933;">,</span> VertexPositionTexture.<span style="color: #202020;">VertexElements</span><span style="color: #009900;">&#41;</span></pre></div></div>

<p>Passons à la méthode qui va dessiner notre lac :</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;">public <span style="color: #993333;">void</span> DrawWater<span style="color: #009900;">&#40;</span>Camera cam<span style="color: #339933;">,</span> Effect effect<span style="color: #339933;">,</span> <span style="color: #993333;">float</span> time<span style="color: #339933;">,</span> Texture2D refractionMap<span style="color: #339933;">,</span> Texture2D reflectionMap<span style="color: #009900;">&#41;</span>
        <span style="color: #009900;">&#123;</span>
            effect.<span style="color: #202020;">CurrentTechnique</span> <span style="color: #339933;">=</span> effect.<span style="color: #202020;">Techniques</span><span style="color: #009900;">&#91;</span><span style="color: #ff0000;">&quot;Lake&quot;</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
            Matrix worldMatrix <span style="color: #339933;">=</span> Matrix.<span style="color: #202020;">Identity</span><span style="color: #339933;">;</span>
            effect.<span style="color: #202020;">Parameters</span><span style="color: #009900;">&#91;</span><span style="color: #ff0000;">&quot;xWorld&quot;</span><span style="color: #009900;">&#93;</span>.<span style="color: #202020;">SetValue</span><span style="color: #009900;">&#40;</span>worldMatrix<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            effect.<span style="color: #202020;">Parameters</span><span style="color: #009900;">&#91;</span><span style="color: #ff0000;">&quot;xView&quot;</span><span style="color: #009900;">&#93;</span>.<span style="color: #202020;">SetValue</span><span style="color: #009900;">&#40;</span>cam.<span style="color: #202020;">viewMatrix</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            effect.<span style="color: #202020;">Parameters</span><span style="color: #009900;">&#91;</span><span style="color: #ff0000;">&quot;xReflectionView&quot;</span><span style="color: #009900;">&#93;</span>.<span style="color: #202020;">SetValue</span><span style="color: #009900;">&#40;</span>cam.<span style="color: #202020;">reflectionViewMatrix</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            effect.<span style="color: #202020;">Parameters</span><span style="color: #009900;">&#91;</span><span style="color: #ff0000;">&quot;xProjection&quot;</span><span style="color: #009900;">&#93;</span>.<span style="color: #202020;">SetValue</span><span style="color: #009900;">&#40;</span>cam.<span style="color: #202020;">projectionMatrix</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            effect.<span style="color: #202020;">Parameters</span><span style="color: #009900;">&#91;</span><span style="color: #ff0000;">&quot;xReflectionMap&quot;</span><span style="color: #009900;">&#93;</span>.<span style="color: #202020;">SetValue</span><span style="color: #009900;">&#40;</span>reflectionMap<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            effect.<span style="color: #202020;">Parameters</span><span style="color: #009900;">&#91;</span><span style="color: #ff0000;">&quot;xRefractionMap&quot;</span><span style="color: #009900;">&#93;</span>.<span style="color: #202020;">SetValue</span><span style="color: #009900;">&#40;</span>refractionMap<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
            effect.<span style="color: #202020;">Begin</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            foreach <span style="color: #009900;">&#40;</span>EffectPass pass in effect.<span style="color: #202020;">CurrentTechnique</span>.<span style="color: #202020;">Passes</span><span style="color: #009900;">&#41;</span>
            <span style="color: #009900;">&#123;</span>
                pass.<span style="color: #202020;">Begin</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
                device.<span style="color: #202020;">Vertices</span><span style="color: #009900;">&#91;</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#93;</span>.<span style="color: #202020;">SetSource</span><span style="color: #009900;">&#40;</span>waterVertexBuffer<span style="color: #339933;">,</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">,</span> VertexPositionTexture.<span style="color: #202020;">SizeInBytes</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                device.<span style="color: #202020;">VertexDeclaration</span> <span style="color: #339933;">=</span> waterVertexDeclaration<span style="color: #339933;">;</span>
                <span style="color: #993333;">int</span> noVertices <span style="color: #339933;">=</span> waterVertexBuffer.<span style="color: #202020;">SizeInBytes</span> <span style="color: #339933;">/</span> VertexPositionTexture.<span style="color: #202020;">SizeInBytes</span><span style="color: #339933;">;</span>
                device.<span style="color: #202020;">DrawPrimitives</span><span style="color: #009900;">&#40;</span>PrimitiveType.<span style="color: #202020;">TriangleList</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">,</span> noVertices <span style="color: #339933;">/</span> <span style="color: #0000dd;">3</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
                pass.<span style="color: #202020;">End</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            <span style="color: #009900;">&#125;</span>
            effect.<span style="color: #202020;">End</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span></pre></div></div>

<p>Cette méthode va utiliser notre technique "Lake" contenue dans notre fichier d'effet (MapEffect.fx).</p>
<p>Vous remarquerez que l'on donne en paramètres à l'effet la caméra principal, la caméra utilisée pour la réflexion ainsi que les textures de réfraction et de réflexion que nous avons obtenues dans les précédentes parties. Nous pouvons maintenant appeler cette fonction dans la méthode Draw de notre classe principale :</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">float</span> time <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #993333;">float</span><span style="color: #009900;">&#41;</span>gameTime.<span style="color: #202020;">TotalGameTime</span>.<span style="color: #202020;">TotalMilliseconds</span> <span style="color: #339933;">/</span> <span style="color:#800080;">100.0f</span><span style="color: #339933;">;</span>
heightMap.<span style="color: #202020;">DrawWater</span><span style="color: #009900;">&#40;</span>cam<span style="color: #339933;">,</span> effect<span style="color: #339933;">,</span> time<span style="color: #339933;">,</span> refractionMap<span style="color: #339933;">,</span> reflectionMap<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Venons en justement à notre technique "Water". Nous allons la créer. Pour cela, allez dans votre fichier d'effet et déclarez quelques variables qui nous serviront pour notre effet de lac</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;">float4x4 xReflectionView<span style="color: #339933;">;</span>
<span style="color: #666666; font-style: italic;">//------- Texture Samplers --------</span>
Texture xReflectionMap<span style="color: #339933;">;</span>
sampler ReflectionSampler <span style="color: #339933;">=</span> sampler_state <span style="color: #009900;">&#123;</span> texture <span style="color: #339933;">=</span>  <span style="color: #339933;">;</span> magfilter <span style="color: #339933;">=</span> LINEAR<span style="color: #339933;">;</span> minfilter <span style="color: #339933;">=</span> LINEAR<span style="color: #339933;">;</span> mipfilter<span style="color: #339933;">=</span>LINEAR<span style="color: #339933;">;</span> AddressU <span style="color: #339933;">=</span> mirror<span style="color: #339933;">;</span> AddressV <span style="color: #339933;">=</span> mirror<span style="color: #339933;">;</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
&nbsp;
Texture xRefractionMap<span style="color: #339933;">;</span>
&nbsp;
sampler RefractionSampler <span style="color: #339933;">=</span> sampler_state <span style="color: #009900;">&#123;</span> texture <span style="color: #339933;">=</span>  <span style="color: #339933;">;</span> magfilter <span style="color: #339933;">=</span> LINEAR<span style="color: #339933;">;</span> minfilter <span style="color: #339933;">=</span> LINEAR<span style="color: #339933;">;</span> mipfilter<span style="color: #339933;">=</span>LINEAR<span style="color: #339933;">;</span> AddressU <span style="color: #339933;">=</span> mirror<span style="color: #339933;">;</span> AddressV <span style="color: #339933;">=</span> mirror<span style="color: #339933;">;</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span></pre></div></div>

<p>On définit ensuite la technique "Lake" avec son vertex shader et son pixel shader :</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">//------- Technique: Lake --------</span>
<span style="color: #993333;">struct</span> WVertexToPixel
<span style="color: #009900;">&#123;</span>
    float4 Position                 <span style="color: #339933;">:</span> POSITION<span style="color: #339933;">;</span>
    float4 ReflectionMapSamplingPos    <span style="color: #339933;">:</span> TEXCOORD1<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #993333;">struct</span> WPixelToFrame
<span style="color: #009900;">&#123;</span>
    float4 Color <span style="color: #339933;">:</span> COLOR0<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
&nbsp;
WVertexToPixel LakeVS<span style="color: #009900;">&#40;</span>float4 inPos <span style="color: #339933;">:</span> POSITION<span style="color: #339933;">,</span> float2 inTex<span style="color: #339933;">:</span> TEXCOORD<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    WVertexToPixel Output <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span>WVertexToPixel<span style="color: #009900;">&#41;</span><span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
&nbsp;
    float4x4 preViewProjection <span style="color: #339933;">=</span> mul <span style="color: #009900;">&#40;</span>xView<span style="color: #339933;">,</span> xProjection<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    float4x4 preWorldViewProjection <span style="color: #339933;">=</span> mul <span style="color: #009900;">&#40;</span>xWorld<span style="color: #339933;">,</span> preViewProjection<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    float4x4 preReflectionViewProjection <span style="color: #339933;">=</span> mul <span style="color: #009900;">&#40;</span>xReflectionView<span style="color: #339933;">,</span> xProjection<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    float4x4 preWorldReflectionViewProjection <span style="color: #339933;">=</span> mul <span style="color: #009900;">&#40;</span>xWorld<span style="color: #339933;">,</span> preReflectionViewProjection<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    Output.<span style="color: #202020;">Position</span> <span style="color: #339933;">=</span> mul<span style="color: #009900;">&#40;</span>inPos<span style="color: #339933;">,</span> preWorldViewProjection<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    Output.<span style="color: #202020;">ReflectionMapSamplingPos</span> <span style="color: #339933;">=</span> mul<span style="color: #009900;">&#40;</span>inPos<span style="color: #339933;">,</span> preWorldReflectionViewProjection<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #b1b100;">return</span> Output<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
WPixelToFrame LakePS<span style="color: #009900;">&#40;</span>WVertexToPixel PSIn<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    WPixelToFrame Output <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span>WPixelToFrame<span style="color: #009900;">&#41;</span><span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>        
&nbsp;
    float2 ProjectedTexCoords<span style="color: #339933;">;</span>
    ProjectedTexCoords.<span style="color: #202020;">x</span> <span style="color: #339933;">=</span> PSIn.<span style="color: #202020;">ReflectionMapSamplingPos</span>.<span style="color: #202020;">x</span><span style="color: #339933;">/</span>PSIn.<span style="color: #202020;">ReflectionMapSamplingPos</span>.<span style="color: #202020;">w</span><span style="color: #339933;">/</span><span style="color:#800080;">2.0f</span> <span style="color: #339933;">+</span> <span style="color:#800080;">0.5f</span><span style="color: #339933;">;</span>
    ProjectedTexCoords.<span style="color: #202020;">y</span> <span style="color: #339933;">=</span> <span style="color: #339933;">-</span>PSIn.<span style="color: #202020;">ReflectionMapSamplingPos</span>.<span style="color: #202020;">y</span><span style="color: #339933;">/</span>PSIn.<span style="color: #202020;">ReflectionMapSamplingPos</span>.<span style="color: #202020;">w</span><span style="color: #339933;">/</span><span style="color:#800080;">2.0f</span> <span style="color: #339933;">+</span> <span style="color:#800080;">0.5f</span><span style="color: #339933;">;</span>    
&nbsp;
    Output.<span style="color: #202020;">Color</span> <span style="color: #339933;">=</span> tex2D<span style="color: #009900;">&#40;</span>ReflectionSampler<span style="color: #339933;">,</span> ProjectedTexCoords<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>    
&nbsp;
    <span style="color: #b1b100;">return</span> Output<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
technique Lake
<span style="color: #009900;">&#123;</span>
    pass Pass0
    <span style="color: #009900;">&#123;</span>
        VertexShader <span style="color: #339933;">=</span> compile vs_1_1 LakeVS<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        PixelShader <span style="color: #339933;">=</span> compile ps_2_0 LakePS<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Dans le vertex shader on s'occupe de calculer les coordonnées de la texture de réflexion. Ensuite dans le pixel shader on calcule la position du vertex courant en 2D ainsi que la position correspondante vue par la caméra qui filme la réflexion.</p>
<p>Voilà le résultat que l'on obtient avec notre map :</p>
<div id="attachment_5396" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.mti.epita.fr/blogs/wp-content/uploads/2009/07/miror.png"><img class="size-medium wp-image-5396" title="miror" src="http://www.mti.epita.fr/blogs/wp-content/uploads/2009/07/miror-300x234.png" alt="Effet miroir" width="300" height="234" /></a><p class="wp-caption-text">Effet miroir</p></div>
<p>Le reflet du ciel dans notre lac est bien visible!</p>
<h2>Ajouter l'effet de vague</h2>
<p>Nous allons à présent ajouter les vaguelettes pour rendre la surface de notre lac plus réaliste. La difficulté réside dans le fait que nous n'avons que deux triangles, donc six vertices. Dans ce contexte, il est donc impossible de déformer les triangles pour faire des vagues. Comme je vous l'expliquais au début de ce tutoriel, nous allons jouer avec une texture sur laquelle il y a des vagues, et l'appliquer à nos deux triangles. Ce qu'il faut comprendre, c'est que pour une vague, le point au creux de la vague et le point sur le haut de la vague ont le même vecteur normal qu'une surface plane. Ainsi sur ces pixels, le point réfléchi correspondant est exactement le pixel de la texture de réflexion. En revanche, les autres points de la vague subissent une déformation qui change ce qu 'ils réfléchissent.<br />
Il nous faut donc une façon de mesurer cette déformation pour chaque pixel. C'est ici qu'intervient la texture de lac! Nous allons utiliser une technique appelé <a href="http://fr.wikipedia.org/wiki/Placage_de_relief">Bump mapping</a> qui va nous permettre d'ajouter du relief à notre lac, et donc des vagues.<br />
Voici à quoi ressemble la texture que nous utiliserons pour ce tutoriel :</p>
<div id="attachment_5397" class="wp-caption aligncenter" style="width: 266px"><a href="http://www.mti.epita.fr/blogs/wp-content/uploads/2009/07/sample_water_bump.png"><img class="size-medium wp-image-5397" title="sample_water_bump" src="http://www.mti.epita.fr/blogs/wp-content/uploads/2009/07/sample_water_bump.png" alt="Texture de base pour le bump mapping" width="256" height="258" /></a><p class="wp-caption-text">Texture de base pour le bump mapping</p></div>
<p>Importation la texture dans notre projet :</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;">Texture2D waterBumpMap<span style="color: #339933;">;</span></pre></div></div>

<p>Puis nous faisons l'initialisation dans la méthode <code>LoadContent()</code> :</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;">waterBumpMap <span style="color: #339933;">=</span> Content.<span style="color: #202020;">Load</span> <span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;waterbump&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Enfin on la transmet au fichier d'effet dans notre méthode <code>DrawWater()</code> :</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;">effect.<span style="color: #202020;">Parameters</span><span style="color: #009900;">&#91;</span><span style="color: #ff0000;">&quot;xWaterBumpMap&quot;</span><span style="color: #009900;">&#93;</span>.<span style="color: #202020;">SetValue</span><span style="color: #009900;">&#40;</span>waterBumpMap<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Maintenant, nous allons voir le code <a href="http://en.wikipedia.org/wiki/High_Level_Shader_Language">HLSL</a> correspondant dans le fichier d'effet :</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;">Texture xWaterBumpMap<span style="color: #339933;">;</span>
sampler WaterBumpMapSampler <span style="color: #339933;">=</span> sampler_state <span style="color: #009900;">&#123;</span> texture <span style="color: #339933;">=</span>  <span style="color: #339933;">;</span> magfilter <span style="color: #339933;">=</span> LINEAR<span style="color: #339933;">;</span> minfilter <span style="color: #339933;">=</span> LINEAR<span style="color: #339933;">;</span> mipfilter<span style="color: #339933;">=</span>LINEAR<span style="color: #339933;">;</span> AddressU <span style="color: #339933;">=</span> mirror<span style="color: #339933;">;</span> AddressV <span style="color: #339933;">=</span> mirror<span style="color: #339933;">;</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Pour pouvoir prendre en compte la texture de notre Bump map dans chaque pixel, il faut modifier la structure de sortie du vertex shader (WVertexToPixel dans notre MapEffect.fx) en ajoutant l'attribut suivant :</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;">float2 BumpMapSamplingPos        <span style="color: #339933;">:</span> TEXCOORD2<span style="color: #339933;">;</span></pre></div></div>

<p>Ainsi que le vertex shader lui même :</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;">Output.<span style="color: #202020;">BumpMapSamplingPos</span> <span style="color: #339933;">=</span> inTex<span style="color: #339933;">;</span></pre></div></div>

<p>Dans le pixel shader nous récupérons ces coordonnées :</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;">float4 bumpColor <span style="color: #339933;">=</span> tex2D<span style="color: #009900;">&#40;</span>WaterBumpMapSampler<span style="color: #339933;">,</span> PSIn.<span style="color: #202020;">BumpMapSamplingPos</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Un pixel se définit par ses 3 composantes de couleur (R, G, B) et un coefficient de transparence. L'instruction précédente implique que ce sont les composantes R et G de <code>bumpColor</code> qui nous indiquent à quel point il faut perturber la texture de réflexion. Cependant ces valeurs sont comprises dans l'intervalle [0;1] alors que nous avons besoins de valeurs dans [-1;1] pour avoir des perturbations différentes. Pour passer du premier intervalle au seconde, il suffit de soustraire le résultat par 0.5 et de multiplier par 2 :</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;">float2 perturbation <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span>bumpColor.<span style="color: #202020;">rg</span> <span style="color: #339933;">-</span> <span style="color:#800080;">0.5f</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">*</span><span style="color:#800080;">2.0f</span><span style="color: #339933;">;</span></pre></div></div>

<p>On obtient maintenant facilement la partie de la texture correspondante et on lui applique la perturbation :</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;">float2 perturbatedTexCoords <span style="color: #339933;">=</span> ProjectedTexCoords <span style="color: #339933;">+</span> perturbation<span style="color: #339933;">;</span>
Output.<span style="color: #202020;">Color</span> <span style="color: #339933;">=</span> tex2D<span style="color: #009900;">&#40;</span>ReflectionSampler<span style="color: #339933;">,</span> perturbatedTexCoords<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Il reste tout de même un problème. La texture du lac utilisée reste fixe, ce qui implique que les vagues que nous aurons sur le lac seront toujours de la même taille. Ainsi si vous vouliez faire des vagues plus grosses ou plus petites, c'est raté...<br />
Mais bon, nous allons corriger cela! Ajoutez deux variables à notre fichier d'effet :</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">float</span> xWaveLength<span style="color: #339933;">;</span>
<span style="color: #993333;">float</span> xWaveHeight<span style="color: #339933;">;</span></pre></div></div>

<p>Une pour faire varier la longueur des vagues, l'autre pour faire varier leur hauteur.<br />
Pour appliquer le changement de la longueur de la vague, il suffit de réduire les coordonnées de texture, de sorte que plus cette valeur sera grande, plus les coordonnées seront petites, et plus la texture sera étirée. Modifiez donc la ligne suivante dans le vertex shader :</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;">Output.<span style="color: #202020;">BumpMapSamplingPos</span> <span style="color: #339933;">=</span> inTex<span style="color: #339933;">/</span>xWaveLength<span style="color: #339933;">;</span></pre></div></div>

<p>Quand à la hauteur des vagues, elle va jouer sur la perturbation de la texture, en relation avec la longueur des vagues précédemment calculée. En effet, plus une vague est haute et courte, plus la pente est forte et la perturbation grande. En revanche, une hauteur de vague faible et une longueur forte implique des vagues presque plates, donc peu de perturbations. Modifiez le pixel shader comme suit :</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;">float2 perturbation <span style="color: #339933;">=</span> xWaveHeight<span style="color: #339933;">*</span><span style="color: #009900;">&#40;</span>bumpColor.<span style="color: #202020;">rg</span> <span style="color: #339933;">-</span> <span style="color:#800080;">0.5f</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">*</span><span style="color:#800080;">2.0f</span><span style="color: #339933;">;</span></pre></div></div>

<p>Maintenant que la longueur et la largeur de nos vagues est prise en compte dans le fichier d'effet, il nous faut encore leur attribuer des valeurs dans dans notre méthode <code>DrawWater()</code> :</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;">effect.<span style="color: #202020;">Parameters</span><span style="color: #009900;">&#91;</span><span style="color: #ff0000;">&quot;xWaveLength&quot;</span><span style="color: #009900;">&#93;</span>.<span style="color: #202020;">SetValue</span><span style="color: #009900;">&#40;</span><span style="color:#800080;">0.1f</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
effect.<span style="color: #202020;">Parameters</span><span style="color: #009900;">&#91;</span><span style="color: #ff0000;">&quot;xWaveHeight&quot;</span><span style="color: #009900;">&#93;</span>.<span style="color: #202020;">SetValue</span><span style="color: #009900;">&#40;</span><span style="color:#800080;">1f</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Voilà le résultat obtenu avec notre map :</p>
<div id="attachment_5399" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.mti.epita.fr/blogs/wp-content/uploads/2009/07/ripples.png"><img class="size-medium wp-image-5399" title="ripples" src="http://www.mti.epita.fr/blogs/wp-content/uploads/2009/07/ripples-300x234.png" alt="Vagues sur le lac" width="300" height="234" /></a><p class="wp-caption-text">Vagues sur le lac</p></div>
<h2>Équilibrer la réfraction et la réflexion</h2>
<p>Nous avons appliqué la technique de Bump mapping pour obtenir les perturbations à appliquer sur la texture de réflexion, nous allons donc faire la même chose pour la réfraction puis équilibrer le rendu de sorte que la proportion de réflexion et de réfraction utilisée par pixel dépende de l'angle de vue.<br />
Appliquons la technique du Bump mapping pour la réfraction. Modifiez la structure de sortie du vertex shader en ajoutant deux variables :</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;">float4 RefractionMapSamplingPos <span style="color: #339933;">:</span> TEXCOORD3<span style="color: #339933;">;</span>
float4 Position3D                <span style="color: #339933;">:</span> TEXCOORD4<span style="color: #339933;">;</span></pre></div></div>

<p>Ensuite modifiez le vertex shader :</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;">Output.<span style="color: #202020;">RefractionMapSamplingPos</span> <span style="color: #339933;">=</span> mul<span style="color: #009900;">&#40;</span>inPos<span style="color: #339933;">,</span> preWorldViewProjection<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
Output.<span style="color: #202020;">Position3D</span> <span style="color: #339933;">=</span> mul<span style="color: #009900;">&#40;</span>inPos<span style="color: #339933;">,</span> xWorld<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Vous remarquerez qu'à présent nous récupérons la position 3D du vertex. Cela nous permettra de calculer le vecteur de direction de la caméra.<br />
Au niveau du pixel shader, nous avons besoin de sauvegarder dans une variable la couleur obtenue avec la réflexion et faire le même procédé avec la réfraction :</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;">float2 ProjectedRefrTexCoords<span style="color: #339933;">;</span>
ProjectedRefrTexCoords.<span style="color: #202020;">x</span> <span style="color: #339933;">=</span> PSIn.<span style="color: #202020;">RefractionMapSamplingPos</span>.<span style="color: #202020;">x</span><span style="color: #339933;">/</span>PSIn.<span style="color: #202020;">RefractionMapSamplingPos</span>.<span style="color: #202020;">w</span><span style="color: #339933;">/</span><span style="color:#800080;">2.0f</span> <span style="color: #339933;">+</span> <span style="color:#800080;">0.5f</span><span style="color: #339933;">;</span>
ProjectedRefrTexCoords.<span style="color: #202020;">y</span> <span style="color: #339933;">=</span> <span style="color: #339933;">-</span>PSIn.<span style="color: #202020;">RefractionMapSamplingPos</span>.<span style="color: #202020;">y</span><span style="color: #339933;">/</span>PSIn.<span style="color: #202020;">RefractionMapSamplingPos</span>.<span style="color: #202020;">w</span><span style="color: #339933;">/</span><span style="color:#800080;">2.0f</span> <span style="color: #339933;">+</span> <span style="color:#800080;">0.5f</span><span style="color: #339933;">;</span>
float2 perturbatedRefrTexCoords <span style="color: #339933;">=</span> ProjectedRefrTexCoords <span style="color: #339933;">+</span> perturbation<span style="color: #339933;">;</span>
float4 refractiveColor <span style="color: #339933;">=</span> tex2D<span style="color: #009900;">&#40;</span>RefractionSampler<span style="color: #339933;">,</span> perturbatedRefrTexCoords<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
float4 reflectiveColor <span style="color: #339933;">=</span> tex2D<span style="color: #009900;">&#40;</span>ReflectionSampler<span style="color: #339933;">,</span> perturbatedTexCoords<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Si vous voulez vous faire une idée de ce à quoi peut ressembler le lac si on ne considère que la réfraction, il vous suffit de changer l'outpout :</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;">Output.<span style="color: #202020;">Color</span> <span style="color: #339933;">=</span> refractiveColor<span style="color: #339933;">;</span></pre></div></div>

<p>Le résultat est assez...intéressant :</p>
<div id="attachment_5402" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.mti.epita.fr/blogs/wp-content/uploads/2009/07/refraction_water.png"><img class="size-medium wp-image-5402" title="refraction_water" src="http://www.mti.epita.fr/blogs/wp-content/uploads/2009/07/refraction_water-300x234.png" alt="Vague sur le lac + réfraction" width="300" height="234" /></a><p class="wp-caption-text">Vague sur le lac + réfraction</p></div>
<p>Comme je vous l'ai expliqué précédemment, une matière telle que l'eau réfléchit et réfracte la lumière. C'est ici qu'intervient le <a href="http://www18.wolframalpha.com/input/?i=fresnel">terme de Fresnel</a> qui décrit la quantité de lumière qui est réfléchie et celle qui est réfractée pour un vecteur incident donné.<br />
Il nous faut donc calculer le vecteur dont l'origine est la caméra et la destination du pixel en cours de traitement. Nous aurons donc besoin de renseigner la position de la caméra via une variable du fichier d'effet :</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;">float3 xCamPos<span style="color: #339933;">;</span></pre></div></div>

<p>Ensuite on calcule le vecteur dans le pixel shader :</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;">float3 eyeVector <span style="color: #339933;">=</span> normalize<span style="color: #009900;">&#40;</span>xCamPos <span style="color: #339933;">-</span> PSIn.<span style="color: #202020;">Position3D</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Pour calculer le terme de Fresnel il nous faut aussi le vecteur normal au plan tangent à la vague passant par le pixel traité. Dans un premier temps, nous allons considérer que ce vecteur correspond au vecteur normal à notre lac, en tant que plan horizontal :</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;">float3 normalVector <span style="color: #339933;">=</span> float3<span style="color: #009900;">&#40;</span><span style="color: #0000dd;">0</span><span style="color: #339933;">,</span><span style="color: #0000dd;">0</span><span style="color: #339933;">,</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Dès lors, nous sommes capable de calculer la couleur d'un pixel en fonction de la réfraction, la réflexion et le terme de Fresnel :</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;">Output.<span style="color: #202020;">Color</span> <span style="color: #339933;">=</span> lerp<span style="color: #009900;">&#40;</span>reflectiveColor<span style="color: #339933;">,</span> refractiveColor<span style="color: #339933;">,</span> fresnelTerm<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>N'oubliez pas d'affecter la variable <code>xCamPos</code> dans la méthode <code>DrawWater()</code> :</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;">effect.<span style="color: #202020;">Parameters</span><span style="color: #009900;">&#91;</span><span style="color: #ff0000;">&quot;xCamPos&quot;</span><span style="color: #009900;">&#93;</span>.<span style="color: #202020;">SetValue</span><span style="color: #009900;">&#40;</span>cam.<span style="color: #202020;">Position</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Le résultat est déjà très satisfaisant si l'on se rapproche de l'eau :</p>
<div id="attachment_5404" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.mti.epita.fr/blogs/wp-content/uploads/2009/07/refl_refr_sample11.png"><img class="size-medium wp-image-5404" title="Réfraction + réflexion" src="http://www.mti.epita.fr/blogs/wp-content/uploads/2009/07/refl_refr_sample11-300x234.png" alt="Refraction + reflexion" width="300" height="234" /></a><p class="wp-caption-text">Réfraction + réflexion</p></div>
<p>Pour matifier notre lac, ce qui le rendra plus beau, nous allons rajouter un peu de bleu dans le pixel shader :</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">// On sauvegarde la couleur précédente</span>
float4 combinedColor <span style="color: #339933;">=</span> lerp<span style="color: #009900;">&#40;</span>reflectiveColor<span style="color: #339933;">,</span> refractiveColor<span style="color: #339933;">,</span> fresnelTerm<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
float4 dullColor <span style="color: #339933;">=</span> float4<span style="color: #009900;">&#40;</span><span style="color:#800080;">0.3f</span><span style="color: #339933;">,</span> <span style="color:#800080;">0.3f</span><span style="color: #339933;">,</span> <span style="color:#800080;">0.5f</span><span style="color: #339933;">,</span> <span style="color:#800080;">1.0f</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
Output.<span style="color: #202020;">Color</span> <span style="color: #339933;">=</span> lerp<span style="color: #009900;">&#40;</span>combinedColor<span style="color: #339933;">,</span> dullColor<span style="color: #339933;">,</span> <span style="color:#800080;">0.2f</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Ainsi, la couleur finale du pixel sera composée à 80% de la couleur que nous avons calculé avec les réflexion et la réfraction et à 20% de notre bleu <code>dullColor</code>.<br />
Voyez vous-même la différence :</p>
<div id="attachment_5405" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.mti.epita.fr/blogs/wp-content/uploads/2009/07/dull_lake.png"><img class="size-medium wp-image-5405" title="dull_lake" src="http://www.mti.epita.fr/blogs/wp-content/uploads/2009/07/dull_lake-300x235.png" alt="Ajout de bleu" width="300" height="235" /></a><p class="wp-caption-text">Ajout de bleu</p></div>
<h2>Faites bouger les choses!</h2>
<p>Notre lac est plutôt réussi, mais il manque encore un peu de dynamisme! Comme je vous l'ai expliqué au début, ce qui génère les vaguelettes à la surface d'un lac est le vent.<br />
Nous allons donc avoir besoin de la direction et la force du vent, mais aussi du temps courant dans notre fichier d'effet :</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">float</span> xTime<span style="color: #339933;">;</span>
float3 xWindDirection<span style="color: #339933;">;</span>
<span style="color: #993333;">float</span> xWindForce<span style="color: #339933;">;</span></pre></div></div>

<p>On modifie ensuite le vertex shader pour prendre en compte le vent :</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;">float3 windDir <span style="color: #339933;">=</span> normalize<span style="color: #009900;">&#40;</span>xWindDirection<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
float3 perpDir <span style="color: #339933;">=</span> cross<span style="color: #009900;">&#40;</span>xWindDirection<span style="color: #339933;">,</span> float3<span style="color: #009900;">&#40;</span><span style="color: #0000dd;">0</span><span style="color: #339933;">,</span><span style="color: #0000dd;">0</span><span style="color: #339933;">,</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #993333;">float</span> ydot <span style="color: #339933;">=</span> dot<span style="color: #009900;">&#40;</span>inTex<span style="color: #339933;">,</span> xWindDirection.<span style="color: #202020;">xy</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #993333;">float</span> xdot <span style="color: #339933;">=</span> dot<span style="color: #009900;">&#40;</span>inTex<span style="color: #339933;">,</span> perpDir.<span style="color: #202020;">xy</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
float2 moveVector <span style="color: #339933;">=</span> float2<span style="color: #009900;">&#40;</span>xdot<span style="color: #339933;">,</span> ydot<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
moveVector.<span style="color: #202020;">y</span> <span style="color: #339933;">+=</span> xTime<span style="color: #339933;">*</span>xWindForce<span style="color: #339933;">;</span>
Output.<span style="color: #202020;">BumpMapSamplingPos</span> <span style="color: #339933;">=</span> moveVector<span style="color: #339933;">/</span>xWaveLength<span style="color: #339933;">;</span></pre></div></div>

<p>On renseigne ensuite ces variables dans notre méthode <code>DrawWater()</code> :</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"> effect.<span style="color: #202020;">Parameters</span><span style="color: #009900;">&#91;</span><span style="color: #ff0000;">&quot;xTime&quot;</span><span style="color: #009900;">&#93;</span>.<span style="color: #202020;">SetValue</span><span style="color: #009900;">&#40;</span>time<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
 effect.<span style="color: #202020;">Parameters</span><span style="color: #009900;">&#91;</span><span style="color: #ff0000;">&quot;xWindForce&quot;</span><span style="color: #009900;">&#93;</span>.<span style="color: #202020;">SetValue</span><span style="color: #009900;">&#40;</span><span style="color:#800080;">20.0f</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
 effect.<span style="color: #202020;">Parameters</span><span style="color: #009900;">&#91;</span><span style="color: #ff0000;">&quot;xWindDirection&quot;</span><span style="color: #009900;">&#93;</span>.<span style="color: #202020;">SetValue</span><span style="color: #009900;">&#40;</span>new Vector3<span style="color: #009900;">&#40;</span><span style="color: #0000dd;">1</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Cette fois une capture d'écran ne suffirait pas à vous montrer le résultat, lancez l'application, et vous verrez l'effet du vent sur le lac.</p>
<h2>Conclusion</h2>
<p>J'espère qu'à travers ce tutoriel vous avez compris comment faire de l'eau en 3D, avec XNA en l'occurrence. Nous avons vu les concepts fondamentaux qui permettent de réaliser de l'eau en travaillant sur les textures, ce qui nous donne un résultat intéressant. De plus, cette méthode implique peu de travail du coté du CPU puisqu'elle s'applique à faire travailler la carte graphique via les shaders.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mti.epita.fr/blogs/2010/03/04/xna-30-faire-de-leau-12/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Flash et Interactivité</title>
		<link>http://www.mti.epita.fr/blogs/2010/03/01/flash-et-interface-utilisateur/</link>
		<comments>http://www.mti.epita.fr/blogs/2010/03/01/flash-et-interface-utilisateur/#comments</comments>
		<pubDate>Mon, 01 Mar 2010 13:17:19 +0000</pubDate>
		<dc:creator>Cédric Raud</dc:creator>
		
		<category><![CDATA[Autres]]></category>

		<category><![CDATA[Jeux Vidéo]]></category>

		<category><![CDATA[RIA/RDA]]></category>

		<category><![CDATA[navigateur]]></category>

		<category><![CDATA[flash]]></category>

		<category><![CDATA[Innovant]]></category>

		<category><![CDATA[Intérativité]]></category>

		<category><![CDATA[Interface Utilisateur]]></category>

		<category><![CDATA[UI]]></category>

		<guid isPermaLink="false">http://www.mti.epita.fr/blogs/?p=5377</guid>
		<description><![CDATA[Conçue comme un outil d’animation en 1996, la technologie Adobe Flash (anciennement Macromedia Flash) fit son entrée dans le monde du web par la petite porte, souvent comparée aux animations gifs qui encombraient les sites web de l’époque. Malgré cela, sa pénétration record et l’évolution des outils permettant d’en générer firent progressivement de lui la [...]]]></description>
			<content:encoded><![CDATA[<p>Conçue comme un outil d’animation en 1996, la technologie Adobe Flash (anciennement Macromedia Flash) fit son entrée dans le monde du web par la petite porte, souvent comparée aux animations gifs qui encombraient les sites web de l’époque. Malgré cela, sa pénétration record et l’évolution des outils permettant d’en générer firent progressivement de lui la technologie numéro un en ce qui concerne le développement de sites multimédia. Devenue l’arme de prédilection des agences de marketing / communication, son utilisation aujourd’hui dépasse la simple présentation de contenu pour arriver à la création d’interfaces complexes, de productions multimédias <span> </span>et d’expérimentations ergonomiques.</p>
<p>Loin de la classique navigation page par page introduite par le HTML, Flash propose des sites vivants, réactifs, faisant la part belle à la découverte. C’est donc à cette réinvention de l’interface que nous nous intéresserons au sein de cet article, et ce à travers un panorama de ce qu’a proposé le web à ce sujet depuis ces dernières années.</p>
<p><span id="more-5377"></span></p>
<h1>Genèse</h1>
<p>A partir de 1998 apparurent les premiers sites exploitant entièrement le potentiel de Flash en terme animation. Ceux-ci tiraient parti de la gestion native des graphiques vectoriels pour présenter un site adaptable à n’importe quelle résolution d’écran. A cela était ajoutée une myriade d’effets visuels et sonores, la moindre transition étant animée. Bien qu’ayant mal vieilli, les sites ci-dessous n’en demeurent pas moins les ancêtres des sites Flash d’aujourd’hui.</p>
<div id="attachment_5417" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.eye4u.com/home/"><img class="size-medium wp-image-5417" title="http://www.eye4u.com/home/" src="http://www.mti.epita.fr/blogs/wp-content/uploads/2009/08/screen_002-300x210.jpg" alt="http://www.eye4u.com/home/" width="300" height="210" /></a><p class="wp-caption-text">http://www.eye4u.com/home/ (1998)</p></div>
<div id="attachment_5418" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.balthaser.com/b1/home.html"><img class="size-medium wp-image-5418" title="http://www.balthaser.com/b1/home.html" src="http://www.mti.epita.fr/blogs/wp-content/uploads/2009/08/screen_003-300x191.jpg" alt="http://www.balthaser.com/b1/home.html" width="300" height="191" /></a><p class="wp-caption-text">http://www.balthaser.com/b1/home.html (1998)</p></div>
<p><a href="http://www.balthaser.com/b1/home.html%201998"> </a></p>
<p>Plus récent, ce dernier sorti en 2001 fut l’un des sites web dont le design fut le plus copié :</p>
<div id="attachment_5419" class="wp-caption aligncenter" style="width: 310px"><a href="http://v3.2a-archive.com"><img class="size-medium wp-image-5419" title="http://v3.2a-archive.com" src="http://www.mti.epita.fr/blogs/wp-content/uploads/2009/08/screen_004-300x205.jpg" alt="http://v3.2a-archive.com" width="300" height="205" /></a><p class="wp-caption-text">http://v3.2a-archive.com</p></div>
<h1>Expérimentations</h1>
<p>Encore tout jeune, le Flash se cherche. L’un des sites les plus expérimentaux est incontestablement celui de Yugo Nakamura, designer Japonais qui mit en ligne dès 1998 yugop.com, laboratoire foisonnant d’expériences interactives :</p>
<div id="attachment_5420" class="wp-caption aligncenter" style="width: 310px"><a href="http://yugop.com"><img class="size-medium wp-image-5420" title="http://yugop.com" src="http://www.mti.epita.fr/blogs/wp-content/uploads/2009/08/screen_005-300x216.jpg" alt="http://yugop.com" width="300" height="216" /></a><p class="wp-caption-text">http://yugop.com</p></div>
<p>Beaucoup suivront ses traces :</p>
<div id="attachment_5421" class="wp-caption aligncenter" style="width: 310px"><a href="http://lab.mathieu-badimon.com/"><img class="size-medium wp-image-5421" title="http://lab.mathieu-badimon.com/" src="http://www.mti.epita.fr/blogs/wp-content/uploads/2009/08/screen_006-300x201.jpg" alt="http://lab.mathieu-badimon.com/" width="300" height="201" /></a><p class="wp-caption-text">http://lab.mathieu-badimon.com/</p></div>
<h1>Navigation</h1>
<p>Aux expériences abstraites viennent s’ajouter celles tentant de définir des nouveaux modèles de navigation. L’une des plus notables est celle d'un site allemand qui tente de répondre la question suivante : est-il possible de concevoir des interfaces utilisables sans cliquer ? A travers différents tableaux et mini-jeux, c’est l'immersion dans un monde sans clic que l'utilisateur est amené à découvrir :</p>
<div id="attachment_5422" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.dontclick.it"><img class="size-medium wp-image-5422" title="http://www.dontclick.it" src="http://www.mti.epita.fr/blogs/wp-content/uploads/2009/08/screen_007-300x186.jpg" alt="http://www.dontclick.it" width="300" height="186" /></a><p class="wp-caption-text">http://www.dontclick.it</p></div>
<p>Ces expériences sont quelques fois utilisées au sein de solutions réelles comme c’est le cas pour cette boutique en ligne qui propose plusieurs navigations innovantes au sein de ses produits : par couleur, via une ligne de temps, par géolocalisation, etc…</p>
<div id="attachment_5423" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.etsy.com/buy.php"><img class="size-medium wp-image-5423" title="http://www.etsy.com/buy.php" src="http://www.mti.epita.fr/blogs/wp-content/uploads/2009/08/screen_008-300x213.jpg" alt="http://www.etsy.com/buy.php" width="300" height="213" /></a><p class="wp-caption-text">http://www.etsy.com/buy.php</p></div>
<p><a href="http://www.etsy.com/buy.php"></a></p>
<h1>Vidéo</h1>
<p>Les capacités de Flash au niveau de la vidéo furent également exploitées au maximum. Cela aboutit à des sites toujours plus réalistes pouvant présenter une navigation originale comme ce que propose Ikea sur son site promotionnel :</p>
<div id="attachment_5424" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.ikea.com/ms/sv_SE/kampanj/fy06_dromkok/dromkok.html"><img class="size-medium wp-image-5424" title="http://www.ikea.com/ms/sv_SE/kampanj/fy06_dromkok/dromkok.html" src="http://www.mti.epita.fr/blogs/wp-content/uploads/2009/08/screen_011-300x177.jpg" alt="http://www.ikea.com/ms/sv_SE/kampanj/fy06_dromkok/dromkok.html" width="300" height="177" /></a><p class="wp-caption-text">http://www.ikea.com/ms/sv_SE/kampanj/fy06_dromkok/dromkok.html</p></div>
<div id="attachment_5425" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.leschinois.com/"><img class="size-medium wp-image-5425" title="http://www.leschinois.com" src="http://www.mti.epita.fr/blogs/wp-content/uploads/2009/08/screen_009-300x214.jpg" alt="http://www.leschinois.com" width="300" height="214" /></a><p class="wp-caption-text">http://www.leschinois.com</p></div>
<p><a href="http://www.leschinois.com/"></a></p>
<h1>Illusion de 3D</h1>
<p>L’une des principales utilisations de la vidéo en termes d’interface fut de servir de transition entre écrans fixes pour produire une illusion de 3D. Les différentes scènes 3D sont ainsi précalculées et intégrées au sein du site web pour former un ensemble cohérent.</p>
<div id="attachment_5426" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.whoswestudios.com/flashsite.html"><img class="size-medium wp-image-5426" title="http://www.whoswestudios.com/flashsite.html" src="http://www.mti.epita.fr/blogs/wp-content/uploads/2009/08/screen_012-300x213.jpg" alt="http://www.whoswestudios.com/flashsite.html" width="300" height="213" /></a><p class="wp-caption-text">http://www.whoswestudios.com/flashsite.html</p></div>
<div id="attachment_5427" class="wp-caption aligncenter" style="width: 310px"><a href="http://monoedge.com/main"><img class="size-medium wp-image-5427" title="http://monoedge.com/main" src="http://www.mti.epita.fr/blogs/wp-content/uploads/2009/08/screen_013-300x252.jpg" alt="http://monoedge.com/main" width="300" height="252" /></a><p class="wp-caption-text">http://monoedge.com/main</p></div>
<div id="attachment_5428" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.interactivehrp.com/aaatown/"><img class="size-medium wp-image-5428" title="http://www.interactivehrp.com/aaatown/" src="http://www.mti.epita.fr/blogs/wp-content/uploads/2009/08/screen_015-300x169.jpg" alt="http://www.interactivehrp.com/aaatown/" width="300" height="169" /></a><p class="wp-caption-text">http://www.interactivehrp.com/aaatown/</p></div>
<p><a href="http://www.interactivehrp.com/aaatown/"></a></p>
<h1>3D Temps Réel</h1>
<p>Avec la croissance de la puissance des ordinateur, Flash devient en mesure de faire tourner des applications en véritable 3D interactive. Bien que non inclus dans le kit de développement par défaut, plusieurs bibliothèques de 3D virent le jour parmi lesquelles <a href="http://blog.papervision3d.org/">Papervision</a>, <a href="http://alternativaplatform.com/en/alternativa3d/">Alternativa3D</a> ou encore <a href="http://blog.directflex.net/">DirectFlex</a>. La 3D temps réel dans Flash est encore peu utilisée mais chaque nouvelle production repousse les limites techniques en regroupant <span> </span>vidéo, audio, 3D et navigation au sein d’un univers complexe.</p>
<div id="attachment_5429" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.barcinski-jeanjean.com/"><img class="size-medium wp-image-5429" title="http://www.barcinski-jeanjean.com/" src="http://www.mti.epita.fr/blogs/wp-content/uploads/2009/08/screen_016-300x227.jpg" alt="http://www.barcinski-jeanjean.com/" width="300" height="227" /></a><p class="wp-caption-text">http://www.barcinski-jeanjean.com/</p></div>
<div id="attachment_5430" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.ecodazoo.com/"><img class="size-medium wp-image-5430" title="http://www.ecodazoo.com/" src="http://www.mti.epita.fr/blogs/wp-content/uploads/2009/08/screen_017-300x246.jpg" alt="http://www.ecodazoo.com/" width="300" height="246" /></a><p class="wp-caption-text">http://www.ecodazoo.com/</p></div>
<p><a href="http://www.ecodazoo.com/"></a></p>
<p>L’application suivante présente un concept de film visible à 360° :</p>
<div id="attachment_5431" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.villmer.com/"><img class="size-medium wp-image-5431" title="http://www.villmer.com/" src="http://www.mti.epita.fr/blogs/wp-content/uploads/2009/08/screen_019-300x181.jpg" alt="http://www.villmer.com/" width="300" height="181" /></a><p class="wp-caption-text">http://www.villmer.com/</p></div>
<p><a href="http://www.villmer.com/"></a></p>
<div id="attachment_5432" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.whitevoid.com/o2cando/"><img class="size-medium wp-image-5432" title="http://www.whitevoid.com/o2cando/" src="http://www.mti.epita.fr/blogs/wp-content/uploads/2009/08/screen_020-300x204.jpg" alt="http://www.whitevoid.com/o2cando/" width="300" height="204" /></a><p class="wp-caption-text">http://www.whitevoid.com/o2cando/</p></div>
<p><a href="http://www.whitevoid.com/o2cando/"></a></p>
<p>Cette dernière démonstration présente un concept de bureau 3D en Flash exporté sous forme d’application grâce à Adobe Air :</p>
<div id="attachment_5433" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.youtube.com/watch?v=Kz5RzBS7seg"><img class="size-medium wp-image-5433" title="http://www.youtube.com/watch?v=Kz5RzBS7seg" src="http://www.mti.epita.fr/blogs/wp-content/uploads/2009/08/screen_018-300x168.jpg" alt="http://www.youtube.com/watch?v=Kz5RzBS7seg" width="300" height="168" /></a><p class="wp-caption-text">http://www.youtube.com/watch?v=Kz5RzBS7seg</p></div>
<p><a href="http://www.youtube.com/watch?v=Kz5RzBS7seg"></a></p>
<h1>Webcam</h1>
<p>Le support de la webcam fut également une source d’inspiration pour les créateurs. Le site ci-dessous a ainsi entièrement basé sa navigation sur un contrôle via la webcam, les mouvements de la tête faisant office de clics :</p>
<div id="attachment_5434" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.hrp.com"><img class="size-medium wp-image-5434" title="http://www.hrp.com" src="http://www.mti.epita.fr/blogs/wp-content/uploads/2009/08/screen_021-300x230.jpg" alt="http://www.hrp.com" width="300" height="230" /></a><p class="wp-caption-text">http://www.hrp.com</p></div>
<p><a href="http://www.hrp.com/"></a></p>
<h1>Réalité augmentée</h1>
<p>Consistant à ajouter en surimpression un environnement 3D à de la vidéo, la réalité augmentée est encore peu répandue. Toutefois, certaines entreprises n’hésitent pas à tenter l’expérience comme c’est le cas d’Ubisoft et son site promotionnel pour Assasins Creed 2 :</p>
<div id="attachment_5435" class="wp-caption aligncenter" style="width: 310px"><a href="http://assassinscreed.fr.ubi.com/assassins-creed-2/teaser/"><img class="size-medium wp-image-5435" title="http://assassinscreed.fr.ubi.com/assassins-creed-2/teaser/" src="http://www.mti.epita.fr/blogs/wp-content/uploads/2009/08/screen_023-300x162.jpg" alt="http://assassinscreed.fr.ubi.com/assassins-creed-2/teaser/" width="300" height="162" /></a><p class="wp-caption-text">http://assassinscreed.fr.ubi.com/assassins-creed-2/teaser/</p></div>
<div id="attachment_5436" class="wp-caption aligncenter" style="width: 310px"><a href="http://ge.ecomagination.com/smartgrid/#/augmented_reality"><img class="size-medium wp-image-5436" title="http://ge.ecomagination.com/smartgrid/#/augmented_reality" src="http://www.mti.epita.fr/blogs/wp-content/uploads/2009/08/screen_022-300x223.jpg" alt="http://ge.ecomagination.com/smartgrid/#/augmented_reality" width="300" height="223" /></a><p class="wp-caption-text">http://ge.ecomagination.com/smartgrid/#/augmented_reality</p></div>
<p><a href="http://ge.ecomagination.com/smartgrid/#/augmented_reality"></a></p>
<h1>Ecrans de chargement</h1>
<p>La taille des sites Web évoluant parallèlement à la croissance du débit Internet, les écrans de chargement ne disparurent pas du Web avec la diffusion du haut débit. Un site s’est même chargé de recenser les plus réussis d’entres-eux :</p>
<div id="attachment_5437" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.prettyloaded.com/"><img class="size-medium wp-image-5437" title="http://www.prettyloaded.com" src="http://www.mti.epita.fr/blogs/wp-content/uploads/2009/08/screen_024-300x217.jpg" alt="http://www.prettyloaded.com" width="300" height="217" /></a><p class="wp-caption-text">http://www.prettyloaded.com</p></div>
<p><a href="http://www.prettyloaded.com/"></a></p>
<h1>Immersion</h1>
<p>Flash fut même utilisé pour jouer des tours au visiteur en empruntant les traits du site web d’origine pour mieux le singer :</p>
<div id="attachment_5438" class="wp-caption aligncenter" style="width: 310px"><a href="http://producten.hema.nl"><img class="size-medium wp-image-5438" title="http://producten.hema.nl" src="http://www.mti.epita.fr/blogs/wp-content/uploads/2009/08/screen_025-300x284.jpg" alt="http://producten.hema.nl" width="300" height="284" /></a><p class="wp-caption-text">http://producten.hema.nl</p></div>
<div id="attachment_5439" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.youtube.com/wariolandshakeit2008"><img class="size-medium wp-image-5439" title="http://www.youtube.com/wariolandshakeit2008" src="http://www.mti.epita.fr/blogs/wp-content/uploads/2009/08/screen_026-300x225.jpg" alt="http://www.youtube.com/wariolandshakeit2008" width="300" height="225" /></a><p class="wp-caption-text">http://www.youtube.com/wariolandshakeit2008</p></div>
<p><a href="http://www.youtube.com/wariolandshakeit2008"></a></p>
<h1>Conclusion</h1>
<p>Malgré les critiques, Flash peut se targuer d’avoir redéfini ce que peut proposer le web en termes d’interactivité. Grâce à la démocratisation du haut débit, tout le monde peut désormais avoir accès à un contenu riche, multimédia et de plus en plus immersif. Que ce soit via la vidéo, la 3D ou la combinaison des deux, Flash n’a pas encore révélé toutes ses surprises.</p>
<p>Si un site non présent sur cette page vous a marqué, n'hésitez pas à le partager dans les commentaires.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mti.epita.fr/blogs/2010/03/01/flash-et-interface-utilisateur/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Interview Michaël Chaize &#038; Thibault Imbert - La concurrence et les attentes autours de Flash</title>
		<link>http://www.mti.epita.fr/blogs/2010/02/27/interview-michael-chaize-thibault-imbert-les-attentes-flash-et-la-concurrence/</link>
		<comments>http://www.mti.epita.fr/blogs/2010/02/27/interview-michael-chaize-thibault-imbert-les-attentes-flash-et-la-concurrence/#comments</comments>
		<pubDate>Sat, 27 Feb 2010 04:00:29 +0000</pubDate>
		<dc:creator>Vincent Nguyen-Huu</dc:creator>
		
		<category><![CDATA[Adobe]]></category>

		<category><![CDATA[RIA/RDA]]></category>

		<category><![CDATA[chaize]]></category>

		<category><![CDATA[imbert]]></category>

		<category><![CDATA[interview]]></category>

		<category><![CDATA[max]]></category>

		<category><![CDATA[mobile]]></category>

		<category><![CDATA[RDA]]></category>

		<category><![CDATA[video]]></category>

		<guid isPermaLink="false">http://www.mti.epita.fr/blogs/?p=6374</guid>
		<description><![CDATA[Faisant suite aux interviews concernant l'Adobe MAX 2009 et la plateforme Flash, voici la dernière vidéo de notre entrevue exclusive avec Michaël Chaize et Thibault Imbert, experts des produits Flex et Creative Suite chez Adobe France. Rendez-vous cette fois-ci autours de questions traitants des concurrents directs d'Adobe pour la création de RIA et de RDA, [...]]]></description>
			<content:encoded><![CDATA[<p>Faisant suite aux interviews concernant l'Adobe MAX 2009 et la plateforme Flash, voici la dernière vidéo de notre entrevue exclusive avec Michaël Chaize et Thibault Imbert, experts des produits Flex et Creative Suite chez Adobe France. Rendez-vous cette fois-ci autours de questions traitants des concurrents directs d'Adobe pour la création de RIA et de RDA, comme Microsoft avec Silverlight et WPF, et des attentes utilisateurs à propos de la plateforme Flash.</p>
<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="400" height="300" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://vimeo.com/moogaloop.swf?clip_id=8298122&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1&amp;group_id=" /><embed type="application/x-shockwave-flash" width="400" height="300" src="http://vimeo.com/moogaloop.swf?clip_id=8298122&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1&amp;group_id=" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
<p><a href="http://vimeo.com/groups/19345/videos/8298122">Interview sur Flash et sa concurrence</a> from <a href="http://vimeo.com">Vimeo</a>.</p>
<p>Un grand merci à Michaël Chaize et Thibault Imbert pour nous avoir permis de réaliser ces interviews.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mti.epita.fr/blogs/2010/02/27/interview-michael-chaize-thibault-imbert-les-attentes-flash-et-la-concurrence/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Interview Michaël Chaize &#038; Thibault Imbert - La plateforme Flash</title>
		<link>http://www.mti.epita.fr/blogs/2010/02/24/interview-michael-chaize-thibault-imbert-la-plateforme-flash/</link>
		<comments>http://www.mti.epita.fr/blogs/2010/02/24/interview-michael-chaize-thibault-imbert-la-plateforme-flash/#comments</comments>
		<pubDate>Wed, 24 Feb 2010 04:00:42 +0000</pubDate>
		<dc:creator>Vincent Nguyen-Huu</dc:creator>
		
		<category><![CDATA[Adobe]]></category>

		<category><![CDATA[RIA/RDA]]></category>

		<category><![CDATA[mobile]]></category>

		<category><![CDATA[chaize]]></category>

		<category><![CDATA[imbert]]></category>

		<category><![CDATA[interview]]></category>

		<category><![CDATA[max]]></category>

		<category><![CDATA[RDA]]></category>

		<category><![CDATA[video]]></category>

		<guid isPermaLink="false">http://www.mti.epita.fr/blogs/?p=6369</guid>
		<description><![CDATA[Produit phare d'Adobe pour ce qui est de la création d'animations et d'applications riches, la technologie Flash et sa plateforme, se perfectionnent d'année en année. Avec la sortie d'ici quelques mois de la prochaine version de Flash Professional, du Flash Player 10.1, de AIR 2, de Flash Catalyst, etc., on peut s'attendre à une année [...]]]></description>
			<content:encoded><![CDATA[<p>Produit phare d'Adobe pour ce qui est de la création d'animations et d'applications riches, la technologie Flash et sa plateforme, se perfectionnent d'année en année. Avec la sortie d'ici quelques mois de la prochaine version de Flash Professional, du Flash Player 10.1, de AIR 2, de Flash Catalyst, etc., on peut s'attendre à une année 2010 pleines de promesses pour Adobe et les designers/developpeurs du monde entier.</p>
<p>Nous vous avions proposé il y a quelques temps une interview exclusive de Michaël Chaize et Thibault Imbert, professionnels des produits Flex et Creative Suite chez Adobe France, à propos de l'Adobe MAX 2009. Nous vous offrons maintenant une nouvelle interview de nos deux compères à propos de la plateforme Flash, de ses nouveautés et de son ouverture sur le marché du mobile.</p>
<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="400" height="300" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://vimeo.com/moogaloop.swf?clip_id=8288989&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1&amp;group_id=" /><embed type="application/x-shockwave-flash" width="400" height="300" src="http://vimeo.com/moogaloop.swf?clip_id=8288989&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1&amp;group_id=" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
<p><a href="http://vimeo.com/groups/19345/videos/8288989">Interview sur la Plateforme Flash</a> from <a href="http://vimeo.com">Vimeo</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mti.epita.fr/blogs/2010/02/24/interview-michael-chaize-thibault-imbert-la-plateforme-flash/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Interview Michaël Chaize &#038; Thibault Imbert - Adobe MAX</title>
		<link>http://www.mti.epita.fr/blogs/2010/02/21/interview-michael-chaize-thibault-imbert-adobe-max/</link>
		<comments>http://www.mti.epita.fr/blogs/2010/02/21/interview-michael-chaize-thibault-imbert-adobe-max/#comments</comments>
		<pubDate>Sun, 21 Feb 2010 14:56:40 +0000</pubDate>
		<dc:creator>Vincent Nguyen-Huu</dc:creator>
		
		<category><![CDATA[Adobe]]></category>

		<category><![CDATA[RIA/RDA]]></category>

		<category><![CDATA[Web]]></category>

		<category><![CDATA[mobile]]></category>

		<category><![CDATA[chaize]]></category>

		<category><![CDATA[imbert]]></category>

		<category><![CDATA[interview]]></category>

		<category><![CDATA[max]]></category>

		<category><![CDATA[RDA]]></category>

		<category><![CDATA[video]]></category>

		<guid isPermaLink="false">http://www.mti.epita.fr/blogs/?p=6354</guid>
		<description><![CDATA[Chaque année Adobe présente au monde ses avancées en matière de développement, de design et d'innovation au travers de plusieurs conférences interactives et animées par des professionnels des nouvelles technologies : les Adobe MAX.
En octobre dernier au Los Angeles Convention Center en Californie, s'est tenue la dernière édition de ces Adobe MAX. Quelques chanceux ont [...]]]></description>
			<content:encoded><![CDATA[<p>Chaque année Adobe présente au monde ses avancées en matière de développement, de design et d'innovation au travers de plusieurs conférences interactives et animées par des professionnels des nouvelles technologies : les Adobe MAX.</p>
<p>En octobre dernier au Los Angeles Convention Center en Californie, s'est tenue la dernière édition de ces Adobe MAX. Quelques chanceux ont pu y participer et parmis eux deux représentants d'Adobe France, Michaël Chaize et Thibault Imbert, ont eut l'immense privilège de réaliser une présentation: "A Deep Dive Into Ten Innovative Flash Projects" (une plongée dans dix projets Flash novateurs).</p>
<p>Les étudiants de la spécialisation MTI sont allés à leur rencontre afin qu'ils puissent nous faire partager leur expérience et leur témoignage.</p>
<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="400" height="300" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://vimeo.com/moogaloop.swf?clip_id=8288011&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1&amp;group_id=" /><embed type="application/x-shockwave-flash" width="400" height="300" src="http://vimeo.com/moogaloop.swf?clip_id=8288011&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1&amp;group_id=" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
<p><a href="http://vimeo.com/groups/19345/videos/8288011">Interview Adobe Max 2009</a> from <a href="http://vimeo.com">Vimeo</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mti.epita.fr/blogs/2010/02/21/interview-michael-chaize-thibault-imbert-adobe-max/feed/</wfw:commentRss>
		</item>
		<item>
		<title>AviSynth, filtre vidéo et encodage vidéo</title>
		<link>http://www.mti.epita.fr/blogs/2010/02/21/avisynth-filtre-video-et-encodage-video/</link>
		<comments>http://www.mti.epita.fr/blogs/2010/02/21/avisynth-filtre-video-et-encodage-video/#comments</comments>
		<pubDate>Sat, 20 Feb 2010 22:42:23 +0000</pubDate>
		<dc:creator>Jerôme Respaut</dc:creator>
		
		<category><![CDATA[Autres]]></category>

		<category><![CDATA[Non classé]]></category>

		<category><![CDATA[avisynth]]></category>

		<category><![CDATA[compression]]></category>

		<category><![CDATA[encodage]]></category>

		<category><![CDATA[filtre]]></category>

		<category><![CDATA[source]]></category>

		<category><![CDATA[video]]></category>

		<guid isPermaLink="false">http://www.mti.epita.fr/blogs/?p=5957</guid>
		<description><![CDATA[Préambule
Cet article va vous expliquer ce qu'est AviSynth, quelle est son intérêt et comment réussir à utiliser la puissance des filtres qui le compose. Avec ces scripts AviSynth, vous pourrez dans un second temps vous attaquer à des encodages précis et de qualité.
Présentation
AviSynth est ce que l'on appelle un Frameserver, en français un serveur d'images. [...]]]></description>
			<content:encoded><![CDATA[<h3>Préambule</h3>
<p>Cet article va vous expliquer ce qu'est AviSynth, quelle est son intérêt et comment réussir à utiliser la puissance des filtres qui le compose. Avec ces scripts AviSynth, vous pourrez dans un second temps vous attaquer à des encodages précis et de qualité.<span id="more-5957"></span></p>
<h3>Présentation</h3>
<p>AviSynth est ce que l'on appelle un Frameserver, en français un serveur d'images. C'est à dire qu'AviSynth agit entre votre source vidéo ou audio (la vidéo que vous voulez compresser ou réenregistrer) et votre logiciel d'encodage à condition, bien sûr que celui-ci sache ouvrir des fichiers AVS. Avisynth fournit, image par image, votre film à votre encodeur (VirtualDubMod, TMPGEnc, Cinema Craft Encoder, Producer, FFMPEG, etc....).</p>
<p>Le fait qu'il alimente votre application vidéo images par images vous permet de traiter des fichiers de très grosse taille (dépassant les 20go) là où ces mêmes applications ne sauraient gérer des fichiers de telles tailles (limite fatidique pour certaines applications vidéo) puisque quand AviSynth leur fourni ces images une par une, les applications n'ont aucune information concernant la taille finale du fichier et n’ont pas besoin de charge la source en ram par exemple. De plus, toutes les sources compatibles AviSynth pourront devenir compatibles avec les logiciels encodeurs bien que ceux-ci ne les acceptaient pas au départ.</p>
<p>Mais AviSynth ne fait pas que servir des images à votre logiciel d'encodage, il a aussi bien d'autres fonctions:</p>
<ul>
<li>Il vous permet, dans les dernières versions, de travaillez dans l'espace couleur YUV.</li>
<li> Il peut filtrer votre film, AviSynth possède les filtres vidéo les plus puissants et les plus performants.</li>
<li> Il vous permet d'ouvrir des fichiers vidéo possédant des formats que votre programme d'encodage ne saurait reconnaître, comme le MPEG, le MOV (QuickTime), du WMV (Windows Media) ou encore du RealVideo.</li>
<li> Il est un économiseur d'espace disque puisqu'il ne créer aucun fichier vidéo provisoire ou temporaire comme le font certaines applications.</li>
<li> Il vous permet de faire fusionner plusieurs fichiers vidéo, audio, appliquer des transformations à la volée, faire de la superposition d’images.</li>
<li> Il vous permet d'insérer des sous-titres aux formats texte ou images directement dans votre film.</li>
</ul>
<p>Il est à noter qu’AviSynth ne fonctionne que pour Windows pour le moment.</p>
<h3>Comment ça marche ?</h3>
<p>Il suffit d’installer AviSynth (je recommande la version au minimum 2.55, ou plus récent disponible sur <a href="http://avisynth.org/">http://avisynth.org/</a>). Le fichier AVS est tout simplement un fichier texte que l’on peut créer avec Notepad qui contient de simples commandes, nous pourrons dire que les AVS sont des sortes de script vidéo.</p>
<p>Tous les filtres et plugins sont des fichiers DLL qu’il suffit de copier dans le dossier plug-ins d’AviSynth. Ces filtres seront lus et utilisés automatiquement s’ils sont installés dans ce dossier, autrement il faudra les charger dans l’AVS avec une commande du type :</p>
<p><code>LoadPlugins("path_plugin")</code></p>
<ul>
<li>La syntaxe d'un filtre s'écrit toujours de la même manière, le nom du filtre puis une parenthèse dans laquelle se trouvent écrites ses fonctions. Une chaîne de caractères peut contenir n'importe quels caractères, excepté les terminaisons telles que les guillemets ou les doubles quotes. Il y a deux types de fonctions, celles qui indiquent des chemins (path) comme les plugins de sources vidéo ou de sous-titres, exemple:<br />
<code>MPEG2Source("C:\mon_repertoire\projet.d2v") </code> pour charger une source vidéo<br />
<code>TextSub("C:\mon_repertoire\fichier.srt") </code> pour un fichier sous-titres au format texte</li>
<li>et celles qui exercent directement un filtrage spécifique sur la source comme un filtre jouant sur la luminance,exemple:
<p><code>LumaFilter(-2,0.9)</code> une fonction agissant sur la lumière de la vidéo et qui prend en argument deux valeurs.</li>
<li>Vous devez respecter impérativement l'orthographe du filtre, toutefois l'utilisation de majuscules ou de minuscules n'a aucune incidence puisque la plupart des scripts sous Windows ne sont pas Case Sensitive.</li>
<li> Les valeurs ou variables d'un filtre sont toujours entre parenthèses, aucun espace dans ces parenthèses n'est toléré.</li>
<li> Les chemins de fichiers sont forcément des chaînes de caractère et doivent donc être entre doubles quote.</li>
<li> Toutes les fonctions possèdent des valeurs par défaut, et les arguments ne sont généralement pas obligatoires. Exemple : Undot est communément utilisé comme ceci: Undot(), cependant il est possible de passer des arguments permettant de peaufiner les paramètres d’Undot.</li>
<li> Vous pouvez appeler plusieurs fonctions dans une même expression, il vous suffit de mettre la fonction suivante à la ligne.</li>
<p>exemple:</p>
<p><code><br />
Mpeg2Source("C:\mon_path\projet.d2v")<br />
LanczosResize(592,320)</code></p>
<li> Vous pouvez inscrire autant de commentaires que vous le désirez dans votre script. Pour se faire, il vous suffit de précéder vos commentaires par un dièse (#). Ceci est très pratique si vous faites des archives de vos scripts, afin de vous souvenir du pourquoi et du comment.</li>
<p><code><br />
#ma source<br />
Mpeg2Source("C:\mon_path\projet.d2v")<br />
#un crop pour aspect ratio 1:85<br />
Crop(16,16,-16,-16)<br />
#j'applique toujours un préfiltre<br />
Undot()</code></p>
<li> Les filtres ne peuvent pas être exprimés dans n'importe quel ordre, pour certains l'ordre est obligatoire pour d'autres il est tout simplement conseillé pour une meilleure optimisation de la compression vidéo et du rendu visuel.<br />
Par exemple, selon que vous employez un filtre avant ou après le resize de la vidéo, celui-ci n'aura pas la même incidence à variables égales puisqu’avant le resize il aura plus de pixels à traiter qu'après (images réduites après le resize). Vous devez toujours commencer par le filtre d'importation de la source, puis le cropping (réduction de l’espace vidéo), puis les filtres couleur, les filtres de redimensionnement, enfin les filtres qui modifieront la vidéo de façon plus précise.</li>
<li> Il est possible de déclarer des variables afin de rendre plus lisible le script AVS. La syntaxe est simple : maVariable = valeur. Nous pourrons par la suite utiliser la variable par son nom, partout dans la suite du script.</li>
<li> Enfin, il est important de noter des éléments dans AviSynth que l’on appelle des clips. Un clip est la représentation d’une source vidéo et est représenté par une variable. On pourra alors appliquer les fonctions que l’on désire sur un clip spécifique. Avoir plusieurs clips nous permettra à la fois de faire plusieurs traitements sur plusieurs fichiers avec un même script AVS mais aussi, et surtout de faire du collage vidéo. Nous pourrons ainsi avoir deux sources vidéo, leur appliquer des filtres, puis les coller afin de former une unique source qui sera passée directement à l’encodeur de façon transparente.</li>
</ul>
<p>Exemple de script utilisant des clips :</p>
<p><code><br />
clipIntro = AviSource("C:\mon_path\mon_intro.avi")<br />
clipIntro = Undot()<br />
clipIntro = SimpleResize (800,600)<br />
clipMain = Mpeg2Source("C:\fichier.d2v")<br />
clipMain = SimpleResize (800,600)<br />
clipFinal = clipIntro + clipMain<br />
return clipFinal</code></p>
<p>Nous noterons ici deux éléments importants :</p>
<ul>
<li>Le collage de nos deux clips se fait grâce à l’opérateur + entre les deux clips</li>
<li>Nous sommes obligés de spécifier quel va être le clip de sortie du script avec le mot clé return, puisque plusieurs clips étant définis, le script ne peut savoir de lui-même quel va être le clip final à utiliser.</li>
</ul>
<p>Enfin, afin de tester le rendu de votre script AVS, vous pouvez directement le lire dans un player vidéo supportant DirectShow. Sur les dernières versions d’AviSynth, Media Player Classic peut être installé, car c’est le player le plus adapté à la lecture des scripts AVS.</p>
<h3>Les Filtres</h3>
<h4><em>Source</em></h4>
<p>C'est le premier type filtre à utiliser puisque c’est celui qui importe la source vidéo ou audio dans votre script</p>
<p><strong>Pour les sources avec conteneur de type AVI</strong></p>
<p><code>AviSource(Source, option)</code></p>
<p><strong>Source MPEG2/LST/VOB/D2V</strong></p>
<p><code>Mpeg2Source(Source, idct = CPUType )</code>, avec "Source" et "CPUtype" définis précédemment</p>
<p><strong>Source autre RMVB/ASF/MOV etc</strong></p>
<p><code>DirectShowSource("Path", fps_source)</code></p>
<p>Ce filtre source permet de charger n’importe quelle source vidéo en se basant sur les codecs de FFDShow. Le framerate de la vidéo n’est alors pas connu, il faut donc le spécifier en deuxième argument afin que la source soit correctement chargée.</p>
<p><strong>Source Image (BMP/JPEG/Etc.)</strong></p>
<p><code>ImageSource("file%d.jpg", 1, 100, 25) # charge toutes les images de file1.jpg à file100.jpg pour former une vidéo cadencé à 25fps</code></p>
<p><code>ImageSource("file%03d.jpg", 1, 100, 24) # charge toutes les images de file001.jpg à file100.jpg pour former une vidéo cadencé à 24fps</code></p>
<h4><em>Framerate</em></h4>
<p>Pour changer le FPS de la source :</p>
<p><code>ChangeFPS(fps)</code> exemple ChangeFPS(25)</p>
<h4><em>Crop</em></h4>
<p>Pour découper la vidéo (suppression de bandes noires par exemple)</p>
<p><code><br />
Top = x<br />
Bottom = y<br />
Left = z<br />
Right = w<br />
Crop( [clip], Left, Top, -Right, -Bottom ) # x,y,z,w sont les valeurs en pixel de découpage<br />
</code></p>
<h4><em>Trim</em></h4>
<p>Pour délimiter la durée de la source (peut servir pour faire du découpage)</p>
<p><code>Trim( [clip], Start, End )</code> Start et End seront définis précédemment</p>
<h4><em>Undot</em></h4>
<p>Ce filtre permet de supprimer les pixels isolés sur la vidéo, indispensable, ce filtre supprime les imperfections de la vidéo.</p>
<p><code>Undot() ou Undot( clip )</code></p>
<h4><em>Resize</em></h4>
<p>Pour modifier la résolution de la vidéo:</p>
<p><code>SimpleResize( DimX, DimY ) </code> - Modification de la résolution brute, sans analyse, filtre basique qui offre peut de possibilités</p>
<p><code>BilinearResize( DimX, DimY ) </code> - C'est surement le filtre qui offre le plus de compressibilité, il est rapide par contre pas très précis. A ne surtout pas utiliser avec un denoiser sans quoi votre image risquerait de manquer crucialement de détails. Avec ce filtre pas de variables d'ajustement du sharpen/soften</p>
<p><code>LanczosResize( DimX, DimY )</code> - Analyse complète, filtre Sharpness, à utiliser pour de la qualité avec codec puissant et bitrate élevé (&amp;gt;900)</p>
<p>Bicubic possède les mêmes capacités que Lanczos mais avec possibilité de choisir les options et les algorithmes qui vont permettre le redimensionnement de la vidéo.</p>
<p><code>BicubicResize( clip, DimX, DimY , 0 , 0.75)</code> [Sharp]</p>
<p><code>BicubicResize( clip, DimX, DimY , 0.333 , 0.333)</code> [Soft]</p>
<p><code>BicubicResize( clip, DimX, DimY , 0 , 0.5) <!-- code-->[Neutre]</code></p>
<p><code>Hybridfupp( clip, DimX, DimY , preset="") </code> - Pour moi le meilleur filtre de Resize, se marie très bien avec les autres filtres de retouche vidéo. Configurable à la main ou en utilisant des presets qui vont contenir des valeurs adaptées pour un type de source donné. Les presets peuvent être:</p>
<p><code>"very low" "low" "medium" "high" "very high" "anime"</code></p>
<h4><em>Denoiser</em></h4>
<p>Les filtres qui permettront de supprimer le "bruit" sur la vidéo et de rendre la vidéo plus "belle" dans le sens où celle-ci aura un aspect plus lisse, avec des traits plus fins.</p>
<p>• Le Deen</p>
<p>Le plus utilisé avec le Convolution3D. Il s'agit là d'un ensemble optimisé de denoisers. Le Deen fonctionne en espace couleur YV12 et nécessite un CPU compatible iSSE. Il possède 4 méthodes de "débruitages" ("c3d", "a3d", "a2d", "m2d"), "c3d" par défaut est conseillé, car vous obtiendrez une matrice de poids (équivalent à du Convolution3D avec matrice 0) ; en appliquant un "2d" vous n'avez plus qu'un filtre spatial (déconseillé) et non plus spatio-temporel. Voici donc comment s'écrit la syntaxe par défaut de ce filtre:</p>
<p><code>Deen("c3d",0,10,12,3)     ou encore      Deen()</code></p>
<ul>
<li>1ere variable = nom de la chaîne de caractères ⇒ "c3d" conseillé pour faire une convolution spatio-temporelle</li>
<li>2e variable = mode interne ⇒ 0 pour la matrice par défaut, 1 pour une matrice plus douce</li>
<li>3e variable = Ythreshold ⇒ seuil interne de Luma (clarté de lumière) par défaut 10</li>
<li>4e variable = UVthreshold ⇒ seuil interne de chrominance (composant de la couleur) par défaut 12</li>
<li>5e variable = float ti ⇒ influence temporelle, par défaut 3</li>
</ul>
<p>À utiliser surtout avec un encodage XviD/DivX</p>
<p>• Le Convolution3D</p>
<p>Il s'agit surement de l'un des plus utilisés, nécessite un CPU compatible SSE, ne peut donc pas fonctionner avec des P2 ou K6-2, fonctionne uniquement en espace couleur YV12. Il peut s'écrire de bien des manières en fonction de votre source .Attention ce filtre est très efficace, mais lent, car engendre beaucoup de calculs. Il y a deux syntaxes possibles, la première est de loin la plus simple et c'est celle que je vous conseille d'utiliser, c'est-à-dire que vous avez là une syntaxe correspondant à un filtre préréglé (preset).</p>
<p>Toutefois s'il vous prenez l'envie de vouloir tester ce filtre, il vaut mieux que vous sachiez tout de même à quoi correspondent toutes ces variables incluent dans la 2e syntaxe:</p>
<ul>
<li>1ere variable = Matrice, c'est à dire gestion de la matrice, pour un maximum de détail conseillé 0, vous pouvez aller jusqu'à 3, mais je vous le déconseille puisque la vidéo serait de plus en plus floue.</li>
<li>2e variable = Ythreshold, le seuil (threshold) de filtration spatiale de la luminance (clarté), rester entre 2 et 10</li>
<li>3e variable = Cthresthold, fixe le seuil de la filtration spatiale de la chrominance (composants de la couleur), rester entre 2 et 16</li>
<li>4es variable = TYthreshold, fixe le seuil de la filtration temporelle de la luminance, rester entre 2 et 10</li>
<li>5e variable= TCthresthold, fixe le seuil de la filtration temporelle de la chrominance, rester entre 2 et 10</li>
<li>6e variable = l'influence temporelle. Plus la valeur est haute plus la compression est élevée. Entre 2 et 3, valeur flottante (pas de virgule mais un point)</li>
<li>7e variable = Debug, à désactiver avec la valeur 0.</li>
<li>Pour le temporel au-delà de 10 vous risquez de flouter considérablement votre vidéo. Vous pouvez augmenter la filtration spatiale de chrominance(3e argument) la limite se situe au moment où les bords deviennent moins précis.</li>
</ul>
<p><code>Convolution3D (preset="movieHQ")</code> ⇒ Film haute qualité comme la plupart des bons DVD, peut s'écrire également <code>Convolution3D(0, 3, 4, 3, 4, 2.8, 0)</code> si l’on passe les arguments à la main.</p>
<p><code>Convolution3dD(preset="movieLQ")</code> ⇒ Film de basse qualité, hé oui il y a parfois des DVD mal faits, ou des sources corrompues. Peut s'écrire également <code>Convolution3D (0, 6, 10, 6, 8, 2.8, 0)</code></p>
<p><code>Convolution3d (preset="animeHQ" )</code> ⇒ Anime haute qualité , pareil que pour un film, mais cette fois-ci il s'agit de dessin animé. Peut s'écrire également <code>Convolution3D (0, 6, 12, 6, 8, 2.8, 0)</code></p>
<p><code>Convolution3d (preset="animeLQ")</code> ⇒ Anime de basse qualité. Peut s'écrire également <code>Convolution3D (1, 8, 16, 8, 8, 2.8, 0)</code></p>
<p><code>Convolution3d (preset="vhsBQ")</code> ⇒ Capture VHS de mauvaise qualité. Peut s'écrire également <code>Convolution3D (0, 32, 128, 16, 64, 10, 0)</code></p>
<p><code>Convolution3d (preset="animeBQ")</code> ⇒ Animé de mauvaise qualité. Preset à utiliser pour les cas extrêmes comme les acquisitions VHS  de vidéos anciennes par exemple.</p>
<h4><em>Sharpen/soften: (affilé/floutant)</em></h4>
<p>•aSharp</p>
<p>À la base ce filtre est un "mask unsharp" très commun, il comporte une technique de seuil adaptatif pour éviter l'augmentation de bruit et il influe de manière à éviter une apparence trop importante de Blocks DCT (Discrete Cosine Transform est une méthode de compression de données vidéo numériques largement répandue qui atténue l'apparition des blocs dans l'image dans les fréquences, les amplitudes et couleurs), autrement dit qui lutte contre l'effet mosaïque d'une image.</p>
<p>Pour faire un "unsharp masking " simple :<br />
<code>asharp(2,0)</code></p>
<p>Pour essayer un "sharpenning adaptatif"<br />
<code>asharp(2,4)</code></p>
<p>Suggestion de l'auteur pour encodage d'anime :<br />
<code>asharp(2.5,4.5,0.25,hqbf=true)</code></p>
<p>•aWarpSharp</p>
<p>Pour CPU compatible iSSE.Il a été optimisé pour Atlhon XP, mais tous les CPU modernes pourront utiliser ce filtre à vitesse maximale. Il s'agit d'un authentique filtre de "warpsharping". Authentique signifie que l'algorithme utilisé diffère ,sur plusieurs points, par rapport à d'autres filtres "warpsharping".Le code y est entièrement optimisé iSSE avec une haute exactitude.Vous devez avoir un minimum de 550Mhz (CPU) pour utiliser Warpsharp avec une résolution de 640X480 et un débit de 25fps.La syntaxe par défaut s'écrit comme suit:</p>
<p><code>aWarpSharp("depth","blurlevel", "thresh", "cm")</code> ==&amp;gt; par défaut cela donne  <code> aWarpSharp(16.0,2,0.5,1)  ou encore aWarpsharp()</code></p>
<p>D'après l'auteur il n'y pas lieu d'utiliser de paramètres avancés, les paramètres par défaut étant optimum.</p>
<p>•UnFilter</p>
<p>Travaille en espace couleur YV12 &amp; YUY2 .Unfilter est un simple filtre soften/sharpen et il est raisonnablement rapide.Ce filtre peut être soften si vous appliquez des valeurs négatives ou sharpen si vous appliquez des valeurs positives, neutre si vous mettez 0 sur les 2 valeurs (aucun intérêt).Les valeurs soften vont donc de 0 à -100 et les valeurs sharpen de 0 à +100. Toutefois pour éviter une trop importante déformation de l'image je vous conseille de rester dans une fourchette de -5 à +5.Il exige toujours des largeurs de Pixel multiple de 2.Voici la syntaxe du filtre:</p>
<p><code>UnFilter(HSharp, VSharp)</code>, s'écrit par défaut <code>Unfilter(5,5)</code>. C'est-à-dire que là il "sharp".</p>
<h4><em>Sous-titre</em></h4>
<p><code>TextSub("path")</code></p>
<h4><em>Logo</em></h4>
<p><code>VobSub("path")</code></p>
<p>Pour incruster une image uniquement sur une certaine durée, il faudra jouer du Trim</p>
<h4><em>Limiter</em></h4>
<p>Permet de modifier les gammas (les couleurs) pour un meilleur rendu sur TV</p>
<p><code>Limiter() ou Limiter( clip )</code>, rend l'image un peu plus foncée sur PC, mais je la trouve plus nette.</p>
<h3>Conclusion</h3>
<p>Vous êtes maintenant armé pour pouvoir créer des scripts AviSynth pour vos encodeur préférés. Vous pourrez ainsi merger et mixer une multitude de fichiers de source en une seule fois, sans faire d'étapes de transformation intermédiaires et en optimisant complètement la qualité de rendu et la conservation de la vidéo source.</p>
<p>Un exemple de script un petit peu complet pourrait être :</p>
<p><code><br />
# Variables<br />
DimX = 1024<br />
DimY = 576<br />
CPUType = 7</code></p>
<p># on charge L'intro en AVI codec VBLE<br />
intro = AviSource("D:\Enco\intro-openVBLE.avi",false)<br />
# ajustement de son FPS<br />
intro = intro.ChangeFPS(25)</p>
<p># on charge le contenu principal issue d'un encodage MAC<br />
clip1 = DirectShowSource("Mycontent.mov",23.976)<br />
# on ne sélectionne que les frames utiles<br />
clip1 = clip1.Trim(10760,11967)<br />
clip1 = clip1.ChangeFPS(25)</p>
<p># on charge le logo animé sous forme de plusieurs JPG<br />
logo = ImageSource("title%d.jpg",1,26,25)<br />
logo = ConvertToYV12(logo)<br />
# on redimensionne pour être aligné sur les autres sources<br />
logo = hybridFupp(logo,DimX, DimY, preset="anime")</p>
<p># on charge le generique de fin, issue d'une source DVD<br />
clipfin = Mpeg2Source("generique.d2v", CPUType)<br />
clipfin = clipfin.Trim(163552,164772)<br />
clipfin = clipfin.ChangeFPS(25)</p>
<p># on colle toutes les sources<br />
final = intro + clip1 + logo + clipfin<br />
# filtre pour enlever le bruit<br />
final = final.Convolution3D (preset ="animeHQ")<br />
# redimensionnement<br />
final = hybridFupp(final,DimX, DimY, preset="anime")<br />
final = UnDot( final )<br />
# ajustements vidéo<br />
final = final.aWarpSharp()<br />
final = final.Unfilter(-50,-50)<br />
# ajout d'un sous-titre incrusté dans la vidéo<br />
final = final.textsub("Sous-titre_movie.ass")<br />
final = Limiter( final )</p>
<p># on définit la source finale<br />
Return final</p>
<p>Pour encore plus de filtres, n'hésitez pas à visiter le site officiel d'AviSynth: <a href="http://avisynth.org/warpenterprises/">http://avisynth.org/warpenterprises/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.mti.epita.fr/blogs/2010/02/21/avisynth-filtre-video-et-encodage-video/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>

<!-- Dynamic Page Served (once) in 1.955 seconds -->
<!-- Cached page generated by WP-Super-Cache on 2010-03-17 21:22:36 -->
<!-- Compression = gzip -->