Le rendu des mailles avec de multiples indices
J'ai quelques vertex. Les Positions, les normales, les coordonnées de texture. J'ai probablement chargé depuis un .obj fichier ou dans un autre format. Je suis peut-être le dessin d'un cube. Mais chaque morceau de vertex a son propre index. Puis-je rendre ce maillage de données en utilisant OpenGL/Direct3D?
Vous devez vous connecter pour publier un commentaire.
Dans le sens le plus général, non. OpenGL et Direct3D seulement permettre un index par vertex; l'index extrait de chaque flux de vertex. Par conséquent, chaque combinaison unique de composants doit avoir son propre index.
Donc si vous avez un cube, où chaque face a ses propres normal, vous devrez reproduire la position et des données normales beaucoup. Vous aurez besoin de 24 positions et 24 normales, même si le cube aura seulement 8 unique positions et 6 unique normales.
Votre meilleur pari est de tout simplement accepter que vos données seront plus grandes. Un grand nombre de modèle de formats utiliser plusieurs indices; vous aurez besoin de la correction de ce sommet de données avant de vous rendre avec elle. De nombreux filet de chargement d'outils, telles que l'ouverture de l'Actif de l'Importateur, va effectuer cette correction pour vous.
GL 3.x et D3D10
Pour D3D10/OpenGL 3.x-matériel de classe, il est possible d'éviter d'effectuer la correction et l'utilisation de plusieurs attributs indexés directement. Toutefois, sachez que ce sera probablement diminuer les performances de rendu.
La discussion qui va suivre va utiliser l'OpenGL terminologie, mais Direct3D v10 et ci-dessus a des fonctionnalités équivalentes.
L'idée est d'accéder manuellement les différents sommet des attributs à partir du vertex shader. Au lieu d'envoyer le sommet des attributs directement, les attributs qui sont passés sont en fait les indices pour que le vertex. Le vertex shader utilise ensuite les indices pour accéder à la véritable attribut par une ou plusieurs tampon de textures.
Attributs peuvent être stockées dans de multiples tampon de textures ou de tous dans un. Si ce dernier est utilisé, alors le shader aurez besoin d'un décalage à ajouter à chaque indice pour trouver l'attribut correspondant de l'index de début de la mémoire tampon.
Régulière de sommet attributs peuvent être compressés dans de nombreuses façons. Tampon de textures ont moins de moyens de compression, ce qui permet qu'un nombre relativement nombre limité de vertex formats (via les formats d'image qu'ils soutiennent).
Veuillez noter encore que l'une de ces techniques peuvent diminution globale de vertex performances de traitement. Par conséquent, il doit être utilisé uniquement dans le plus de mémoire limité de circonstances, après que toutes les autres options de compression ou d'optimisation ont été épuisés.
OpenGL ES 3.0 fournit tampon de textures et de. Plus les versions d'OpenGL de permettre la lecture de la mémoire tampon des objets plus directement via SSBOs plutôt que de la mémoire tampon de textures, ce qui pourrait avoir de meilleures caractéristiques de performance.
J'ai trouvé un moyen qui permet de réduire ce genre de répétition, qui fonctionne un peu contrairement à certaines déclarations faites dans l'autre réponse (mais ne répond à la question posée ici). Il n'est toutefois adresse ma question qui a été pensé pour être une répétition de cette question.
Je viens d'apprendre sur Interpolation qualificatifs. Spécifiquement "à plat". C'est ma compréhension que le fait de mettre le plat qualificatif sur votre vertex shader de sortie ne provoque que la provoquant vertex à transmettre les valeurs pour le fragment shader.
Cela signifie pour la situation décrite dans cette citation:
Vous pouvez avoir 8 points, 6 qui contient l'unique normales et de 2 les valeurs normales sont pas pris en compte, aussi longtemps que vous soigneusement commander votre primitives des indices tels que la "provocation vertex" contient les données normales que vous souhaitez appliquer à l'ensemble du visage.
EDIT: Ma compréhension de la façon dont il fonctionne: