Comment les jeux modernes font-ils un niveau de détail géométrique pour les maillages d'objets tels que les personnages, le terrain et le feuillage? Ma question comporte deux parties:
- À quoi ressemble le pipeline d'actifs? Les artistes fabriquent-ils un modèle high-poly qui est ensuite décimé? Si oui, quels algorithmes de décimation sont les plus populaires? Les maillages LOD sont-ils parfois faits à la main?
- Comment les moteurs effectuent-ils la transition entre différents LOD d'objet au moment de l'exécution? Y a-t-il des transitions douces ou progressives?
La réponse pourrait être «différents studios utilisent des techniques différentes». Dans l'affirmative, veuillez identifier certaines des pratiques les plus courantes. Ce serait également bien si vous pouviez me diriger vers des livres blancs / diapositives qui couvrent des exemples spécifiques.
Réponses:
Pour la géométrie LOD, la plupart des jeux basculent simplement entre un certain nombre de maillages LOD prédéfinis. Par exemple, "Infamous: Second Son" utilise 3 mailles LOD ( Adrian Bentley - "inFAMOUS: Second Son engine postmortem", GDC 2014 ) et "Killzone: Shadow Fall" utilise 7 mailles LOD par personnage ( Michal Valient - "Killzone: Shadow fall" démo post-mortem ", Devstation2013 ). La plupart d'entre eux sont générés, mais les plus importants (comme le personnage principal) peuvent être fabriqués à la main. Les maillages sont souvent générés à l'aide d'un middleware Simplygon populaire, mais parfois ils sont simplement générés par des graphistes dans leur package 3D préféré.
Les jeux avec une grande distance de tirage utilisent en outre des imposteurs pour le feuillage, les arbres et les bâtiments élevés ( Adrian Bentley - "inFAMOUS: Second Son engine postmortem", GDC 2014 ). Ils utilisent également des niveaux de détail hiérarchiques, qui remplacent un ensemble d'objets par un. Par exemple, dans "Just Cause 2", les arbres sont d'abord rendus individuellement sous forme de maillages LOD normaux, puis individuellement sous forme d'imposteurs et enfin sous la forme d'un maillage forestier fusionné unique ( Emil Persson, Joel de Vahl - "Populating a Massive Game World", Siggraph2013 ) et dans Les parties éloignées du "Sunset Overdrive" du monde sont remplacées par un seul maillage généré automatiquement hors ligne ( Elan Ruskin - "Streaming Sunset Overdrive's Open World", GDC2015 ).
Un autre composant d'un système LOD est la simplification des matériaux et des shaders. Par exemple, "Killzone: Shadow Fall" désactive l'espace tangent et le mappage normal pour les LOD distants ( Michal Valient - "Killzone: Shadow fall demo postmortem", Devstation2013 ). Ceci est généralement implémenté en désactivant globalement un ensemble de fonctionnalités de shader par LOD, mais pour les moteurs avec des graphiques de shader, où les artistes peuvent créer des shaders personnalisés, cela doit être fait manuellement.
Pour les transitions LOD, certains jeux changent simplement de maillage et certains utilisent le tramage pour des transitions LOD fluides - au niveau du commutateur LOD, deux maillages sont rendus: le premier disparaît progressivement et le second se fane ( Blog Simon Schreibt - "Assassins Creed 3 - LoD Blending" ). Les techniques classiques de maillage progressif du processeur ne sont pas utilisées car elles nécessitent une mise à jour et un téléchargement coûteux du maillage vers le GPU. La tessellation matérielle est utilisée dans quelques titres, mais uniquement pour affiner un niveau de détail le plus détaillé, car il est lent et en général, il ne peut pas remplacer les niveaux de géométrie prédéfinis.
Les LOD de terrain sont traités séparément afin d'exploiter ses propriétés spécifiques. Le LOD de géométrie du terrain est généralement implémenté à l'aide de clipmaps ( Marcin Gollent - "Création et rendu de paysage dans REDengine 3" ). Les LOD des matériaux de terrain sont traités de la même manière que les LOD maillés ou en utilisant une sorte de texture virtuelle Ka Chen - «Rendu de texture virtuelle adaptatif dans Far Cry 4 .
Enfin, si vous êtes intéressé à voir des pipelines de LOD de jeu réels, parcourez simplement la documentation de l'un des moteurs de jeux modernes: Unreal Engine 4 - "Création et utilisation de LOD" , CryEgnine - LOD statique et Unity - LOD .
la source
LOD (Level of Detail) signifie gérer des objets dans différentes échelles d'affichage, qui pourraient être divisées en deux parties. Cependant, vous pouvez en utiliser un et cela suffira dans la plupart des cas.
Afficher / masquer les calques (groupe d'objets du même type) en fonction de la magnitude (échelle d'affichage).
Méthode basée sur la géométrie algébrique, appelée Généralisation (qui est un algorithme pour simplifier les polygones). regardez l'image suivante
La méthode la plus célèbre et la plus efficace pour généraliser (simplifier) un maillage polygonal est connue sous le nom de théorème de polyèdre de Descartes-Euler (équation 4.5 désolé si je fais référence à un livre, ce que je pouvais faire de mieux) et est utilisée par la plupart des bases de données spatiales par exemple des modules PostGIS dans PostgreSQL. Il supprime simplement les petits côtés d'un polygone et en fait un très arrondi (image ci-dessus).
Pour implémenter LOD dans un jeu, vous devez enregistrer et gérer l'échelle de votre carte (scène) pendant les opérations de zoom avant / arrière. L'échelle passe de zéro à l'infini et vous devez la diviser en un nombre particulier de plages, par exemple quelque chose comme ceci:
Ensuite, vous devez définir quels types de vos objets (calques) doivent être visibles ou invisibles dans chacune des plages ci-dessus. Par exemple, un petit type d'objet comme une vanne de prise d'eau ne devrait pas être visible lorsque l'utilisateur est dans la quatrième plage, car il sera très petit à cette échelle et ne pourra pas être discriminé, donc peu importe si vous sautez le dessin sur le écran.
Ainsi, lorsqu'un utilisateur utilise un zoom avant et un zoom arrière pour modifier le grossissement, il se déplace dans les limites ci-dessus de l'une à l'autre plage, et votre jeu utilise ces échelles d'affichage pour gérer le niveau de détails en affichant ou en masquant des objets sur la scène. Cela fait une solution discrète que les objets s'estompent soudainement pendant votre opération de zoom arrière, mais avec les échelles d'affichage et les plages d'agrandissement définies avec soin, l'utilisateur ne ressentira rien.
Le groupe de 4 gammes ci-dessus n'est qu'un exemple et vous devez trouver le meilleur pour votre propre cas par essais et erreurs. Il n'y a pas de règle pour ça.
Parfois, les jeux utilisent leurs propres méthodes LOD, Subway Surfer pour l'instant, montre un petit rectangle sans texture pour montrer un bâtiment de loin, et en se rapprochant soudainement, il obtient de la texture, le joueur le ressent. Vous n'avez pas parlé de votre système de projection, ce qui est très important, vous n'avez pas non plus parlé du type de jeu que vous créez.
Supposons cependant que vous implémentiez un jeu 3D complet avec openGl et que vous souhaitiez filtrer certains maillages avant de les transférer sur du matériel graphique, je suis sûr que cela vous aidera à réduire les opérations de liaison / dissociation avec des objets tampons et des tableaux de vertex (VBO, VAO) tout en traitant d'OpenGl.
Dans la plupart des cas, il n'est pas nécessaire d'implémenter un algorithme de généralisation, et le filtrage des objets fonctionne et vous permet d'obtenir l'efficacité (taux de rafraîchissement) dont vous avez besoin, mais cela dépend totalement, au cas par cas. Bien qu'il s'agisse d'un algorithme simple qui supprime simplement les petits côtés d'un polygone, vous devez définir un seuil qui est le produit de la magnitude et d'un nombre constant, de sorte que les plus grands côtés sont filtrés d'un point de vue beaucoup plus éloigné.
Oublier le changement de couche et n'implémenter que l'algorithme de généralisation Eulers, fournit une méthode très soignée et continue dans laquelle vous vérifiez simplement chaque côté et chaque ligne par rapport à un seuil prédéfini et ne les affichez que dans le cas où ils sont assez grands pour être discriminés à l'écran.
PS: le grossissement est un nombre flottant> 0 qui est égal à 1 / échelle et l'échelle est généralement <1 car une échelle 1: 1 signifie que vous avez des longueurs réelles dans votre jeu.
la source
Iman a déjà préparé une réponse complète mais je souhaite y ajouter quelque chose
LOD peut être fait de deux manières différentes
Par exemple, le mipmaping est un bon, rapide mais lourd qui appartient au groupe secondaire ci-dessus
ici vous pouvez trouver une bonne explication au mipmaping et au code d'implémentation avec OpenGl.
la source