Tri des objets avant le rendu

10

J'essaie d'implémenter un graphique de scène et dans tous les articles que j'ai rencontrés, il est question de tri d'objets. Vous trieriez donc vos objets par "matière" par exemple. Jusqu'à ce que je m'assoie et que je commence à le mettre en œuvre, je tenais cela pour acquis, car cela avait du sens. Mais maintenant je me demande ce que le tri change réellement?

Dans mon moteur, j'ai un gestionnaire pour les UBO, j'utilise ceux-ci pour stocker les données qui seront partagées entre les programmes, pour le moment qui ne concernent que le temps, la caméra et les matrices de projection et les lumières (je ne me soucie pas de gérer les lumières qui affectent quels objets ATM).

Maintenant, pour chaque modèle, je dois changer le modèle en uniforme de matrice mondiale, aucun tri ne va changer cela. Le changement de cette matrice est-il donc si difficile de définir un matériau pour chaque objet?

Je me souviens vaguement avoir lu quelque part que chaque fois que vous modifiez quelque chose dans le pipeline, il doit être vidé et cela peut entraîner des problèmes de performances. Mais pour chaque appel de dessin, je mets en place un modèle de matrice mondiale, alors quel sens cela fait-il de se préoccuper de cela?

BTW contient des informations sur le fait de savoir si changer un uniforme et appeler glBufferSubData est plus (ou moins) cher.

dreta
la source
3
Réponse rapide, oui, le passage de la modification d'une matrice à la définition de matériaux sur chaque objet est si mauvais. À ce stade, je suggère de faire un détour pour en savoir plus sur les outils de mesure des performances OpenGL pour votre plate-forme avant de continuer. Avec les outils de perf, vous pouvez facilement mesurer différentes techniques et découvrir ce qui fonctionne le mieux pour les besoins de votre moteur de rendu. De plus, ces outils vous feront avancer toute votre carrière pendant que ce moteur de rendu ... pas tellement ;-)
Patrick Hughes
@PatrickHughes génial, merci, je vais certainement les vérifier
dreta

Réponses:

4

Vous voulez vraiment trier pour regrouper les matériaux. Si vous le pouvez, vous pouvez également utiliser l'instanciation pour regrouper la géométrie (par exemple, si vous avez un nombre X des mêmes objets).

Le tri par profondeur est également toujours utile. Vous devez trier vers l'arrière pour les objets transparents (en ignorant plusieurs techniques avancées qui suppriment ce besoin, dans des circonstances limitées).

Il est également utile de trier les objets opaques d'avant en arrière, car cela permet au début de Z de réduire considérablement les frais généraux du shader de fragments de votre scène.

Sean Middleditch
la source
3
La commande des objets opaques / transparents n'est pas facile pour des situations complexes (au point d'être impossible sans règles arbitraires). Vous pouvez également regrouper par texture dans le même but de réduire les appels gl.
Darkwings
La commande par texture est nécessaire pour regrouper les appels et réduire les appels de tirage. Le tri n'a rien à voir avec la réduction des appels de tirage. Le tri consiste à obtenir un rendu correct (pour les objets transparents) ou à minimiser la surcharge du processeur de fragments (pour les objets opaques). Être "complexe" est un problème, oui, mais c'est ce que les programmeurs graphiques de moteur de jeu sont payés pour faire en sorte que les jeux soient réellement jouables sur du matériel de base. L'efficacité matérielle entre les objets opaques triés et non triés seuls peut être assez massive.
Sean Middleditch
opengl.org/wiki/Transparency_Sorting C'est ce que je voulais dire par «règles arbitraires». Il n'y a pas de tri objectif «correct» pour les cas complexes. Concernant le «tri» et la «commande», l'OP a clairement déclaré «tri par matériau» (indépendamment de la transparence), et je voulais dire la même chose pour la texture, car les deux visent l'impact sur les performances.
Darkwings
Pour être honnête, je n'ai jamais vu ce genre de problèmes entrer en jeu dans de vrais jeux. Ces exemples ne reflètent pas vraiment la façon dont on fait les choses, où les objets transparents sont généralement de taille à peu près uniforme et ont des limites de collision assez "carrées", qui empêchent les chevauchements fous. Dans les deux cas, le fait que "c'est dur" ne change pas sa nécessité. J'ai également bien sûr souligné que le regroupement par matériau est important et j'ai mentionné instancier pour contrebalancer l'affirmation «aucun tri ne peut aider», donc je ne suis pas sûr s'il y a quelque chose de concret que vous avez trouvé erroné dans ma réponse.
Sean Middleditch
Écoutez, un commentaire ne signifie pas que j'ai trouvé quelque chose de mal dans votre réponse, et je n'ai jamais dit "aucun tri ne peut aider". J'ai dit qu'il y a des cas où il n'existe pas de solution correcte objective, donc évidemment une solution doit être trouvée en utilisant des règles arbitraires. Ce sont des déclarations complètement différentes.
Darkwings
3

Le tri des objets uniquement par profondeur a une valeur énorme, en particulier pour les architectures de rendu binning ou en mosaïque.

Triez les solides d'avant en arrière, les transparents d'arrière en avant.

Lors du rendu, les éléments les plus proches de la caméra et du solide sont rendus en premier, et tout autre élément occupant le même espace sera rejeté par une première vérification du tampon z.

Si l'architecture graphique a une sorte de tampon z hiérarchique ou basse résolution, la géométrie peut être éliminée avant même que quoi que ce soit soit rendu.

Jari Komppa
la source