La technique du Normal Mapping (ou Bump Mapping)

Intro :

Cette technique de rendu des textures sur des modèles 3D permet de simuler un relief mélangé par une texture.

En français on parle de « Placage de Relief ».

Explications :

Cette technique permet de générer un jeu de mélange entre la lumière et les ombres sur une surface classique sans avoir à y renseigner les normales en une multitude de points. En effet les normales sont modifiées (par un effet de variation) pour créer un effet de lumière semblable à du relief.

Ici 4 points peuvent suffire pour générer un effet de relief avancé sur une surface 2D.

La technique du Parallax Mapping

GPU

Intro :

Avant tout, que veux dire « parallax » ou parallaxe ? La parallaxe désigne le phénomène physique et dynamique à propos d’un objet qui visiblement change de forme à cause du point de vue de l’œil de l’observateur.

La technique du Parallax Mapping est une technique de déplacement de surface.
La surface traitée donne un résultat de profondeur et est similaire avec la technique utilisée dans le « bump mapping ».

Cela donne un résultat très joli. En effet, elle permet d’émuler le relief d’un objet à partir d’une texture.

Comme toutes les techniques de déplacement de surface, la technique du PM utilise une image texture spéciale pour effectuer le rendu.

Explications :

C’est une super fonctionnalité !

Il s’agit d’appliquer un décalage des coordonnées (offset) de la texture diffuse directement dans le pixel shader.

Ce décalage dépend de la direction et de la position de la caméra qui observe la scène.
La surface ainsi dessinée à l’écran doit évoluer correctement en respectant la position de la caméra.

La technique du PM utilise une image / texture de couleur noire et blanche.

La simulation s’opère dans l’espace des textures. On opère un décalage des coordonnées des textures avec le vecteur de vue de la caméra plus la valeur courante de la « height map » de texture utilisée.

Le Compute Shader avec DirectX 11 (DirectCompute)

GPU

Intro :

Pour faire simple, le compute shader de DirectX 11 permet d’effectuer des calculs directement par le processeur de la carte graphique (nommé GPU) alors qu’ils auraient pu être fait par le CPU (le processeur de la carte-mère du PC). Il est dénommé par un autre nom : le DirectCompute.

A noter que bien que leur sortie s’est faite avec DirectX 11, on peut utiliser les compute shader avec du matériel DirectX 10.

Explications :

Le compute shader permet le partage de la mémoire entre processus légers synchronisés à l’intérieure de la CG et de la mémoire de l’ordinateur. Il utilise le langage HLSL (High Level Shader Language) classique de DirectX.

En théorie on peut calculer n’importe quoi. Le compute shader fait office d’accès mémoire en entrée / sortie par les programmes exécutés par le processeur.

Maintenant et depuis l’ajout de cette fonctionnalité, avec DirectX on peut faire du calcul non graphique en utilisant la CG.


Voici un petit exemple d’initialisation d’un compute shader :

– Avec srcFile comme le nom du fichier .fx d’un compute shader.
– Avec defines comme structure de déclaration des constantes defines à l’intérieur de l’effet.

Quand le compute shader sera exécuté dans la mémoire de la carte graphique, il pourra tirer avantage d’un grand nombre d’unités d’exécution parallèles à l’intérieur du GPU.

Qu’est-ce qu’un « thread group » ?

Un thread group est un groupe d’unités d’exécution en parallèle qui est interprété et conçu par la CG comme un tableau en 3 dimensions dont chaque membre est un « thread ».

On utilise la méthode ID3D11DeviceContext::Dispatch pour envoyer un « thread group » au GPU. C’est-à-dire qu’on utilise cette méthode pour faire exécuter des commandes un compute shader.

En effet un compute shader peut être exécuté sur plusieurs unité d’exécution en parallèle, le tout formant un « thread group ». On identifie un thread (unité d’exécution parallèle) en particulier avec un numéro d’index assimilé par un vecteur en 3 dimensions (x, y, z).

