Astuces C++

Astuce n°3: Optimisation: Pour optimiser votre code C/C++ demander à votre compilateur d'utiliser l'entièreté du jeu d'instruction disponible pour votre processeur, pour faire ça dans gcc, utiliser l'option -march=native , gcc se chargera de détecter automatiquement votre type de processeur et optimiser le binaire. Attention ! Le binaire créé ne fonctionnera que sur votre ordinateur et ne pourra donc pas être partagé sauf sur d'autres ordinateurs possédant le même processeur. Très utile en cas de compilation système.

Astuces C++

Astuce n°2: Optimisation: Pour accélérer la compilation, penser à utiliser l'option -pipe dans gcc pour que le compilateur ne génère pas de fichier temporaire sur le disque mais les écrivent dans la mémoire vive.
Déconseillé sur des machines possédant peu de mémoire vive ! Surtout pour de la compilation système ;)

Astuces C++

Astuce n°1: Optimisation: Pour optimiser votre code C/C++ n'oubliez pas d'ajouter un niveau d'optimisation dans les flags du compilateurs.
Pour g++ 4.7:
-O1: permet une faible optimisation sans ajout d’instruction processeur.
-O2: améliore l'exécution du programme et ajoute des instructions, la taille de l'exécutable augmente faiblement, option la plus conseillé.
-O3: optimise fortement, la taille augmente beaucoup (jusqu’à doubler dans le cas d'utilisation de lib externe comme Qt), augmente également le nombre d'erreurs possibles et peut dans certains cas être moins performants que -O2.
-O4 et supérieur: n'existe pas, il s'agit d'un mythe !
Privilégier donc -O2

Rendu raytracing


Icone Gecko


Carte graphique NVidia



Logo Blender



















Principe du raytracing



















































Rendu smallpt

Un moteur de rendu raytracing en 100 lignes de codes ! Tous ce qu'il faut savoir sur le raytracing

Bonjour à tous, suite à plusieurs découvertes et recherches fait récemment je souhaiterai partager avec vous ce que j'ai appris sur les moteurs de rendu de type raytracing, parce-que oui c'est de cela que nous allons parler aujourd'hui, de programmation et de graphisme, c'est pourquoi je préfère avertir le lecteur néophyte que ce qui va suivre peut s'avérer incompréhensible si vous n'avez jamais utilisé blender, ou programmé, cela dit rien ne vous empêche de lire l'article et de faire des recherches après pour le comprendre :D

Je vais donc dans un premier temps vous parler des moteurs de rendu de type raytracing, puis ensuite d'une découverte qui m'a impressionné et qui vous bluffera aussi je l'espère !
Alors par ou commencer ? ^^ et bien je dirai que la base est si vous de définir ce qu'est un moteur de rendu, si vous utiliser blender cette notion n'a pour vous pas de secret et encore que... Le moteur de rendu et le composant d'un logiciel, voir parfois un logiciel, qui permet de synthétiser un ensemble de données en une image (ou dans certains cas particuliers d'autres multimédias), le but de cette synthèse étant d'obtenir un résultat plus "humain" des données. Ainsi le navigateur Mozilla Firefox possède un moteur de rendu permettant de transformer ceci:

<i>Je suis du texte HTML</i><strong> en gras</strong>

en cela:

Je suis du texte HTML en gras

