Adéquation du brouillard au sol avec des quads alpha en couches


16

Une approche en couches utiliserait une série de quads massifs à texture alpha disposés parallèlement au sol, coupant toute la géométrie du terrain, pour fournir l'illusion du brouillard au sol assez efficacement de haut en haut, en regardant vers le bas et un peu moins efficacement à l'intérieur du brouillard et regardant vers l'horizon (voir l'image ci-dessous).

Alternativement, une approche principalement basée sur un shader calculerait plutôt la densité en fonction de la distance de vue dans le substrat de brouillard au sol et produirait la valeur du fragment en fonction de cela.

Sans avoir à tester les performances de chaque approche moi - même , je voudrais d'abord entendre les expériences des autres (pas des spéculations!) Sur le type d'impact sur les performances que l'approche de texture alpha en couches est susceptible d'avoir. Je pose la question spécifiquement en raison des impacts souvent évoqués du sur-retrait (je ne sais pas comment le taux de remplissage lié à votre système de bureau moyen est). Une liste de jeux utilisant cette approche, en particulier les jeux plus anciens, serait extrêmement utile: si cela était viable sur le matériel pré DX9 / OpenGL2, cela fonctionnera probablement bien pour moi.

Une grande question concerne ce type d’effet:

entrez la description de l'image ici