Dans cette image illustrant un exemple, la taille des « threads groups » est de 5x5x2, soit 50 groupes d’unités d’exécution en parallèle (« thread »). Ici un thread en particulier est adressé par le triplet (4,1,1). A noter que chaque groupe de threads est fait de 16×16 = 256 unité ou threads d’exécution.

Single Thread

Chaque processus léger (« thread ») peut exécuter plusieurs élément de données à travers le compute shader. Et l’application C++ qui gère tous ces calculs peut définir le nombre de threads en exécution.


La principale capacité des compute shaders est le partage et l’accès de la mémoire par plusieurs threads en parallèle.

Le principe de base du calcul par le biais de ces shaders est l’envoi régulier d’une grille de threads. Les threads d’un même groupe s’exécute en parallèle, mais des threads de groupes différents le peuvent dans certaines conditions.

Les données accessibles par le compute shader peuvent être les Buffers et Textures de DirectX 11.


Les applications au compute shader peuvent être :

– Le traitement d’images
– La construction procédurale de modèles
– La physique et l’animation
– Le rendu
– L’intelligence artificielle
– Les effets de particules
– Les algorithmes de tri
– L’encodage vidéo
– Le calcul scientifique
– Des effets graphiques tels que : le depth of field, HDR bloom, le motion blur, etc…

Utilisation des std::array en C++11

arrays

Intro :

L’objet de la classe std::array permet de représenter en mémoire un tableau statique dont le nombre d’éléments est connue à la compilation et est fixé à l’avance.

Prérequis :

– Savoir lire du C++

Explications :

On peut l’initialiser d’emblée :

Voilà une déclaration supplémentaire :

Les données de ce type de tableau sont stockées de manière contigu en mémoire.

Résumé :

A l’opposé des tableaux classiques, les tableaux déclarés avec la classe std::array stocke aussi le nombre d’éléments du tableau en mémoire.

Utilisation de la librairie Zlib pour gérer des flux de compression

zlib3d-b1

Intro :

Il est très utile de pouvoir compresser des données en mémoire ou des fichiers sur disque ou mémoire de masse. Pour cela, on va utiliser la fameuse librairie C open-source nommée Zlib !

Prérequis :

– Savoir lire du C ou du C++

– Savoir configurer l’importation d’une librairie sous Visual C++

Explications :

Elle implémente l’algorithme de compression deflate et peut créer des fichiers au format gzip.
La bibliothèque est aussi multi-plateforme.

Résumé :

Nous avons présenté une classe C++ encapsulant les fonctions de compression de la librairie Zlib ; cette classe permet de compresser des fichiers ou des données en mémoire.

Références :

– http://www.zlib.net/manual.html

– http://www.zlib.net/zlib_how.html

– http://www.zlib.net/zlib_faq.html

Apprendre à utiliser TinyXML pour charger vos fichiers XML

tinyxml

Intro :

Parfois dans un programme ou un jeu vidéo, il est nécessaire de charger des données sous format XML. Par exemple pour un éditeur de scène / monde, on peut vouloir charger les positions des entités directement depuis un fichier Scene.xml par exemple.

Prérequis :

– Savoir lire du C++

– Savoir lire un fichier XML

– Savoir importer des fichiers sources dans Visual C++

Explications :

TinyXML est une toute petite librairie C++ permettant de charger et d’analyser les données stockées dans un fichier XML. Elle est sous la licence Zlib (cela signifie que vous pouvez l’utiliser pour n’importe quoi !)

D’abord il vous faut télécharger les sources de TinyXML. La dernière version à la date d’écriture de cet article est la version 2.

Deux choix s’offrent à vous : soit d’utiliser la version 1 ; soit d’utiliser la version 2.

Les avantages de choisir la 2ème : meilleur gestion de la mémoire ; lecture plus rapide du fichier XML ; pas d’utilisation de la STL.

TinyXML charge complètement un fichier XML avec la méthode LoadFile()… Il vous reste ensuite le soin d’analyser votre fichier XML en fonction de son contenu en terme de nœuds.

