2009-09-16 17 views
1

Je travaille sur un jeu 2d. Imaginez un avion XY et vous êtes un personnage. Pendant que votre personnage marche, 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.Développement de jeux OpenGL - scènes qui s'étendent loin dans la vue

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

Aussi, quelles sont les approches pour éviter d'avoir des parties de la scène qui ne sont pas visibles. Si j'ai un cube à 1000 unités de ma position actuelle, je ne veux pas que cet objet soit rendu. Comment ai-je pu ne pas le faire?

Je suppose que la méthode la plus simple consiste à calculer la position et à ne pas dessiner ce cube/objet s'il est trop éloigné.

Répondre

3

Si vous avez configuré votre graphe de scène correctement, les objets situés hors de votre champ de vision doivent être triés très tôt dans le pipeline d'affichage. Il faudra un contrôle de boîte dans votre code pour vérifier que l'objet est invisible, donc il y aura un peu de temps de traitement (mais pas beaucoup).

Si vous organisez vos objets dans une hiérarchie judicieuse, vous pouvez réduire une grande partie de la scène en une seule case.

7

OpenGL faq sur « Clipping, Test Abattage et visibilité », dit ceci:

OpenGL ne fournit aucun soutien direct pour déterminer si une primitive donnée sera visible dans une scène d'un point de vue donné. Au pire, une application devra effectuer ces tests manuellement. La question précédente contient des informations sur la façon de procéder.

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

0

Typiquement, votre application doit effectuer ces optimisations - OpenGL est littéralement juste la partie de rendu, et n'effectue pas la gestion des objets ou quelque chose comme ça. Si vous transmettez des données pour quelque chose d'invisible, il doit encore transformer les coordonnées pertinentes en espace de vue avant de pouvoir déterminer qu'il est entièrement hors de l'écran ou au-delà de l'un de vos plans de plans.

Il existe plusieurs façons de trier les objets invisibles du pipeline. Vérifier si un objet se trouve derrière la caméra est probablement la vérification la plus simple et la moins chère à effectuer puisque vous pouvez rejeter la moitié de votre jeu de 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 vue actuelle frustrum pour rejeter tout ce qui n'est pas du tout visible. Il est évident que dans un jeu complexe, vous ne voudrez pas avoir à faire cela pour chaque objet minuscule, donc il est typique de les grouper, soit hiérarchiquement (par exemple vous ne rendrez pas un pistolet si vous avez déjà déterminé que vous ne restituez pas le caractère qui le contient), spatialement (par exemple diviser le monde en une grille/quadtree/octree et en rejetant tout objet que vous connaissez est dans une zone que vous avez déjà déterminé est actuellement invisible), ou plus généralement une combinaison des deux.

0

« le mouvement ne gagnant est de ne pas jouer »

Chaque glVertex etc va être un spectacle frappé indépendamment du fait qu'il s'en fin de compte rendu à l'écran. La seule façon de contourner cela 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 viewing frustum à votre appareil photo. Ajoutez à cela un octtree ou quadtree selon que votre jeu est 3d/2d donc vous n'avez pas besoin de vérifier chaque objet du jeu contre le tronc.

0

Le pilote sous-jacent peut effectuer un tri dans les coulisses, mais vous ne pouvez pas en tenir compte car il ne fait pas partie de la norme 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.