Plus intéressant pour l’œil humain, mais on retrouve également des moteurs de rendu dans les jeux vidéos, où ils sont souvent appelés à tort moteur graphique, dans les système d'exploitation pour dessiner les polices de caractères, et enfin, et c'est ce qui nous intéresse ici: dans les logiciels de 3D pour passer de données 3D(positions de points dans l'espace, emplacement des textures, etc...) en bref un moteur de rendu est donc un terme générique pour désigner plein de choses, voilà petite précision technique même si il est vrai que dans une majorité de cas le terme moteur de rendu désigne le moteur de rendu d'un logiciel 3D c'est pourquoi je continuerai à utiliser le terme pendant l'article.

Et ces fameux moteurs de rendu il en existe plusieurs types qui fonctionnent différemment, ceux qui vont nous intéresser aujourd’hui sont ceux fonctionnant sur la méthode dite du raytracing, ces moteurs fonctionnent de rendu ont relativement le vent en poupe en ce moment, bien qu'existant depuis relativement longtemps, leur utilisation pour un usage particulier n'est possible que depuis peu de temps, ces moteurs requièrent en effet une quantité importante de ressource mémoire(utilisation de carte graphique dédié ou de processeur à haute cadence, la CG reste cependant préférable car elle permet le calcul parallèle) , en contrepartie les images produites sont souvent d'un réalisme saisissant(cf: vignette à droite).
Ainsi dans ce domaine s'affronte plusieurs moteurs, parfois devenus de vrai logiciel à part entière, citons notamment le renommé Cycles, pourtant très jeune (à peine un an le 21/7/2013), qui doit sa popularité à son intégration dans Blender, ce moteur propose aussi un mode de prévisualisation permettant un rendu en live apportant une grande flexibilité dans le travail, ce que ne propose pas forcément la concurrence, et concurrence il y à: Luxrender, Yafaray ou encore OctaneRender... L'autre immense avantage de cycles étant la possibilité d'utiliser le programme CUDA pour effectuer les calculs en parallèle sur une carte graphique de type NVidia, les performances sont alors multiplié par 6, voir 10 par rapport à une utilisation classique sur processeur.

Voilà pour les notions générales, ce que je savais de par ma fréquentation du blenderclan et mon utilisation au quotidien de blender, mais si l'on est plus curieux on pourrait se demander: mais concrètement, comment ça marche ? sur la base de quels algorithmes ?, qu'est-ce qui différencie le raytracing des autres techniques de rendu ? et d'ailleurs qu'elles sont ces autres techniques ? C'est à ces questions que je vais répondre:

Comment ça marche ?

En fait raytracing peut se traduire ne français par "lancer de rayon" ça devient tout de suite plus clair là, non ?, bon alors je vais tacher d'expliquer ce en quoi consiste cette technique, imaginer vous une scène 3D (cf: image de droite) avec sa caméra, et ses maillages, quand on lance un rendu en raytracing, pour chaque pixel de l'image, on simule un rayon qui va aller frapper le plan rouge et apportera donc l'information que ce pixel doit être rouge, il est possible de gérer le nombre de rebond de chaque rayon, (option bounces dans Cycles), dans la cas d'un simple plan avec une diffusion rouge le rayon se contentera de rebondir et d'aller frapper par exemple le sol blanc, où il sera soit absorbé soit il colorera le pixel en rouge ou rose, cette diffusion de la lumière s'appelle les caustiques, évidemment les opérations seront plus complexes dans le cas d'un material de type verre, ou il y aura réfraction et réflexion, notez que cette façon de calcul diffère beaucoup de ce qu'il se passe réellement dans la nature, en réalité ce sont les rayons de lumières qui viennent frapper votre caméra ou vos yeux et non l'inverse, cette méthode permet néanmoins d'obtenir un résultat bien plus réaliste. Dans blender on trouve 3 moteurs de rendus, l'archaïque InternalRender, qui fonctionne selon une méthode complètement différentes de cycles, Cycles, et un encore plus récent, qui n'en est pas vraiment un mais plus une surcouche de l'internal: FreestyleRender, qui permet de faire des rendus type cartoon en détectant les contours des mesh 3D, ces moteurs fonctionne donc sur des principes différents, des algorithmes différents, et on touche là un deuxième point encore plus intéressant:

Quels algorithmes sont utilisés ?

Et là sans hésité je vais vous donner le premier que j'ai retenu de toutes mes recherches: la méthode de Monte-Carlo, késako ? la page sur wikipédia décrit avec précision son fonctionnement, en fait il s'agit d'une théorie probabiliste permettant d'utiliser des donnés aléatoires pour connaître une valeur numérique précise, en l’occurrence le vecteur qui définit la direction que prendra le rayon à chaque rebond.
À cela vont s'ajouter des lois de physiques classiques, sur la réfraction par exemple (lois de Snell-Descartes --> cours de physique en 2nde ça vous rappelle quelquechose ?? :p ou le principe de Fermat).
Je ne détaillerai pas plus car ces principes nécessitent des notions avancés en optique et en mathématiques (utilisations des matrices et des vecteurs), notions que je ne maîtrisé pas, et je ne voudrais pas vous dire n'importe quoi ^^, je vous encourage cependant à faire des recherches sur ces domaines. Dans la suite de l'article nous examinerons une implémentation dans un langage de programmation de l'ensemble des principes et algorithmes vu ici.

Beaucoup d'avantages mais quels inconvénients ?

Et oui parce-que tous n'est pas si rose dans le merveilleux monde du raytracing: et on va ici s'intéresser au problème number one du raytracing: le temps de calcul qui peut s'avérer très long, de par la lenteur de l'algorithme, c'est pourquoi même si écrire un raytracer est relativement facile, l'optimiser est une autre affaire... Cependant les constructeurs d'hardware repoussent tous les jours les limites de nos machines, des processeurs cadencé à 3GHZ sont ainsi de plus ne plus courant et quand ils possèdent plusieurs cœurs c'est encore mieux !!! Les cartes graphiques sont elles aussi améliorées et optimisées pour le calcul parallèle, de ces besoins naissent même des technologies et des langages comme CUDA, du fabriquant NVidia, certains constructeurs de jeux vidéos promettent même des jeux vidéos qui seront prochainement basées sur du raytracing temps réel, imaginer le réalisme des scènes rendus avec blender Cycles dans un jeux vidéo ! Mais ce n'est pas pour tout de suite...

Mise en application: Écrire un raytracer !

Et là vous vous dites "Quoi ? mais il est fou ? on va pas recréer Cycles quand même ?" Et bah si ! en fait j'exagère un peu on ne vas pas étudier un moteur de l'acabit de cycles mais quand vous allez voir c'est intéressant quand même :D

De quoi s'agit t'il ?

Le moteur que nous allons étudier s'appelle smallpt, il à été développé par un certain Kevin Beason dans le cadre de ses études d'informatique à la prestigieuse "Florida State University", sa particularité est d'avoir été écrit en moins de 100 lignes de code C++ et de n 'utiliser aucune librairie externe ce qui le rend portable et léger, alors bien sur cette particularité obscurcit pas mal le code mais bon c'était pour l'exploit, vous pouvez télécharger ici un pack que j'ai créer qui comprend le code source et un exécutable pour Linux, si vous êtes sur Windows ou que vous souhaiter recompiler sur Linux, une version de gcc supérieur à 4.2 est nécessaire puis utiliser la ligne de compilation suivante:
g++ -O3 -o smallpt -fopenmp main.cpp
-O3 permet d'activer l'optimisation à son niveau maximum et croyez moi grâce à ça on divise par deux le temps de calcul, -fopenmp active la compilation avec gestion du multithreading, comme ça si vous avez deux cœurs ils seront utilisés. Et ensuite ça s'utilise en ligne de commande,
./smallpt 100
Et hop on attends un peu et une image est généré avec 100 passes, vous pouvez bien évidement ajusté le nombre de passes, et maintenant je ne peux que vous encourager à décortiquer le plus possible ce code, croyez moi ça vaut le coup, personnellement j'ai appris en le lisant comment faire le calcul en parallèle, comment créer une image avec la libc, optimiser avec les inlines et encore 2-3 trucs, ce petit programme est une véritable petite perle ! Évidemment on est loin d'un cycles, pas de gestion des rayons par paquets et les matériaux se limitent à des emit, des diff et des glass mais c'est déjà pas mal et cela peut constituer une base pour une implémentation facile dans un de vos programmes, n'hésiter pas à surfer sur le site du dev qui propose nombres d'exemples et conseils :D
Seul défaut notoire, il n'est pas standard puisque qu'il y à inclusion de bibliothèques C dans un programme en C++, et ça c'est un peu pas bien !!

Cette article touche à sa fin, j'espère donc vous en avoir appris le plus possible, laisser vos commentaires sur la chaîne youtube, je serai content d'avoir des retours ! Pour les références il y avait bien sur wikipédia, mais aussi cette discussion sur ubuntu-fr, le sujet du débat portait sur les performances Java/C++ rien à voir donc mais parmis les programmes présentés pour défendre C++ il y avait ce fameux raytracer ! Les autres sources sont inclus dans l'article :)
Enjoy ! :D
P.

Faire une présentation en HTML5/CSS3: C'est possible avec Impress.js

Dans le monde de la présentation de produits ou autre, on trouve le classique powerpoint ou pour les amoureux du libre le mode diapo de LibreOffice, mais si vous voulez faire une présentation original susceptible de marquer les esprits je vous suggère d'essayer le framework impress.js, il s'agit d'une technologie que j'ai découvert au RMLL 2013 et qui selon moi permet de casser avec les codes habituels de la présentation, mais je n'en dis pas plus, regardez la vidéo, croyez-moi ça vaut le coup et vous serez vite bluffé et séduit !

Je détaillerai aussi rapidement soit dans un article, soit dans une vidéo l'utilisation des deux autres frameworks cité dans la vidéo, reveal.js et deck.js qui proposent cependant moins de possibilités mais sont plus fluides sur des machines avec de faibles performance...
P.

Capture d'écran d'IDE

Bienvenue dans la section Programmation

Vous vous trouvez dans la toute nouvelle section de Libgraphic, ici on parle de programmation, je vais tenter dans cet article d'introduction de parler de la section, de la décrire, et d'en expliquer les motivations.

On est sur un site de graphisme, alors pourquoi parler de programmation ?
Et bien d'abord parce-que Libgraphic n'est plus un site dédié exclusivement au graphisme, dernièrement j'ai beaucoup élargi mes centres d'intérêts en informatique et que je n'ai pas envie de faire un autre site car ce ne serait pas maintenable, et je ne veux pas non plus supprimer Libgraphic, donc voilà le résultat, ce changement s'applique aussi à ma chaîne youtube qui verra désormais apparaître des tutoriaux sur d'autres domaines/logiciels que le graphisme/blender.
Que contiendra cette section ?
Vous trouverez ici différentes astuces concernant la programmation, des programmes que j'ai réalisé en toute modestie et que vous pourrez télécharger et étudier :D, mais aussi des articles plus larges concernant un avis sur tel ou tel langage, etc...
Quelle sera la fréquence de parution des articles ?
Je ne donne pas de fréquence précise mais le plus souvent possible sera mon bit but.

J'espère donc que vous trouverez ici ce que vous y cherchiez ;) Pour toutes suggestions et améliorations, contactez moi via ma chaîne Youtube.
Bye !!!
P.