On précise que XML est l’abréviation de « eXtensible Markup Language ». XML est un format pour stocker des données, pas un langage de programmation !
Celles-ci sont écrites entre des balises ou sous forme d’attributs, et l’ensemble est écrit sous forme d’un arbre.

Voici la structure d’un fichier XML :
 

Il vous faut importer dans votre projet Visual C++ la librairie directement par l’intermédiaire de ces fichiers :

– tinystr.cpp
– tinyxmlerror.cpp
– tinystr.h
– tinyxml.h
– tinyxml.cpp
– tinyxmlparser.cpp

 

Dans votre fichier source .cpp utilisant TinyXML, il vous faudra écrire #include « tinyxml.h » en tant que fichier d’en-tête.

Vous pouvez définir le define #define TIXML_USE_STL pour activer l’utilisation de la STL dans TinyXml.

Sachez que TinyXML reconnaît automatiquement l’encodage utilisé par le fichier à charger (il n’est pas nécessaire de renseigner l’attribut « encoding »).

Commençons l’analyse d’un fichier quelconque :

 

Le fichier « doc » contient toutes les données d’analyse du fichier XML chargé.

 

La méthode FirstChildElement() renvoie un pointeur vers un objet TinyXmlElement qui représente le premier nœud du fichier XML en question. FirstChildElement() prend un paramètre une chaîne de caractères représentant le nom du nœud en question.

Une boucle permet d’afficher tout les noms des éléments du fichier :

 

Le principe est le suivant : on parcourt chaque nœud en extrayant de chaque nœud enfant les attributs qui nous intéressent !

 

La variable attr représente la valeur de l’attribut en question. Si l’attribut ne comporte pas le nom spécifié. La méthode Attribute(…) renvoie nullptr.

On peut tester si le contenu d’un nœud est du texte avec la méthode elem->ToText(). Elle renvoie nullptr s’il n’y a pas de texte.

Il peut être utile d’utiliser une structure de données spécifique customisée afin de stocker les données lues depuis le fichier XML. Mais cela reste facultatif !

On fini l’analyse avec l’appel de Clear() : doc.Clear();

Pour faciliter le parcours des nœuds, on peut utiliser ce qu’on appelle des handles.
Exemple :

 

La méthode QueryIntAttribute(…) permet d’obtenir la valeur d’un attribut sous forme de integer

Voici la liste des classes de TinyXML formatée par Doxygen : http://www.grinninglizard.com/tinyxmldocs/annotated.html

Résumé :

Simple et efficace, la petite librairie TinyXML facilitera vos chargement de données sous format XML.

Références :

– http://www.dinomage.com/2012/01/tutorial-using-tinyxml-part-1/

Comment calculer la matrice de rotation d’un Billboard

tag

Intro :

Qu’est-ce un billboard ? Un billboard est un objet 3D (en général d’apparence 2D) qui fait toujours face à la caméra.

Prérequis :

– Savoir ce qu’est une matrice

– Savoir lire une matrice

– Savoir en quoi consiste la matrice de vue

Explications :

Rappelez vous que la matrice de vue (celle de la caméra) est définie ainsi :

viewmatrix

En effet, cette matrice est construite à partir de trois vecteurs :

uprightlook

Avec une origine (ainsi nommée « Caméra ») représentant la position de celle-ci par rapport au repère commun à tous les nœuds de la scène, cette dernière concerne la matrice World (matrice de monde)

Une fois construite, la matrice de vue est une matrice qui doit être mise à jour constamment dans la boucle de rendu.

Décomposition de la matrice View :

\(\vec{LookAt}_x = \textbf{View}_{02} \)
\(\vec{LookAt}_y = \textbf{View}_{12} \)
\(\vec{LookAt}_y = \textbf{View}_{22} \)

\(\vec{Right}_x = \textbf{View}_{00} \)
\(\vec{Right}_y = \textbf{View}_{10} \)
\(\vec{Right}_y = \textbf{View}_{20} \)

