Par l'équipe Codermind. |
|
C'est la troisième partie de cette série d'article sur le moteur de rendu de terrain par voxel. Elle fait suite à l'article appelé Moteur de rendu par voxel - Visibilité, occlusion.
Suréchantillonnage horizontal : la force brute
Faire du suréchantillonnage (supersampling ou oversampling en anglais) est facile. Il s'agit de multiplier la définition du rendu par deux (ou quatre ou plus). Maintenant ce que cela signifie c'est que deux fois plus de mémoire est occupée par les différents buffers, et bien entendu il faut tracer deux fois plus de pixels, ou multiplie les besoins en calcul et en bande passante, etc. Tout n'est pas multiplié par deux, on ne choisit pas un niveau de détail plus fin parce qu'à la fin ces échantillons vont être compressés en un seul pixel à l'écran. Cela veut dire que, toutes choses égales par ailleurs, les calculs avant l'écriture dans le frame buffer seront équivalents à la version non suréchantillonnée. Bien entendu on pourrait choisir un niveau de détail plus fin pour améliorer la qualité encore plus mais cela ne sera pas nécessaire.
Par exemple, lors d'un de mes tests avec tout les effets activés par ailleurs aux niveaux les plus haut, j'ai activé par dessus le suréchantillonnage 4x (horizontal) et j'ai vu une augmentation de 50% des cycles de rendu d'une frame. Nous n'avons heureusement pas vu une augmentation par quatre des coûts tout simplement parce que l'on ne passe pas cent pour cent de notre temps à tracer les pixels finaux et que les autres coûts comme on a expliqué plus haut n'ont pas augmenté.
La passe finale est une passe de résolution, en utilisant un filtre boite : on ajoute les quatre échantillons et on diviser la couleur résultante par quatre. C'est suffisammment bon pour l'instant. Il y a des filtres meilleurs qui minimisent les effets d'escaliers (roping effect), en résolvant plus de quatre samples par pixels, mais je ne rentre pas trop dans les détails ici (vous pouvez aller voir ma série d'articles sur le raytracer pour avoir une idée d'un meilleur filtre).
Suréchantillonnage vertical : la version rapide
L'avantage d'un filtre séparable c'est que vous pouvez filtrer selon X et selon Y séparément, en fait grâce à cela on peut appliquer deux méthodes différentes pour l'antialiasing selon l'axe des X et l'axe des Y. L'axe des X a eu droit à la force brute, l'axe des Y sera un peu plus efficace.
On va tirer encore une fois profit de l'algorithme de Y-Buffer décrit dans la première partie. À la place de stocker la valeur de Y entière dans le Y buffer, on va stocker des fractions de pixels. Donc si l'on touche à un pixel, on peut déterminer grâce à la valeur fractionnelle de Y, quelle portion du pixel est couverte.

Le pixel final sera écrit seulement quand les quatre sous-échantilons (dans ce cas) seront couvert. On prendra là encore la valeur de couleur moyenne. C'est un processus incrémental, nul besoin comme pour l'axe des X de faire une passe supplémentaire à la fin pour la résolution. C'est garanti de marcher à cent pour cent, parce que la variation des Y sur une simple colonne de pixels est monotone.
Le coût n'est pas élevé, pour quatre sous-échantillons horizontaux par ligne et tout le reste activé par ailleurs, on a au final 15% de cycles en plus que le rendu normal.
Interpolation linéaire
Initialement nos lames de terrain étaient de simples blocs rectangulaires alignés dans l'espace de l'écran. Mais pour avoir un effet de transition plus doux entre les lames, nous avons besoin d'interpoler entre deux éléments de terrain. Ce que j'ai utilisé ici est une interpolation linéaire, ce qui nous donne un aspect polygonal à distance. J'interpole uniquement entre les deux hauteurs, mais on peut bien entendu imaginer interpoler la couleur diffuse ou d'autres attributs.

