2012-04-23 3 views
2

Je complète un analyseur d'objet de front d'onde et je veux l'utiliser pour construire des objets maillés génériques. Mon moteur utilise OpenGL 4 et les shaders pour tout dessiner dans mon moteur.Rendu d'un maillage dans OpenGL comme une série de sous-groupes?

Ma question est de savoir comment assurer la meilleure efficacité de rendu pour le rendu d'un maillage.

Un wavefront .obj file a normalement plusieurs sous-groupes d'objets spécifiés.

Un sous-groupe peut se voir attribuer un matériau spécifique (par exemple une couleur rouge brillant). Par conséquent, un maillage peut être une collection assez complexe de sous-groupes, chacun ayant son propre matériau affecté.

Mes questions sont -

Q. Dois-je dessiner chaque sous-groupe séparément par exemple avec un appel à glDrawElements pour chaque sous-groupe? (Donc, si j'avais 4 sous-groupes, je dois faire quatre appels glDrawElements, invoquant ainsi le shader 4 fois avec 4 changements uniformes (pour les matériaux/textures) séparées)

glDrawElements(GL_TRIANGLES, nNumIndicesInGroup, GL_UNSIGNED_INT, ((char*)NULL)+ first-vertex-offset); 

Si cela est correct , alors je vais devoir calculer:

les indices dans chaque sous-groupe (ce qui implique un tableau d'index séparé et VAO pour chaque sous-groupe) le sommet de décalage du début du sous-groupe

Cela semble terriblement inefficace, est-ce que j'aboie le mauvais arbre?

En outre, à partir du Wavefront obj wiki page:

Smooth shading across polygons is enabled by smoothing groups. 
s 1 
... 
    # Smooth shading can be disabled as well. 
    s off 
    ... 

Quelqu'un peut-il suggérer ce que les valeurs d'ombrage lisse indiquent? Par exemple. s1, s2, s4 etc.

+1

Cette question, comme indiqué, ne peut pas être répondue sans en savoir plus sur ce que sont les données de vertex et ce que vous allez faire avec. Des questions telles que les matériaux, les shaders, etc. ont un impact sur les performances. –

Répondre

9

Oui, vous devez dessiner chaque sous-groupe séparément des autres. Ceci est requis jusqu'à ce que l'état soit différent entre les sous-groupes.

Mais vous faites un pas trop long.

Pour éviter les appels multiples, vous pouvez introduire un attribut vertex indiquant un index utilisé pour accéder à des valeurs de tableau uniformes (tableau de matériaux, tableau de textures). De cette façon, vous n'avez besoin que d'un seul appel draw, mais vous aurez le coût d'un attribut supplémentaire et sa gestion relative.

Je voudrais éviter l'approche ci-dessus. Que faire si un sous-groupe est texturé et un autre pas? Comment faites-vous la distinction entre texturer ou non? Présentation d'autres attributs? Cela semble confus.

Le premier point est que la gestion des objets-tampons est très flexible. En effet, vous pouvez avoir un seul objet tampon élément et un seul objet tampon vertex: en utilisant les offsets et l'entrelacement, vous pouvez satisfaire tous les niveaux de complexité. Et puis, sur un harware moderne, en utilisant des objets de tableau de vertex, vous pouvez minimiser le coût des différentes liaisons de tampon.

Le deuxième point est que votre logiciel peut regrouper différents sous-groupes ayant le même état uniforme, en joignant plusieurs appels de tirage en un seul. Souvenez-vous que vous pouvez utiliser les variantes de points d'entrée Multi, et il y a aussi le redémarrage de la primitive qui peut vous aider (dans le cas des primitives dépouillées).

D'autres considérations ne sont pas utiles, car vous devez dessiner quand même, que ce soit complexe ou non. Successivement, lorsque vous avez un rendu correct, vous pouvez profiler l'application et le rendu, en coupant les points chauds. Les groupes de lissage sont une collection de sommets partageant le même attribut d'option (normales, coordonnées de texture). C'est le cas des sommets indexés par des éléments.

Pour approfondir le sujet, lisez l'un des specification trouvé par googling.

+0

Salut, merci pour votre réponse, quand j'obtiens les 15 points de réputation requis, je vais augmenter votre réponse. – fishfood