\(\vec{Up}_x = \textbf{View}_{01} \)
\(\vec{Up}_y = \textbf{View}_{11} \)
\(\vec{Up}_y = \textbf{View}_{21} \)

On normalise ensuite ces trois derniers vecteurs :

\({\vec{LookAt}}_{norm}=\frac{{\vec{LookAt}}}{\|{\vec{LookAt}}\|} \)
\({\vec{Right}}_{norm}=\frac{{\vec{Right}}}{\|{\vec{Right}}\|} \)
\({\vec{Up}}_{norm}=\frac{{\vec{Up}}}{\|{\vec{Up}}\|} \)

A noter que l’on peut retrouver un vecteur connaissant les deux autres. Par exemple, l’on veut retrouver le vecteur \({\vec{Up}} \) connaissant \({\vec{Right}} \) et \({\vec{LookAt}} \). On procède ainsi  :

\({\vec{Up}} = {\vec{LookAt}}\times{\vec{Right}} \)

Maintenant pour construire notre Billboard il nous faudra créer une matrice de rotation \(\textbf{R} \). C’est avec cette matrice de rotation que seront multipliés toutes les vertices du Billboard de façon à ce qu’ils soient toujours en face de la caméra !

On calcule la matrice \(\textbf{R} \) de la façon suivante :

\(\textbf{R}_{0*} = {\vec{Right}} \)
\(\textbf{R}_{1*} = {\vec{Up}} \)
\(\textbf{R}_{2*} = {\vec{LookAt}} \)

C’est-à-dire de manière plus détaillée :

\(\textbf{R}_{01} = \vec{Right_x} \)
\(\textbf{R}_{02} = \vec{Right_y} \)
\(\textbf{R}_{03} = \vec{Right_z} \)

\(\textbf{R}_{11} = \vec{Up_x} \)
\(\textbf{R}_{12} = \vec{Up_y} \)
\(\textbf{R}_{13} = \vec{Up_z} \)

\(\textbf{R}_{21} = \vec{LookAt_x} \)
\(\textbf{R}_{22} = \vec{LookAt_y} \)
\(\textbf{R}_{23} = \vec{LookAt_z} \)

Voici le Vertex Shader qui applique le calcul en question :

Voici un Billboard affiché qui représente une quête disponible :

billboard

Résumé :

Nous avons expliqué comment créer un Billboard en construisant une matrice de rotation spéciale qui tourne et qui fait toujours face à la caméra.

Références :

– Des sujets issus de quelques forums Internet comme celui de www.gamedev.net

La bibliothèque standard du C++ (la STL du C++11)

cce_clean

Intro :

Dans un programme C++, il est nécessaire d’utiliser certaines structures de données comme les tableaux, les liste chaînées, les arbres, etc…

La librairie standard du C++ offre trois types d’objets prêts à être utilisés : les conténaires, les algorithmes et les itérateurs.

En l’occurence la STL est une bibliothèque de classes et de fonctions standardisées selon la norme en vigueur du C++.

Elle fournie des outils pour faciliter la programmation de vos programmes :

– pour les chaînes de caractères
– pour la gestion des flux (fichiers, entrée et sortie standard)
– des conteneurs qui facilitent la manipulation de certains objets
– une panoplie d’algorithmes de tri

Prérequis :

– Savoir lire du C++

– Savoir quelques rudiments à propos des structures de données

Explications :

On peut utiliser les fichiers d’en-tête du langage C en C++. Ils sont inclus sous un nom différent, ils sont obtenus en retirant le suffixe ‘.h’ et en ajoutant un ‘c’ au début. Par exemple l’header devient .

Voici la liste des principaux objets les plus utilisés de la STL :

std::array ; std::dequeue ; std::list ; std::map ; std::queue ; std::set ; std::vector

std::mutex ; std::thread ; std::string ; std::exception ; std::function ; std::tuple

