Question

Je travaille actuellement sur un outil de génération de planète procédure qui fonctionne en prenant un cube, la plaquant sur une sphère, puis l'application d'un heightmap sur chaque face pour générer terrain.

J'utilise un VBO pour chaque face qui est créée en utilisant la méthode suivante:

void Planet::setVertexBufferObject()
{
 Vertex* vertices;
 int currentVertex;
 Vertex* vertex;

 for(int i = 0; i < 6; i++)
 {
  // bottom face
  if(i == 0)
  {
   glBindBuffer(GL_ARRAY_BUFFER, bottomVBO);    
  }
  // top face
  else if(i == 1)
  {
   glBindBuffer(GL_ARRAY_BUFFER, topVBO);    
  }
  // front face
  else if(i == 2)
  {
   glBindBuffer(GL_ARRAY_BUFFER, frontVBO);    
  }
  // back face
  else if(i == 3)
  {
   glBindBuffer(GL_ARRAY_BUFFER, backVBO);    
  }
  // left face
  else if(i == 4)
  {
   glBindBuffer(GL_ARRAY_BUFFER, leftVBO);    
  }
  // right face
  else
  {
   glBindBuffer(GL_ARRAY_BUFFER, rightVBO);    
  } 

  vertices = (Vertex*)glMapBuffer(GL_ARRAY_BUFFER, GL_WRITE_ONLY);

  currentVertex = 0;

  for(int x = 0; x < size; x++)
  {
   for(int z = 0; z < size; z++)
   {
    currentVertex = z * size + x;

    vertex = &vertices[currentVertex];

    vertex->xTextureCoord = (x * 1.0f) / 512.0f;
    vertex->zTextureCoord = (z * 1.0f) / 512.0f;

    Vector3 normal;

    vertex->xNormal = normal.x;
    vertex->yNormal = normal.y;
    vertex->zNormal = normal.z;

    vertex->x = heightMapCubeFace[i][x][z][0];
    vertex->y = heightMapCubeFace[i][x][z][1];
    vertex->z = heightMapCubeFace[i][x][z][2];

    vertex->x *= (1.0f +((heightMaps[i][z][x]/256.0f) * 0.1));
    vertex->y *= (1.0f +((heightMaps[i][z][x]/256.0f) * 0.1));
    vertex->z *= (1.0f +((heightMaps[i][z][x]/256.0f) * 0.1));
   }
  }
  glUnmapBuffer(GL_ARRAY_BUFFER);
  glBindBuffer(GL_ARRAY_BUFFER, 0);
 }
}

Je l'ai laissé la méthode setIndexBufferObject () comme ce fonctionne OK.

Je suis rendu alors la sphère en utilisant cette méthode:

void Planet::render()
{
    // bottom face

    glBindBuffer(GL_ARRAY_BUFFER, bottomVBO);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, bottomIBO);

    glEnableClientState(GL_TEXTURE_COORD_ARRAY);
    glTexCoordPointer(2, GL_FLOAT, sizeof(Vertex), BUFFER_OFFSET(6 * sizeof(float)));

    glEnableClientState(GL_NORMAL_ARRAY);
    glNormalPointer(GL_FLOAT, sizeof(Vertex), BUFFER_OFFSET(3 * sizeof(float)));

    glEnableClientState(GL_VERTEX_ARRAY);
    glVertexPointer(3, GL_FLOAT, sizeof(Vertex), BUFFER_OFFSET(0));

 TextureManager::Inst()->BindTexture(textueIDs[0]);
 glClientActiveTexture(GL_TEXTURE0+textueIDs[0]);
 glDrawElements(GL_TRIANGLE_STRIP, numberOfIndices, GL_UNSIGNED_INT, BUFFER_OFFSET(0)); 

    glDisableClientState(GL_VERTEX_ARRAY);
    glDisableClientState(GL_NORMAL_ARRAY);
    glDisableClientState(GL_TEXTURE_COORD_ARRAY);

    glBindBuffer(GL_ARRAY_BUFFER, 0);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);

 // next face and so on...

Les textures sont chargées dans l'utilisation de l'image libre, comme vous pouvez le voir dans le code ci-dessus, je suis juste en utilisant le gestionnaire de texture exemple fourni avec FreeImage.

Pourquoi lie la texture ne fonctionne pas?

Était-ce utile?

La solution

  

Pourquoi lie la texture ne fonctionne pas?

La description très précisément le comportement que vous voyez, ou mieux attacher une URL à une capture d'écran, va un long chemin en essayant de passer à travers des questions graphiques.

Ensuite, vous devez inclure l'état d'erreur de gl ou au moins démontrer que dans le code que vous vérifiez et à défaut si glGetError () ne retourne pas GL_NO_ERROR.

Votre état d'élément VBO / tirage semble raisonnable si vous avez délibérément omis de la définition de l'objet tampon d'index de sorte que nous allons le prendre sur la foi que vous envoyez des indices réels dans vos glDrawElements () appel. Pour un contrôle de santé d'esprit, faire les glDrawElements () appel avec les indices bruts pointer plutôt que la liaison d'un VBO pour les éléments.

Vous avez également omis la définition du type de Vertex qui est nécessaire pour savoir si les compensations que vous fournissez des à glTexCoordPointer () sont conformes à la définition struct.

Enfin, je suppose que la plupart des gens du forum ne sais pas « l'image libre » que je crois est ce que vous avez dit que vous utilisez pour charger des textures avec. S'il y a un problème de texturation il est impossible de voir à cause de la nature opaque de l'utilisation de cette bibliothèque 3ème partie à mettre en place texturation en votre nom.

S'ils ont confondu les ID de texture, mis en place un mode d'emballage non pris en charge, pas régler le filtre minification compatible avec le mipmapping prévu (on / off), non activé texturation, ou définir le mode de l'environnement de texture telle que la modulation avec la couleur de la géométrie de base est pas comme prévu -. tout cela ferait texturation pas de travail / semblent travailler

Pour résoudre il suffit d'utiliser la bibliothèque pour la charge de la texture et utiliser l'ID de texture qu'ils fournissent. Ensuite, mettre en place les modes de filtre et la texture environnement vous-même. Éteignez mipmapping lors du dépannage. Incomplètes chaînes mipmap est une erreur très fréquente quand texturation.

Vous pouvez également désactiver les opérations par fragment pour simplifier votre dépannage. mélange Désactiver, le test de profondeur et scissoring.

En supposant que votre texture est puissance de deux dimensions ou votre implémentation prend en charge NPOT, essayez ces paramètres immédiatement avant de tirer:

glDisable (GL_DEPTH_TEST);
glDisable (GL_BLEND);
glDisable (GL_SCISSOR_TEST);
glColor4f (1.0f, 1.0f, 1.0f, 1.0f);
glBindTexture (GL_TEXTURE_2D, texid);
glTexEnvi (GL_TEXTURE_ENV_MODE, GL_REPLACE); // désactiver la modulation
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); // désactiver mipmapping
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); // désactiver le répète
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);

Autres conseils

glClientActiveTexture(GL_TEXTURE0+textueIDs[0]);

Qu'est-ce que vous essayez de faire ici?

L'unité de texture actif n'a rien à voir avec un objet de texture aléatoire.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top