10
votes

Opengles 2.0 Tampons séparés pour les sommets, couleurs et coordonnées de texture

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 toujours sont-elles répertoriées dans le même tableau (STRIT) que les positions de sommet? Comme: xxx

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 GLDRAWELS avec des tableaux séparés?

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.


0 commentaires

3 Réponses :


1
votes

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> xxx pré>

remplissage avec p> xxx pré>

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);
}    


3 commentaires

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.



21
votes

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);


0 commentaires

2
votes

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);


0 commentaires