Dans cette catégorie d’articles, nous allons étudier et expliquer en détails à quoi servent toutes ces entités / objets.

Résumé :

La STL présente et fournie beaucoup d’objets facilitant votre programme tout en embellissant votre code.

Références :

– http://www.cplusplus.com/reference/

– https://fr.wikipedia.org/wiki/Biblioth%C3%A8que_standard_du_C%2B%2B

Une classe SceneNode pour représenter vos objets et entités dans la scène

graphe

Intro :

Dans tout moteur 3D il est représenté un objet SceneNode (noeud de scène).
Cet objet sert à identifier une entité sur la scène avec les composantes suivantes : position, rotation, et mise à l’échelle.

Prérequis :

– Savoir initialiser DirectX 10.1

– Savoir qu’il existe une autre classe liée : SceneManager

Explications :

Voici le fichier SceneNode.h :

 

Voici le fichier SceneNode.cpp :

 

Résumé :

Nous avons présenté une classe pour gérer les positions, rotations et d’agrandissement de vos entités.

Références :

– Code source d’Irrlicht 3D

Ajouter un fichier ressource Win32 dans votre exécutable

file

Intro :

Dans un exécutable Windows, on peut stocker plusieurs fichiers. Ces fichiers en question s’appellent des « ressources ».

Prérequis :

– Savoir lire du C++

– Savoir se servir de Visual Studio C++

Explications :

Le fichier à intégrer peut-être de n’importe quel format !

On déclare ainsi dans le fichier de déclaration de ressource, la ressource en question, avec le patron de schéma suivant :

Ce contenu doit être mis dans un fichier ressource.h

Le nom du fichier « filename » spécifie le nom d’un fichier contenant des données binaires de la ressource. Le contenu du fichier est intégré dans la ressource spécifiée. A noter que les données doivent être proprement alignées pour récupération sur une autre architecture.

Les données peuvent être définies directement entre les accolades de la manière suivante :


Paramètres :

nameID : un unique nom ou une valeur de 16 bits en tout (unsigned integer) qui identifie la ressource

typeID : un unique nom (chaîne de caractères) ou un entier de 16 bits (unsigned integer) qui identifie le type de la ressource. Si un nombre est spécifié, il doit être supérieur à 255, les autres nombres sont réservés

filename : nom (chaîne de caractères) du fichier qui contient les données de la ressource. Ce nom doit correspondre à un fichier valide et existant, le nom du fichier doit être un chemin complet s’il n’est pas dans le répertoire courant

raw-data : données brutes consistant en plusieurs entiers ou chaînes de caractères

 

Résumé :

Nous avons présentée une méthode permettant d’intégrer des fichiers au sein de votre application C++. Il est aisé de récupérer leur contenu avec la fonction présentée ci-dessus.

Références :

– http://stackoverflow.com/questions/2933295/embed-text-file-in-a-resource-in-a-native-windows-application

– https://msdn.microsoft.com/en-us/library/aa381054(VS.85).aspx

Utilisez Doxygen pour documenter vos programme C++ en HTML

Doxygen_logo

Intro :

La documentation d’un programme est une étape fondamentale dans sa compréhension.

Le programme Doxygen permet la générer automatiquement sous couvert d’alimenter le programme en commentaires de code !

Prérequis :

Explications :

Voici les tags à utiliser dans vos programmes en tant que commentaires :

\struct pour documenter une structure C.
\union pour documenter une union C.
\enum pour documenter un type énuméré.
\fn pour documenter une fonction.
\var pour documenter une variable / un typedef / un énuméré.
\def pour documenter un #define.
\typedef pour documenter la définition d’un type.
\file pour documenter un fichier.
\namespace pour documenter un namespace.
\package pour documenter un package Java.
\interface pour documenter une interface IDL.
\brief pour donner une description courte.
\class pour documenter une classe.
\param pour documenter un paramètre de fonction/méthode.
\warning pour attirer l’attention.
\author pour donner le nom de l’auteur.
\return pour documenter les valeurs de retour d’une méthode/fonction.
\see pour renvoyer le lecteur vers quelque chose (une fonction, une classe, un fichier…).
\throws pour documenter les exceptions possiblement levées.
\version pour donner le numéro de version.
\since pour faire une note de version (ex : disponible depuis…).
\exception pour documenter une exception.
\deprecated pour spécifier qu’une fonction/méthode/variable… n’est plus utilisée.
\li pour faire une puce.
\todo pour indiquer une opération restant « à faire ».
\fixme pour indiquer un code défectueux, « à réparer ».

