Rendu des maillages avec plusieurs indices

J'ai des données de sommet. Positions, normales, coordonnées de texture. Je l'ai probablement chargé à partir d'un .fichier obj ou un autre format. Peut-être que je dessine un cube. Mais chaque morceau de données de sommet a son propre index. Puis-je rendre ces données de maillage en utilisant OpenGL/Direct3D?

47
demandé sur Nicol Bolas 2012-06-22 04:05:01

1 réponses

Dans le sens le plus général, non. OpenGL et Direct3D n'autorisent qu'un seul index par Sommet; l'index récupère à partir de chaque flux de données de sommet. Par conséquent, chaque combinaison unique de composants doit avoir son propre index.

Donc, si vous avez un cube, où chaque face a sa propre normale, vous devrez répliquer la position et les données normales beaucoup. Vous aurez besoin de 24 positions et 24 normales, même si le cube n'aura que 8positions uniques et 6 positions uniques normal.

Votre meilleur pari est d'accepter simplement que vos données seront plus grandes. Un grand nombre de formats de modèle utiliseront plusieurs indices; vous devrez réparer ces données de sommet avant de pouvoir les rendre. De nombreux outils de chargement de maillage, tels que Open Asset Importer, effectueront cette correction pour vous.

GL 3.x et D3D10

Pour D3D10 / OpenGL 3.matériel de classe x, il est possible d'éviter d'effectuer la correction et d'utiliser plusieurs attributs indexés directement. Cependant, soyez informé que cela diminution probable des performances de rendu.

La discussion suivante utilisera la terminologie OpenGL, mais Direct3D v10 et supérieur a des fonctionnalités équivalentes.

L'idée est d'accéder manuellement aux différents attributs de vertex à partir du vertex shader. Au lieu d'envoyer les attributs de sommet directement, les attributs qui sont passés sont en fait les indices pour ce sommet particulier. Le vertex shader utilise ensuite les indices pour accéder à l'attribut réel via un ou plusieurs textures de tampon .

Les attributs peuvent être stockés dans plusieurs textures de tampon ou tous dans un seul. Si ce dernier est utilisé, le shader aura besoin d'un décalage à ajouter à chaque index afin de trouver l'index de début de l'attribut correspondant dans le tampon.

Les attributs de sommet réguliers peuvent être compressés de plusieurs façons. Les textures tampons ont moins de moyens de compression, permettant seulement un nombre relativement limité de formats de vertex (via les formats d'image, ils soutien).

Veuillez noter à nouveau que l'une de ces techniques peut diminuer les performances globales de traitement des sommets. Par conséquent, il ne doit être utilisé que dans les circonstances les plus limitées en mémoire, après que toutes les autres options de compression ou d'optimisation ont été épuisées.

OpenGL ES 3.0 fournit également des textures de tampon. Les versions OpenGL supérieures vous permettent de lire les objets tampon plus directement via Ssbo plutôt que les textures de tampon, qui pourraient avoir de meilleures performances caractéristique.

62
répondu Nicol Bolas 2018-05-16 01:38:44