Edit: C'est juste pour ma propre expérience d'apprentissage, ce n'est PAS pour des raisons de performance que je pose cette question.
Il s'agit d'un moteur de terrain de type Minecraft. Je stocke des blocs en blocs (blocs 16x256x16 en bloc). Lorsque je génère un morceau, j'utilise plusieurs techniques procédurales pour définir le terrain et placer des objets. Lors de la génération, je garde un tableau 1D pour le bloc complet (solide ou non) et un tableau 1D séparé de blocs solides.
Après la génération, je parcourt les blocs solides en vérifiant leurs voisins, donc je ne génère que des faces de bloc qui n'ont pas de voisins solides. Je stocke les faces à générer dans leur propre liste (soit 6 listes, une par face possible / normale). Lors du rendu d'un bloc, je rend toutes les listes dans le bloc actuel de la caméra et uniquement les listes faisant face à la caméra dans tous les autres blocs. Je le fais en stockant les 6 listes dans un seul tampon, puis je change simplement les plages que je dessine.
En utilisant un atlas 2D avec ce petit truc de shader suggéré par Andrew Russell, je veux fusionner complètement des visages similaires. Autrement dit, s'ils sont dans la même liste (même normal), sont adjacents les uns aux autres, ont le même niveau de lumière, etc. Je sais que je vais toujours me retrouver avec des rectangles, mais cela devrait facilement réduire mon nombre de vertices de 50% ou mieux si mes estimations sont correctes.
Mon hypothèse serait d'avoir chacune des 6 listes triées par l'axe sur lequel elles reposent, puis par les deux autres axes (la liste pour le haut d'un bloc serait triée par sa valeur Y, puis X, puis Z).
Avec cela seul, je pourrais assez facilement fusionner des bandes de visages, mais je cherche à fusionner plus que des bandes ensemble lorsque cela est possible. J'ai lu cet algorithme de maillage gourmand, mais j'ai beaucoup de mal à le comprendre.
Donc, ma question: pour effectuer la fusion des faces comme décrit (en ignorant si c'est une mauvaise idée pour un terrain / éclairage dynamique), existe-t-il peut-être un algorithme plus simple à mettre en œuvre? Je serais également très heureux d'accepter une réponse qui me guide à travers l'algorithme gourmand d'une manière beaucoup plus simple (un lien ou une explication).
Cela ne me dérange pas une légère diminution des performances si elle est plus facile à mettre en œuvre ou même si c'est juste un peu mieux que de simplement faire des bandes. Je crains que la plupart des algorithmes se concentrent sur les triangles plutôt que sur les quads et en utilisant un atlas 2D comme je suis, je ne sais pas si je pourrais implémenter quelque chose de triangle basé sur mes compétences actuelles.
PS: J'effectue déjà un tri sélectif par morceau et comme décrit, j'élimine également les faces entre les blocs solides. Je n'abat pas encore d'occlusion et je ne le ferai peut-être jamais.
* Edit: j'ai implémenté ma propre petite technique, qui a probablement un nom, mais je passe simplement par mes 6 listes qui sont triées par les axes sur lesquels elles reposent, suivies par type de bloc, puis par niveau d'éclairage. Je les parcourt, créant de nouveaux rectangles au fur et à mesure et les agrandissant simultanément (avec un fort biais vers un certain axe). Ce n'est certainement pas optimal, mais il est en effet assez rapide et il réduit mon nombre de vertex de près de 50% en moyenne. Le commentaire de Byte56 est le placard, je pense à une vraie réponse, mais je ne peux pas sélectionner cela pour la réponse / prime.
Voici ma façon rapide et simpliste de gérer ce problème APRÈS avoir généré le terrain initial complet sans beaucoup d'optimisation. En supposant que tous les carrés donnés sont la même image, niveau d'éclairage, normal, etc. chaque couleur est un quadrillage différent que je rendrais. Avec mes listes triées comme elles sont, c'est une approche très facile / rapide.