Question

Je travaille sur un jeu en 2D. Imaginez un avion XY et vous êtes un personnage. Au fur et à mesure que votre personnage se déplace, le reste de la scène apparaît.

Imaginez que le plan XY soit assez grand et qu'il y ait d'autres caractères en dehors de votre vue actuelle.

Voici ma question, avec opengl, si ces objets ne sont pas rendus en dehors de la vue actuelle, prennent-ils du temps de traitement?

En outre, quelles sont les approches permettant d'éviter le rendu de parties de la scène qui ne sont pas visibles. Si j'ai un cube situé à 1000 unités de ma position actuelle, je ne veux pas que cet objet soit restitué. Comment aurais-je pu opengl ne pas rendre cela?

Je suppose que l’approche la plus simple consiste à calculer la position et à ne pas dessiner ce cube / cet objet s’il est trop éloigné.

Était-ce utile?

La solution

Si vous avez configuré votre graphique de scène correctement, les objets situés en dehors de votre champ de vision doivent être cueillis à un stade précoce du pipeline d’affichage. Dans votre code, une case à cocher vous demandera de vérifier que l’objet est invisible, ce qui entraînera une surcharge de traitement (mais pas beaucoup).

Si vous organisez vos objets dans une hiérarchie appropriée, vous pouvez supprimer de larges sections de la scène en cochant une seule case.

Autres conseils

faq OpenGL sur " Coupure, élimination et tests de visibilité " ; dit ceci:

  

OpenGL ne fournit aucun support direct pour déterminer si une primitive donnée sera visible dans une scène pour un point de vue donné. Dans le pire des cas, une application devra effectuer ces tests manuellement. La question précédente contient des informations sur la procédure à suivre.

Allez-y et lisez le reste de ce lien, tout est pertinent.

Généralement, votre application doit effectuer ces optimisations - OpenGL n’est littéralement que la partie du rendu et ne permet pas la gestion des objets, ni rien de ce genre. Si vous transmettez des données pour quelque chose d’invisible, il doit encore transformer les coordonnées pertinentes en espace de visualisation avant de pouvoir déterminer qu’elles sont entièrement hors écran ou au-delà de l’un de vos plans.

Il existe plusieurs façons de sélectionner des objets invisibles dans le pipeline. Vérifier si un objet est derrière la caméra est probablement la vérification la plus facile et la moins chère à effectuer car vous pouvez rejeter la moitié de vos données en moyenne avec un simple calcul par objet. Il n’est pas beaucoup plus difficile d’effectuer le même type de test contre la frustration réelle de la vue pour rejeter tout ce qui n’est pas du tout visible.

Évidemment, dans un jeu complexe, vous ne voudrez pas faire cela pour tous les objets minuscules. Il est donc typique de les grouper de manière hiérarchique (par exemple, vous ne rendriez pas une arme à feu si vous avez déjà déterminé que ne restituez pas le caractère qui le tient), spatialement (par exemple, divisez le monde en une grille / quadtree / octree et rejetant tout objet que vous savez se trouver dans une zone que vous avez déjà déterminée est actuellement invisible), ou plus généralement une combinaison des deux.

"Le seul coup gagnant n'est pas de jouer"

Chaque glVertex, etc., sera un succès en termes de performances, qu'il soit ou non rendu à l'écran. La seule façon de contourner ce problème est de ne pas dessiner (c.-à-d. Éliminer) des objets qui ne seront jamais rendus de toute façon.

La

méthode la plus courante consiste à associer un frustum à votre appareil photo. Ajoutez à cela un octtree ou quadtree selon que votre jeu est au format 3d / 2d, vous n'avez donc pas besoin de vérifier chaque objet du jeu contre le frustum.

Le pilote sous-jacent peut faire une sélection en coulisse, mais vous ne pouvez pas en dépendre, car cela ne fait pas partie du standard OpenGL. Peut-être que le pilote de votre ordinateur le fait, mais peut-être que quelqu'un d'autre (qui pourrait exécuter votre jeu) ne le fait pas. C’est mieux pour vous de faire votre propre sélection.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top