Brouillard et plan d'eau
Dans le monde réel, à grande distance toute semble être légèrement teinté en bleu et désaturé. C'est l'effet que les peintres appellent perspective aérienne. C'est causé par les particules et les molécules dans l'air qui modifient les couleurs qui parviennent jusqu'à votre oeil. Si vous regardez la photo du paysage de l'Utah présenté plus haut, vous pouvez voir que les montagnes les plus lointaines ont l'air bleu, tout en sachant très bien que ce n'est pas leur "vraie" couleur. C'est aussi vrai pour le ciel, il a l'air bleu quand on sait que l'espace derrière lui est vraiment noir. La couleur que l'on voit est donc réfléchie par les molécules de l'air entre ici et là bas.
Il y a plusieurs façons d'implémenter cela dans notre code, on va choisir la plus facile. Il suffit de prendre le Z du point de vue de l'oeil et de le diviser par un Z maximal et interpoler linéairement entre la vraie couleur du terrain et une couleur de brouillard qui est bleue insaturée. Ce n'est pas du tout correct physiquement mais ça rend suffisamment bien pour ce que l'on veut faire et surtout c'est rapide.
Nous avons également des aires de terrain couvertes d'eau. On choisit de représenter ainsi les aires de terrain qui sont sous un certain niveau prédéfini. L'eau vu sous cet angle devrait principalement refléter l'environnement mais on va oublier ça, je vais juste la faire réfléchir la couleur du ciel et la combiner avec la couleur du terrain qui se trouve sous le niveau de l'eau. Si cela vous intéresses de savoir comment l'eau et autres matériaux transparents reflètent la lumière, vous pouvez aller lire mon article sur le raytracing, tout y est expliqué (Fresnel, Descartes, etc.).
Dessin du ciel
La modélisation du ciel est assez complexe. Dans les grandes lignes vous avez deux types de dispersion de lumière (Mie et Rayleigh), Rayleigh disperse principalement les ondes bleues et ceci dans toutes les directions, Mie disperse les ondes en avant et en arrière, créant un halo blanc autour du soleil dont la taille dépend de la concentration de particules/molécules dans l'air. La lumière qui traverse plusieurs couches de dispersions devient elle-même teintée et affecte les particules et le sol en les éclairant. La lumière qui parvient à votre oeil a donc pu être réflechi plusieurs fois depuis son départ depuis le soleil.
Pour résumer : le ciel a l'air bleu, saturé quand vous regardez à la verticale et de plus en plus insaturé, quelquefois blanc ou grisâtre quand vous regardez horizontalement. Il a l'air plus blanc également autour du soleil.

C'est vrai de jour et pour un ciel dégagé sans nuage, brouillard ou autres. Lors du crépuscule ou l'aube, la lumière du soleil a traversé tellement de couches d'air qu'elle a perdu la plupart de son bleu et commence à teinter tout ce qu'elle touche en orange ou en rouge. Pendant la journée la lumière du soleil est presque blance ou jaune très claire, et ce qui n'est pas éclairé directement par le soleil est presque bleu parce que la principale source de lumière secondaire est le ciel bleu.
Plutot que d'intégrer le modèle complexe (voir les liens), on va se contenter de dessiner le ciel de manière explicite. On va choisir un bleu saturé (1) et un bleu insaturé (2) faire un dégradé du haut vers le bas de saturé à insaturé (l'horizon et ce qui se trouve en dessous étant coloré en bleu numéro 2). Le soleil n'est pas physiquement présent à l'image mais je garde trace de sa position et en particulier de son angle. Le bleu saturé est mélangé avec plus ou moins de blanc selon que l'on s'approche de l'angle du soleil. (cosinus de l'angle de vue moins l'angle du soleil à la puissance N).

Que peut-on faire de plus ?
Il y a clairement beaucoup de choses qui restent à faire, nous avons à peine effleuré la surface. Mais nous atteignons désormais la fin de notre série de tutoriaux. Vous pouvez visiter la partie finale appelée Moteur de terrain par voxel - Conclusion et travaux futurs où vous pourrez également télécharger le code source de ce projet.




