Comment puis-je spécifier les faces des couleurs lors de l'utilisation de indexés vertex arrays en OpenGL 3.x?
J'essaie de rendre un cube à l'aide d'un tableau de 8 sommets et un index de tableau de 24 (4*
6) les indices dans le vertex array. Mais comment puis-je spécifier par face variables, comme les couleurs et les normales sans l'aide obsolète fonctions? Pour cela, j'ai besoin d'un ensemble d'indices, mais quand j'ai spécifier deux index-tableaux (GL_ELEMENT_ARRAY_BUFFERs
) et point à un autre shader-variables (avec deux appels à glVertexAttribPointer) quelque chose va mal, et il ne rend pas du tout (mais ne pas signaler toute erreur soit vérifiée auprès de glGetError). Dois-je utiliser différents appels à glDrawElements pour chaque face, avec la couleur et la normale chargé dans l'uniforme des variables?
Pour clarifier, le problème se pose lorsque chacun des 8 sommets font partie de visages différents et ont besoin de différentes valeurs de la couleur et de la normale.
Vous devez vous connecter pour publier un commentaire.
La réelle première réponse à:
Voir Goz réponse. 24 distinct des sommets.
Certains nomenclature deuxième:
Un Sommet est un ensemble de sommet attributs. Merci de garder cette distinction à l'esprit lors de la lecture de ce qui suit:
Vous avez une idée fausse de croire que l'utilisation d'Api obsolète serait de vous aider à résoudre le problème. Ce n'est pas le cas. OpenGL gère (et a toujours) chaque sommet comme un unique ensemble d'attributs. Si vous lisez l'original spec attentivement, vous remarquerez que lorsque vous faites:
La spécification indique clairement que
glNormal
définit lacurrent normal state
, et queglVertex
provoque un nouveau sommet, la copie en passant tous lescurrent state
, y compris lacurrent normal state
. Qui est, même si vous avez passé une seule Normale, le GL voit encore 3.Le GL, par conséquent, n'ont pas de "faces" des attributs.
Aussi, vous êtes de mélange index des tableaux
GL_ELEMENT_ARRAY_BUFFER
, qui sont utilisés à partir deglDrawElements(..., pointer)
, oùpointer
est un décalage à l'intérieur de l'index de tableau, et vertex attribut tableauxGL_ARRAY_BUFFER
, qui sont utilisés à partir deglVertexAttribPointer
(et tous les dépréciéglVertexPointer/glNormalPointer
...Chaque index est l'index de la mémoire tampon sera utilisé comme un index dans chacun des attributs, mais vous ne pouvez spécifier qu'un seul indice pour chaque sommet. Ainsi, le réglage de
GL_ELEMENT_ARRAY_BUFFER
et puis l'appel deglVertexAttribPointer
n'est pas du tout ce que vous pensez que cela fonctionne. Il utilise le dernier tableau que vous définissez àGL_ARRAY_BUFFER
pour la définition des vertex attributs, ou si vous n'avez pas à garder un bond, est l'interprétation de votre décalage comme un pointeur (et sera susceptible de se bloquer).Ce que vous essayiez de faire, la définition d'un indice de tableau pour chaque sommet attribut n'est pas pris en charge par GL. Permettez-moi de reformuler ce: vous avez seulement 1 indice de tableau par tirage.
Quelques autres bribes de l'histoire enclined:
glVertex est un peu un abus de langage. Il indique que le Sommet position. Mais, et c'est ce qu'il tire son nom, il provoque également un sommet à être transmis à la GL. Pour l'API d'être complètement propre, vous aurait pu imaginer avoir à faire 2 appels:
Toutefois, lorsque GL a d'abord été spécifié, la Position a toujours été nécessaire, afin de fusion de ces 2 à provoquer un sommet de sens (si ce n'est de réduire l'appel d'API comte).
Avance rapide à
vertex_program_arb
: Essayer de s'éloigner de la fonction de modèle, tout en restant compatible signifiait que la nature particulière de glVertex a dû être reporté. Ce résultat a été obtenu en faisant lavertex attribute 0
provoquer, et synonyme de glVertex.Avance rapide de GL3.2: au début/Fin modèle est allé, et tout cela spécification de ce que provoque un sommet peut enfin de s'en aller, ainsi que la gestion de la
current state
. Toutes peuvent la sémantique de l'Api (l'glVertex*, glNormal*...), depuis toutes les entrées sont juste vertex attributs maintenant.Les gens intéressés à savoir si l'utilisation des index de tableau ou non, peut trouver une certaine utilité dans un schéma que j'ai créé pour résumer graphiquement le comportement des différents appels OpenGL, de sorte que vous pouvez voir, par exemple, ceux qui dessiner des blocs contigus de vertex, par rapport à ceux qui 'sauter' a l'aide des indices.
.
J'ai publié cette image sous licence Creative Commons BY-SA, comme l'a fait remarquer cette source.
Intéressantes explications, mais ils semblent occulter le fait que la question d'origine contient sa propre réponse: "Dois-je utiliser différents appels à glDrawElements pour chaque face, avec la couleur et la normale chargé dans l'uniforme des variables?" - Si le fait de nourrir le même sommet, les données de position pour le processeur graphique à trois reprises, une fois devrait suffire offense son sens de l'esthétique (et devrait) alors c'est oui.
L'original interlocuteur ne veut pas savoir que OpenGL peut pas faire ce qu'il essaie de faire, et qu'il doit maintenir les vingt-quatre sommets d'un cube à la fois mathématiques standard et le bon sens nous disent ne devrait avoir besoin que de huit ans. Il sait déjà qu'il PEUT faire ce qu'il veut, et il sait même comment. Il veut juste la confirmation que son approche proposée n'a effectivement un sens, et qu'il n'y a pas une meilleure façon de le faire qu'il a négligé.
Faire des appels pour chaque face ne ajouter une surcharge de son propre, mais ce n'est guère important lors de l'élaboration de juste un seul cube. Lors de l'élaboration de nombreux, tout de même-l'attribut visages peuvent être regroupées, par exemple, tout le Sud alors que l'Occident, ou tout le rouge, puis tout le vert, ou quoi que ce soit.
Vous avez besoin de plus de 8 sommets. Verts peuvent partager des postes, mais à moins que tout le reste dans le sommet est unique, il n'est pas un unique sommet. Les normales est un autre classique de raison d'avoir besoin de plus de 8 verts dans une définition de cube.
En OpenGL 3.x vous avez accès à type interpolation qualificatifs. À l'aide de la
flat
qualificatif, vous pourrait forcer l'utilisation de la variable passée par la provoquant vertex seulement. Dans certains cas, cela devrait être assez pour faire ce que vous voulez, mais a l'inconvénient que vous devez payer une attention particulière à l'ordre dans lequel vous dessinez les sommets.