(Le crédit d'image va à Lume de lume.com)

Remarquez comment la gradation verticale du brouillard est continue / lisse. OTOH, en utilisant des couches quadruples texturées, je ne peux que supposer que les couches seraient très évidentes en les parcourant - plus elles étaient clairsemées, plus cela serait évident. Cela contraste avec l'endroit où les plans de brouillard sont alignés pour faire face au joueur à chaque image, où cette grossièreté serait beaucoup moins évidente.


1
Pourquoi voudriez - vous voulez utiliser alpha couches de quad pour cela? L'approche "shader-heavy" n'est pas seulement plus précise, elle n'est pas non plus exactement connue pour être lente .
Nicol Bolas

1
@StephanvandenHeuvel Bien sûr, mais c'est un brouillard aligné sur l'espace de vue et basé sur la distance. Brouillard non aligné au sol. Correct?
Ingénieur

1
@NickWiggill Oui, vous avez raison.
Stephan van den Heuvel

1
IIRC, la Wii avait un brouillard aligné au sol dans son pipeline (semi-) fixe. Apparemment, l' glFogCoordextension dans OpenGL hérité a permis de le faire également . Bien que cela semble limité: il est basé au sol ou basé sur la distance.
Laurent Couvidou

1
Quake 3 a fait quelque chose de similaire à cela, en utilisant une approche de pipeline fixe qui fonctionnait avec GL1.1. La grande préoccupation que j'aurais, c'est que le taux de remplissage / retrait peut s'accumuler mal, mais cela vaut probablement la peine de télécharger le code source Q3 et de revoir leur implémentation; vous ne pouvez pas faire exactement la même chose, mais au moins cela peut vous aider à prendre une décision.
Maximus Minimus

Réponses:


15

Puisque vous avez demandé des expériences, voici les miennes.

À l'époque où je programmais des jeux PS2, l'approche des "quads alpha en couches" était un moyen que nous utilisions souvent pour le brouillard. Parfois sous forme de brouillard au sol, mais beaucoup plus souvent sous forme de brouillard plein écran. Et cela a très bien fonctionné dans les deux cas. Alors oui, c'était viable à l'époque du pré-fragment-shader.

Eh bien, en quelque sorte. Le problème, comme vous l'avez remarqué, était que si vous voulez un brouillard lisse comme celui de la capture d'écran, vous avez besoin d'un nombre plutôt absurde de quads alpha.

Sur la PS2, nous pouvions généralement nous permettre entre trois et cinq couches. Qui ressemblait vraiment à des "murs" de brouillard flottant devant vous. Plus que cela et le taux de remplissage a commencé à tuer notre fréquence d'images.

Normalement, ces quads seraient dessinés à des distances fixes devant la caméra, donc vous n'avez jamais eu la situation que vous mentionnez, en "traversant" l'un d'eux. D'un autre côté, en utilisant ces distances fixes, tout le reste du monde faitpasser à travers ces plans pendant que le joueur se déplace, ce qui est un problème graphique assez évident. Presque tout le monde l'a fait à l'époque, mais ce ne serait pas acceptable maintenant (à moins que vous ne le fassiez pour des raisons stylistiques). (Exception: certaines personnes ont calculé les valeurs de brouillard dans le cadre de l'équivalent de la PS2 d'un vertex shader. Cela fonctionnait et était beaucoup plus rapide, mais nécessitait que vos modèles soient très tesselés. Vous ne pouviez pas avoir de longs murs, par exemple, parce que le brouillard n'était que étant calculé aux coins du mur, puis étalé sur toute la face du mur. Le mur semblait complètement embué si vous vous teniez juste à côté de son milieu, par exemple, car il testait uniquement les niveaux de brouillard à sa points de terminaison)

Notez que si vous placez des quads de brouillard statiquement dans le monde (comme vous le mentionnez comme une possibilité), vous ne pourrez pas obtenir l'apparence d'un brouillard extrêmement lisse, comme dans l'image que vous fournissez - il y aura des chevauchements étranges entre quads adjacents en fonction de l'orientation du spectateur. Ces chevauchements peuvent apparaître sous forme de rayures ou de trapèzes (si les quads ne sont pas texturés) ou sous forme de blocs (s'ils sont texturés).

Mais supposons que nous utilisons de larges quads face à l'écran pour faire ce brouillard au sol et faisons des calculs pour rendre le brouillard vraiment lisse en utilisant cette méthode, sur un terrain plat, avec une caméra regardant droit devant - c'est notre situation idéale . Supposons une résolution HD: 1920x1080, ce qui place notre horizon sur la ligne de balayage 540. Supposons également que nous ayons une visibilité jusqu'à l'horizon (c'est-à-dire, en supposant que le brouillard n'atteigne pas sa pleine opacité avant d'atteindre l'horizon). Avec un quadruple brouillard commençant et un arrêt à chaque ligne de balayage (afin d'obtenir un brouillard lisse), nous avons besoin de (540 * 2 ==) 1080 quadruples brouillard. Chacun de ces 1080 brouillards couvrira toute l'étendue horizontale de l'écran,

Estimons faible et disons qu'en moyenne, un plan de brouillard couvrira environ 300 rangées de pixels. Les plus proches couvriront moins, les plus éloignés couvriront moins, les rangées du milieu couvriront beaucoup plus.

Avec cette estimation, nous obtenons (1920x300 ==) 576 000 pixels touchés par le quadruple brouillard moyen. Au total, c'est (576 000 * 1080 ==) 622 080 000 pixels qui sont touchés au total pour tout l'effet de "brouillard lisse en rendant beaucoup de géométrie translucide". Et ce nombre augmentera pour les personnes fonctionnant à une résolution plus élevée. Et de plus, nous obtenons le même nombre de tests contre le tampon z et presque le même nombre d'opérations de mélange de pixels, car toutes ces couches transparentes se dessinent les unes sur les autres encore et encore. Ça fait beaucoup de pixels.

Et c'est le meilleur des cas - vous obtiendrez une couverture d'écran beaucoup plus large des quads de brouillard si l'utilisateur regarde vers le bas ou s'accroupit.

Notez que puisque nous chevauchons 1080 quads, nous voulons probablement une valeur alpha d'environ (1.0 / 1080 ~ =) 0.0009 définie sur chacun, afin que notre brouillard atteigne sa pleine opacité si vous regardez à travers tous les 1080 quads. (Nous pourrions aller plus haut que cela, mais c'est la valeur en supposant que nous voulons répartir la plage autant que possible). Notez que cette valeur ne peut pas être représentée comme le composant alpha d'une valeur de couleur 32 bits (256 * 0,0009 ~ = 0,237 et sera donc arrondi à 0 si vous essayez). Vous devrez fournir la valeur 0,0009 à OpenGL en tant que valeur à virgule flottante pour que cela fonctionne. (Notez également que vous ne voudrez pas réellement définir cette même valeur sur chacun - alors que nous avons défini que nous voulions qu'un quad commence et un se termine sur chaque ligne de balayage sous l'horizon afin de nous donner un brouillard lisse,

Notez également que les mélanges de brouillard ne fonctionneront pas assez correctement en utilisant cette approche, comme ils le feraient avec un shader moderne - au lieu d'obtenir un calcul de "mélange entre la couleur de l'objet de base et la couleur de brouillard en utilisant ce pourcentage", vous obtenez 1080 calculs de "mélange entre la couleur jusqu'à présent et la couleur de brouillard par le pourcentage de brouillard". Ce qui signifie que le brouillard va affecter les objets suite à une baisse logarithmique. (Autrement dit, un objet affecté par 20 quads de brouillard apparaîtra moins de deux fois plus embué que quelque chose affecté par 10 quads de brouillard, car les premiers quads de brouillard ont plus d'impact dans l'opération de mélange).

Tout cela pour dire: veuillez simplement utiliser un fragment shader.

Pas vraiment. C'est plus simple et moins cher et plus rapide et plus rapide à mettre en œuvre et moins sujet aux erreurs et vous permet de revenir à la création de votre jeu et est meilleur à tous les niveaux. Nous l'aurions totalement fait à l'époque de la PS2 si cela avait été vaguement possible à l'époque.


1
+1 pour une réponse complète basée sur l'expérience du monde réel.
concept3d

3
Il y a un an et un mois, lorsque j'ai écrit cette question, j'étais toujours prêt à jouer au poulet avec des taux de remplissage. Maintenant , j'opterais pour une texture 3D grossière pour représenter les volumes de brouillard au sol avec des densités en constante évolution déterminées, par exemple, par le bruit perlin 3D, puis l'utiliser comme base pour les effets d'espace d'écran, comme vous l'avez suggéré.
Ingénieur
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.