Résumé :

Nous avons présenté le programme Doxygen qui vous permettra de documenter à la volée tout votre code !

Références :

– https://fr.wikipedia.org/wiki/Doxygen

– http://franckh.developpez.com/tutoriels/outils/doxygen/

– http://axiomcafe.fr/tutoriel-documenter-un-code-avec-doxygen

Charger vos fichiers shaders .fx en tant que ressources d’exécutable

shader

Intro :

Il est méconnu que l’on puisse stocker des fichiers à l’intérieur d’un exécutable Win32. Ces fichiers, en l’occurrence, sont appelés ressources.

Prérequis :

– Savoir lire du C++

– Savoir utiliser la classe ShaderTechnique

– Comprendre comment intégrer une ressource à un exécutable

Explications :

Pour cela il faut utiliser la fonction DirectX 10.1 D3DX10CreateEffectFromResource(…)

Résumé :

Références :

Convertissez rapidement vos chaînes de caractères avec swscanf

ascii

Intro :

Parfois dans un programme on veut retranscrire rapidement un morceau de chaîne de caractères (en entrée) vers un autre type (en arrivée) que l’on souhaite.

Prérequis :

– Savoir lire du C++

– Être curieux !

Explications :

Pour se faire, on utilisera la fonction définie dans l’en-tête C++ nommée swscanf. Cette fonction lit les données d’une chaîne de caractère étendue et l’analyse selon un format spécifié. Le résultat est stocké dans un endroit spécifié dans les paramètres additionnels.

Le format de cette fonction est le suivant :


Paramètres :

– ws : une chaîne de caractère étendue / large (sur 32 bits) que la fonction se sert pour recevoir les données à traiter.

– format : contient une chaîne de caractères spécifiant le schéma / patron de la chaîne à analyser ; le format spécifié suit le même schéma que la fonction scanf.

– … : il s’agit des paramètres additionnels qui vont servir à stocker les valeurs sortantes.

Valeur de retour :

– La valeur de retour 0 indique qu’aucun champ n’a été assigné
– Retourne le nombre de champs qui sont correctement convertis et assignés

Exemple :


Affiche
: Clément -> 28.

Résumé :

Nous avons présenté une méthode pour convertir une chaîne formatée en entrée.

Références :

– http://www.cplusplus.com/reference/cwchar/swscanf/

– https://msdn.microsoft.com/fr-fr/library/zkx076cy.aspx

Les exceptions

exception

Intro :

Les exceptions, en C++, sont un moyen de gérer les erreurs dans les programmes.

Prérequis :

– Savoir lire du C++

Explications :

Pour expliquer rapidement, une exception est une situation donnée dans laquelle un programme, qui dans une circonstance particulière, lance une erreur.

Chaque exception lancée dans le programme doit être traitée, sinon le programme se termine et génère une erreur fatale.

L’apparition d’une exception interrompt l’exécution normale du programme et provoque sa reprise dans le gestionnaire d’exception le plus proche.

Elles sont déclenchées grâce à l’utilisation du mot-clé throw.

Il est conseillé de dériver chaque exception par celle std::exception  (en tête ).

Cette classe dispose d’une fonction membre what() qui renvoie une description de l’exception.

On rattrape les exception par référence, on les envoie par valeur.

Exemple d’exception :

Il existe une fonction qui permet de personnaliser la fonction d’appel lors d’une exception non gérée ou traitée : set_terminate(…)

