Le blog qui cherche son titre \o/

Semaine 4, jour 1/2 : éclairage (reloaded)

Le système d'éclairage de base d'OpenGL est vraiment basique : il se base sur l'angle entre la normale du point et le rayon de lumière. Ca veut dire qu'il ne gère pas les ombres, on va donc remédier à ça.

Lire la suite Lire la suite

Lien permanent

Semaine 3, jour 2/3 : génération de textures, blending

Vu qu'on a réussi à appliquer une texture sur le terrain, il serait bon d'avoir des textures correctes à appliquer. Il est donc temps d'essayer d'exploiter le générateur de Perlin Noise, et de définir des fonctions permettant d'avoir la couleur sur les textures.

Lire la suite Lire la suite

Lien permanent

Semaine 3, jour 1 : Textures

Pour l'instant je n'utilisais que des couleurs unies pour le rendu du terrain. C'est quand meme pas très joli, ça serait sympa de pouvoir appliquer des textures dessus. Et tant qu'on y est, ça serait bien d'utiliser des textures générées automatiquement elles aussi.

Lire la suite Lire la suite

Lien permanent

Semaine 2, jour 5 : Bitmaps et autres

Pour l'instant, pour afficher des informations, j'appuyais sur une touche qui affichait dans la sortie standard les informations.
Mais ça serait mieux d'avoir ces informations en continu, comme le nombre d'images par secondes. Heureusement, GLUT permet d'afficher des polices de caractères très facilement (pour peu que vous n'oubliez pas d'appeler la fonction qui dessine ces caractères).

Histoire de simplifier les coordonnées et l'affichage par rapport à l'utilisateur, il est très très conseillé de passer en vue orthogonale (utile pour les jeux 2D qui utilisent openGL aussi), de dessiner les informations et de retourner en mode 3D.
Voilà un aperçu de ce que ça donne (bizarrement, je n'ai pas réussi à changer la couleur de la police) :

J'ai également procédé à une autre optimisation importante : le LOD (level of detail) en fonction de la distance.
Je crée 3 fois les quads du terrain, avec un niveau de détail normal/bas/très bas et je décide de la version à afficher au moment du rendu. Ca a pris peu de temps mais c'est une optimisation majeure; la scène fonctionne maintenant à 130 fps et affiche environ 300000 polygones au plus haut (l'image au dessus a été prise plus tard, après l'ajout des textures).

Ca peut sembler peu pour aujourd'hui, mais j'ai aussi tapé tous les articles précédents ce jour là.

Lien permanent

Semaine 2, jour 3 et 4 : Frustum, raccourci pour Frustration maximum

Jusqu'à maintenant, je ne faisais qu'envoyer le terrain entier à OpenGL pour qu'il me le dessine. Maintenant qu'il y a de l'éclairage, ça commence à saccader assez fort (les 2 millions de polygones n'y sont peut etre pas pour rien). Le truc bien serait de n'envoyer que ce que la caméra peut voir. C'est là qu'intervient (et par intervient je veux dire attaque) le frustum.

Lire la suite Lire la suite

Lien permanent

Semain 2, jour 2 : Eclairage (basique)

L'éclairage est désactivé par défaut sur OpenGL (ce qui est une bonne chose. les triangles noirs sur fond noir, c'est pas génial), et il affiche tout en éclairage maximum. Pour activer l'éclairage, il suffit de faire un glEnable(GL_LIGHTING) et magie, tout devient noir. Il faut également ajouter une lumière, avec glEnable(GL_LIGHT0). Toujours rien.
Il ne se passe rien, car lorsque j'ai créé mon terrain, je n'ai pas spécifié les normales pour chaque point.

Ceux qui se souviennent de leurs cours de math se souviendront qu'on peut définir un plan avec le vecteur normal au plan ("orthogonal") et sa distance à l'origine. Définir la normale d'un point peut sembler bizarre, mais en fait il s'agit de la moyenne des normales des faces connectées à ce point.
Il vaut mieux avoir une structure (ou une classe) de vecteurs 3D, à partir de maintenant, ainsi que des opérations définies dessus.
Pour calculer la normale d'un point, j'ai donc pris les 8 vecteurs partant de ce point et allant vers ses voisins, fait le produit vectoriel dans le sens des aiguilles d'une montre, normalisé ce produit, et fait la moyenne des 8 produits vectoriels (puis normalisé cette somme).

Normaliser : rendre la norme (longueur) du vecteur égale à 1.
Produit vectoriel : Un calcul très utile. Non commutatif, ce qui fait qu'il faut faire les calculs dans le bon ordre si on veut que ça marche. Ce qui est fort ennuyeux.

Toujours important : il faut toujours vérifier si on ne s'est pas emmelé entre l'axe x et y.

Et voilà ce que ça donne, avec des couleurs bizarres.

La suite de la semaine est beaucoup moins marrante.

Lien permanent

Semaine 2, jour 1 : OpenGL !

Le générateur de Perlin est réalisé, maintenant il ne reste plus qu'à lui trouver une utilité. J'ai choisir d'utiliser le bruit résultant comme heightmap d'un terrain 3D.

Lire la suite Lire la suite

Lien permanent

Semaine 1 : générateur de Perlin

Le but de la première semaine était de créer un générateur de Perlin. Ce générateur permet de créer des images pseudo-aléatoires possédant des détails de toutes tailles, le rendant idéal pour beaucoup d'applications (nuages, terrains, eau, textures procédurales).

Lire la suite Lire la suite

Lien permanent

Bientôt sur vos écrans

Pendant mon stage, j'ai eu une idée. Et si j'utilisais cet endroit pour faire un devlog du projet que je suis en train de réaliser ?
Je suis en train d'écrire la première partie (première semaine), ensuite je vais essayer de diviser par journée/partie.
Et puis ça devrait m'aider pour faire mon rapport de stage après.

Lien permanent

Reset.

Non, tout n'a pas été supprimé, juste mis hors ligne.
UPDATE `dc_post` SET `post_pub` = 0 WHERE 1;
Et évidemment j'ai probablement la flemme d'écrire quoi que ce soit, donc ce post va rester longtemps en haut de la page.
D'ailleurs ça fait foirer le css vu qu'il n'y a plus rien.

Lien permanent