J'apprends OpenGL pendant quelques jours maintenant en suivant certains tutoriels et en codant quelques expériences de mienne. Mais il y a une chose que je ne comprends vraiment pas qui me bloque de continuer. J'ai été googling pendant quelques heures maintenant et je n'ai pas encore trouvé de réponse à ma question.
Où dois-je spécifier toutes les coordonnées de la valeur de couleur et de la texture séparées pour chaque sommet? Ces propriétés ou existe-t-il un moyen de mettre des valeurs de couleur et des coordonnées de texture dans des tableaux séparés? Mais ensuite, la question se pose: comment appelle-t-je Si vous vous demandez pourquoi je souhaite séparer ces valeurs: je fais actuellement la mienne. OBJ Parser à Obj-C et je me demandais: Que si vous chargez un modèle sans texture et que vous voulez seulement montrer une couleur sur l'objet? Ou: Et si vous voulez charger un modèle avec une seule texture mappée, mais aucune couleur séparée par sommet? Et: ne mett pas la coordonnée de la couleur et la texture bloquant la struct Vertex avec trop de données. P> p> GLDRAWELS code> avec des tableaux séparés? P>
3 Réponses :
Vous pouvez les séparer dans des sous-tampons, mais si vous les utilisez, vous devez les avoir pour tous les sommets et si vous utilisez des tampons d'index, vous devez utiliser une tampon d'index pour tous (position, couleur, texcoord , etc). Voici quelques extraits de mon code:
allocation avec p> remplissage avec p> et utilisation avec ceci ( Je ne pense pas constamment à changer de clienttate, c'est la meilleure pratique) P> void Vbo::draw(GLenum primMode)
{
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(mVertexComponents, GL_FLOAT, 0, (void*)mVertexOffset);
if(mNormalBlockSize){
glEnableClientState(GL_NORMAL_ARRAY);
glNormalPointer(GL_FLOAT, 0, (void*)mNormalOffset);
}
if(mColorBlockSize){
glEnableClientState(GL_COLOR_ARRAY);
glColorPointer(mColorComponents, GL_FLOAT, 0, (void*)mColorOffset);
}
if(mTexCoordBlockSize){
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glTexCoordPointer(mTexCoordComponents, GL_FLOAT, 0, (void*)mTexCoordOffset);
}
if (mAttachedIndexBuffer)
{
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, mAttachedIndexBuffer);
glDrawElements(primMode,
mAttachedIndexBuffer->getNumberOfStoredIndices(),
mAttachedIndexBuffer->getDataType(),
0);
}
else
{
glDrawArrays(primMode, 0, mNumberOfStoredVertices);
}
if(mTexCoordBlockSize)
{
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
}
if(mColorBlockSize)
{
glDisableClientState(GL_COLOR_ARRAY);
}
if(mNormalBlockSize)
{
glDisableClientState(GL_NORMAL_ARRAY);
}
glDisableClientState(GL_VERTEX_ARRAY);
}
Ne répond pas vraiment à la question si vous pouvez stocker différents attributs dans des tampons complètement différents, que vous pouvez définitivement.
Ma faute. Je ne pensais tout simplement pas qu'il y avait une différence significative entre l'utilisation de sous-tampons et des tampons complètement séparés pour son objectif, comme ils seraient alloués ensemble, traités ensemble et toujours utilisés ensemble s'ils contiennent des données différentes pour le même objet.
En effet vrai, mais il a toujours posé une question à répondre à une question.
En réalité, il est le moyen habituel de séparer les données de sommet en position, la couleur, etc. à l'aide de plusieurs tableaux / tampons.
La dernière fois que je suis entré en contact avec ES 2.0 était dans le contexte de Webgl (qui est un Spécification légèrement différente mais est finalement basée sur ES 2.0). P>
Qu'est-ce que c'est fondamentalement fait est d'écrire les données sur des tampons séparés à l'aide de P>
glDrawElements(GL_TRIANGLES, indexCount, GL_UNSIGNED_SHORT, indices);
Vous pouvez bien sûr avoir vos données dans différents tampons. Gardez à l'esprit que c'est le GlvertExAtTribpoinger code> appel qui détermine la source d'un attribut. Donc, d'utiliser un tampon différent pour un attribut, liez simplement un autre
GL_ARRAY_BUFFER code> avant d'appeler
GLVERXATRIBPoinger code>.
GLDRAWELESSES CODE> n'a rien à voir avec IT:
glVertexAttribPointer(0, ..., positionArray);
glEnableVertexAttribArray(0);
glVertexAttribPointer(1, ..., colorArray);
glEnableVertexAttribArray(1);
glDrawElements(..., indexArray);
glDisableVertexAttribArray(0);
glDisableVertexAttribArray(1);