A noter qu’on peut coupler le concept du RAII avec les exceptions (voir l’article)

Résumé :

Les exceptions offre un moyen très rapide et élégant de gérer les erreurs dans les programmes.

Références :

– http://guillaume.belz.free.fr/doku.php?id=pourquoi_le_raii_est_fondamental_en_c

– http://cpp.developpez.com/faq/cpp/?page=Utilisation-des-exceptions#Qu-est-ce-qu-une-exception

Une eau semi réaliste de type I

water I

Intro :

Dans un jeu vidéo, on a souvent besoin de représenter une eau réaliste par un effet de shader spécifique.

Cet article représente le premier essai d’une eau réaliste (type I).

Explications :

Résumé :

Références :

Une classe TextureScreenQuad pour afficher vos effets shaders de Post-Traitement

fig-1-war-and-peace

Intro :

Dans un jeu, nous avons besoin d’afficher une texture / image qui prend la place de tout l’écran. Cette image peut être modifiée pour appliquer un rendu de post-effet avec un fichier shader .fx.

Explications :

Nous nous servons d’un tampon de vertices formant un carré ou d’un quad.

Voici le fichier TextureScreenQuad.h :

 

Voici le fichier TextureScreenQuad.cpp :


Résumé :

Nous avons présenté une façon d’utiliser un Quad de de post-traitement afin de modifier les couleurs de rendu du front buffer.

Références :

– Stackoverflow.com

Une classe RenderTarget pour afficher un tampon d’image de rendu

rtt

Intro :

Nous avons parfois besoin de stocker le rendu 3D dans une texture que l’on pourra utiliser n’importe tout dans le programme !

Explications :

Voici le fichier RenderToTexture.h :

 

Voici le fichier RenderToTexture.cpp :

 

Comment l’utiliser ?

 

Résumé :

Nous avons présenter la façon la plus optimale possible d’utiliser une RenderTarget !

Références :

L’anticrénelage FXAA – Shader de Post-Traitement

image.png

Intro:

Une image numérique est composée de pixels. Lorsqu’elle est redimensionnée, le bord des formes ayant un angle particulier prend la forme d’escalier : c’est le crénelage, ou aliasing.

Explication :

Voici une technique très efficace et très performante en ressource système afin d’effectuer du rendu anti-crénelage. Elle utilise une render target et un Quad de post-traitement.

Voici le fichier ShaderTechique_Declarations.h :

 

Voici le fichier ShaderTechnique_FXAA.cpp :

 

Voici les bouts de code pour initialiser le shader FXAA :

 

Voici le fichier shader .fx :

Résumé :

Nous avons présenté une technique FXAA par un fichier shader .fx afin d’effectuer le rendu d’anti-crénélage.

Références :

–  https://fr.wikipedia.org/wiki/Fast_approximate_anti-aliasing

– http://horde3d.org/wiki/index.php5?title=Shading_Technique_-_FXAA

Une classe DelayedTimerManager pour gérer les délais de temporisation

unnamed

Intro :

Parfois nous avons besoin, dans le code, d’appeler des fonctions / méthodes à un certain intervalle de temps !

Prérequis :

– Savoir lire du C++

Explications :

Voici le fichier DelayedTimerManager.h :

 

Voici le contenu du fichier DelayedTimerManager.cpp :

 

Résumé :

Nous avons présenter le code pour gérer un système de temporisation.

Une classe GUIDraggableWidget pour permettre de déplacer une GUIWidget

lnh5ycp0amwjyttfhg4x

Intro :

Parfois nous avons besoin qu’une GUIWidget puisse être déplaçable à volonté tout en restant appuyé dessus la souris.

Prérequis :

– Avoir compris la classe GUIWidget

Contenu :

Voici le contenu GUIDraggableWidget.h :

 

Voici le fichier GUIDraggableWidget.cpp :

 

Résumé :

Nous avons décrit une classe qui représente un moyen d’afficher une GUIWidget déplaçable.