L'entonnoir dessiné
Une tornade ne confie au moteur qu'une seule géométrie par image: un prisme, soumis
sous le nom de pipeline vortexdread_funnel, dont les deux programmes
tiennent entièrement dans shaders/core. Rien d'autre n'est dessiné, et
aucune particule Minecraft n'est déclarée nulle part dans le mod.
La paroi striée, l'anneau de débris soulevé au pied, la base nuageuse qui s'abaisse par-dessus et la teinte que prend la colonne selon ce qu'elle arrache: tout sort d'un calcul de densité relancé à chaque pixel pendant que le rayon de la caméra traverse ce prisme. Les morceaux que la tempête arrache ne sont pas davantage des particules: chacun garde le modèle du bloc dont il vient et tombe avec lui. Sans le moindre shader pack installé, c'est déjà l'image que le jeu rend par défaut.
Une boîte, un programme
TornadoRenderer construit ce prisme face par face et tourne chacune vers
l'intérieur, parce que la marche calcule elle-même son entrée et sa sortie du volume: c'est
toujours la paroi la plus loin de l'œil qui doit rester en place, jamais la plus proche. Les
nombres de la tempête voyagent dans des attributs qu'un sommet porte déjà: le rayon et la hauteur
empaquetés dans UV1, la charge de sol et le sens du vent dans
Normal, la teinte et l'éclair dans Color.
La boîte déborde largement la fumée qu'elle contient: la condensation la plus large atteint 1.8 fois le rayon du cœur, et la boîte elle-même prend encore 50% de marge par-dessus pour laisser la turbulence pousser dans les coins. Le rayon et la hauteur empaquetés dans UV1 tiennent chacun sur seize bits, au 1/64e de bloc près, largement sous ce qu'un œil distingue à cette distance.
Le vent qui gonfle la paroi est ramené à une fraction de 90 m/s
avant d'entrer dans le calcul de forme, et windFraction vaut 1 dès
qu'une rafale atteint ce plancher. Sous le pied de la colonne, la boîte descend encore de
0.9 rayon de cœur pour que la poussière projetée par-dessus une corniche ne soit
jamais coupée net, avec 1.3 rayon de plus en largeur pour laisser les lobes de
l'anneau déborder sans être rognés.
Un entonnoir qui ne clignote pas
La boîte utilisée pour décider si la tornade mérite seulement d'être soumise est
étirée du même 0.9 rayon de cœur vers le bas par
getBoundingBoxForCulling, le même chiffre que la marge sous le pied: une
colonne dont seule la jupe de poussière reste à l'écran ne doit jamais disparaître simplement
parce que le calcul de visibilité s'est arrêté au tourbillon lui-même.
Le profil de la colonne
À l'intérieur du prisme, le programme de fragment trace un profil qui part étroit et évase vers le haut: 0.58 rayon de cœur à la base, 0.78 de plus une fois multiplié par le carré de la hauteur relative, ce qui donne la silhouette en entonnoir plutôt qu'en tuyau. L'anneau de débris s'étale à 1.25 rayon de cœur, la base nuageuse abaissée à 2.3, et cette dernière ne pend que sur 0.13 de la hauteur totale de l'entonnoir avant de remonter sur 1.4 fois sa propre épaisseur pour s'effiler plutôt que de finir sur un bord net.
Ce qui rend une colonne mûre presque opaque tient dans une seule constante du
programme, EXTINCTION, réglée à 0.62 par unité de
densité traversée.
Le nombre de pas le long du rayon de vue et vers la lumière ne change jamais d'une
exécution à l'autre: STEPS et LIGHT_STEPS sont
écrits en dur dans le texte du programme plutôt que lus dans un réglage, et c'est ce qui garde le
pire cas de coût connu d'avance.
Ce que sa présence fait à l'écran
L'effet suit la tempête plutôt que de la copier telle quelle: il monte en 0.14 par tick à l'approche et ne redescend qu'à 0.05 une fois la tornade passée, comme le ferait une lumière réelle qui met plus longtemps à s'éteindre qu'à apparaître.
Le tremblement de caméra plafonne à 0.85 degré au cœur d'une EF5, la zone où quoi que ce soit de tout ça se fait sentir s'étend à 2.2 fois la portée d'influence de la colonne, et le journal ne redit l'intensité que lorsqu'elle a bougé d'au moins 12 centièmes depuis la dernière ligne écrite.
Deux interrupteurs séparés. screenShake coupe
uniquement le tremblement de caméra, et postEffect coupe tout le
reste de ce que la tempête pose sur l'écran sans toucher au tremblement: quelqu'un que le
tremblement dérange n'est pas obligé de perdre le reste de la mise en scène.
Ce qui change si un pack observe
Tout ce qui vient d'être décrit tourne à l'identique, qu'un shader pack soit chargé ou non: c'est le rendu que le jeu montre par défaut. Ce que la tempête devient une fois Iris et un pack patché en place, avec sa propre lumière et son propre brouillard aérien, fait l'objet de la page suivante de ce wiki.
Les réglages qui changent le coût
| Réglage | Description | Défaut |
|---|---|---|
| funnelSteps | Pas de la traversée du volume par le programme de fragment. En dessous de seize, la paroi se met à faire des bandes visibles. | 40 |
| funnelLightSteps | Pas pris vers la lumière pour l'ombre portée à l'intérieur de la colonne. À zéro, l'entonnoir s'aplatit complètement. | 6 |
| funnelDetail | Taille du plus petit filament de condensation encore jugé utile, en blocs. Plus fin coûte plus de pas pour rester sans grain. | 1.8 |
| funnelRenderDistance | Distance au-delà de laquelle l'entonnoir sort purement et simplement de ce qui est soumis au moteur, et la tempête ne reste plus que ciel et son. | 1024.0 |
| screenShake | Coupe uniquement le tremblement de caméra décrit plus haut. | true |
| postEffect | Coupe l'assombrissement, les traînées et le flash portés par le pixel unique de StormPostEffect. | true |
| skyGreen | Part du vert que prend la couleur du ciel sous une tornade, de 0 à 1. | 0.55 |