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

Groupe look, ce que chaque chiffre déplace ici
RéglageDescriptionDéfaut
funnelStepsPas de la traversée du volume par le programme de fragment. En dessous de seize, la paroi se met à faire des bandes visibles.40
funnelLightStepsPas 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
funnelDetailTaille du plus petit filament de condensation encore jugé utile, en blocs. Plus fin coûte plus de pas pour rester sans grain.1.8
funnelRenderDistanceDistance 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
screenShakeCoupe uniquement le tremblement de caméra décrit plus haut.true
postEffectCoupe l'assombrissement, les traînées et le flash portés par le pixel unique de StormPostEffect.true
skyGreenPart du vert que prend la couleur du ciel sous une tornade, de 0 à 1.0.55