2013-01-02 4 views
1

J'ai récemment résolu un problème qui a empêché mon éclairage de travailler dans une application iOS OpenGL ES:Multiple Vertex buffers OpenGL ES sur iOS

Solved Question

je résolu le problème en remplaçant

glEnable(GL_DEPTH_TEST); 
glGenVertexArraysOES(1, &_vertexArray); 
glBindVertexArrayOES(_vertexArray); 

glGenBuffers(1, &_vertexBuffer); 
glBindBuffer(GL_ARRAY_BUFFER, _vertexBuffer); 
glBufferData(GL_ARRAY_BUFFER, loader.currentCountOfVerticies * sizeof(GLfloat) * 3, arrayOfVerticies, GL_STATIC_DRAW); 

glEnableVertexAttribArray(GLKVertexAttribPosition); 
glVertexAttribPointer(GLKVertexAttribPosition, 3, GL_FLOAT, GL_FALSE, 12, BUFFER_OFFSET(0)); 

glGenVertexArraysOES(1, &_normalArray); 
glBindVertexArrayOES(_normalArray); 

glGenBuffers(1, &_normalBuffer); 
glBindBuffer(GL_ARRAY_BUFFER, _normalBuffer); 
glBufferData(GLKVertexAttribNormal, loader.currentCountOfNormals * sizeof(GLfloat) * 3,loader.arrayOfNormals , GL_STATIC_DRAW); 

glEnableVertexAttribArray(GLKVertexAttribNormal); 
glVertexAttribPointer(GLKVertexAttribNormal, 3, GL_FLOAT, GL_FALSE, 12, BUFFER_OFFSET(0)); 
glBindVertexArrayOES(0); 

avec

glEnable(GL_DEPTH_TEST); 

glGenVertexArraysOES(1, &_vertexArray); 
glBindVertexArrayOES(_vertexArray); 

glGenBuffers(1, &_vertexBuffer); 
glBindBuffer(GL_ARRAY_BUFFER, _vertexBuffer); 
glBufferData(GL_ARRAY_BUFFER, total * sizeof(GLfloat), mergedArray, GL_STATIC_DRAW); 

glEnableVertexAttribArray(GLKVertexAttribPosition); 
glVertexAttribPointer(GLKVertexAttribPosition, 3, GL_FLOAT, GL_FALSE, 24, BUFFER_OFFSET(0)); 
glEnableVertexAttribArray(GLKVertexAttribNormal); 
glVertexAttribPointer(GLKVertexAttribNormal, 3, GL_FLOAT, GL_FALSE, 24, BUFFER_OFFSET(12)); 

glBindVertexArrayOES(0); 

Combinaison du tableau de sommets et de norma ls à un seul tableau GLfloat et en passant ce tableau à un seul tampon. Cela a résolu mon problème, mais je ne comprends pas pourquoi. À ma connaissance, j'aurais pu utiliser 2 tampons?

+0

Il semble que vous n'avez pas de réponse à votre question initiale, encore. –

+0

duplication possible de [l'éclairage GL ES 2.0 ne fonctionne pas dans l'application iOS] (http://stackoverflow.com/questions/14103464/open-gl-es-2-0-lighting-not-working-in-ios-app –

+0

Par souci de propreté (et même si cela signifie sacrifier le représentant que je pourrais gagner;)) Je vous suggère de supprimer cette question, car j'ai copié ma réponse (soi-disant correcte) à la question initiale, qui n'était pas t résolu du tout. –

Répondre

5

Le problème n'était pas l'utilisation de plusieurs tampons de vertex, mais l'utilisation de plusieurs objets de tableau de vertex. Un objet de tableau de vertex (VAO) est un objet léger (ce qui signifie qu'il ne contient pas de sommet réel des données d'attributs) enrobant tout l'état requis pour le rendu d'un tas de tableaux de sommets avec un seul appel de tirage, en particulier

  • les réglages effectués avec glVertexAttribPointer pour chaque index d'attribut
  • les tableaux d'attributs activés
  • le tampon de matrice élément lié

Il est donc un niveau plus élevé que le sommet individuel attribut réseaux, comprenant tout le sommet attr paramètres de tableau ibute d'un seul objet de scène (conceptuel), ou plus correctement, un seul appel draw.

Mais dans votre code d'origine, vous créez un nouvel objet tableau de vertex pour chaque attribut individuel. Lorsque vous effectuez ensuite le rendu, vous liez uniquement _vertexArray, qui à son tour ne définit et active que l'attribut GLKVertexAttribPosition, donc pas de normales ou quoi que ce soit d'autre.

vous devriez donc avoir plutôt remplacé le code original avec:

glGenVertexArraysOES(1, &_vertexArray); 
glBindVertexArrayOES(_vertexArray); 

glGenBuffers(1, &_vertexBuffer); 
glBindBuffer(GL_ARRAY_BUFFER, _vertexBuffer); 
glBufferData(GL_ARRAY_BUFFER, loader.currentCountOfVerticies * sizeof(GLfloat) * 3, arrayOfVerticies, GL_STATIC_DRAW); 

glEnableVertexAttribArray(GLKVertexAttribPosition); 
glVertexAttribPointer(GLKVertexAttribPosition, 3, GL_FLOAT, GL_FALSE, 12, BUFFER_OFFSET(0)); 

//this is the error 
//glGenVertexArraysOES(1, &_normalArray); 
//glBindVertexArrayOES(_normalArray); 

glGenBuffers(1, &_normalBuffer); 
glBindBuffer(GL_ARRAY_BUFFER, _normalBuffer); 
glBufferData(GLKVertexAttribNormal, loader.currentCountOfNormals * sizeof(GLfloat) * 3,loader.arrayOfNormals , GL_STATIC_DRAW); 

glEnableVertexAttribArray(GLKVertexAttribNormal); 
glVertexAttribPointer(GLKVertexAttribNormal, 3, GL_FLOAT, GL_FALSE, 12, BUFFER_OFFSET(0)); 

glBindVertexArrayOES(0);