2017-07-18 1 views
0

Je suis le développement 3D Game avec le livre LWJGL d'Antonio Bejarano. J'ai atteint le point de pouvoir rendre un quad à l'écran. Après avoir implémenté le buffer d'index de vertex, un seul triangle du quad apparaît à l'écran, donc je pense qu'il est sûr de supposer que le problème est avec ce code.LWJGL Vertex Index Buffer provoque la moitié de "Mesh" à charger

 // Vertex Index Buffer 
     idxVboId = glGenBuffers(); 
     vertsIdxBuffer = MemoryUtil.memAllocInt(indices.length); 
     vertsIdxBuffer.put(indices).flip(); 
     glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,idxVboId); 
     glBufferData(GL_ELEMENT_ARRAY_BUFFER,vertsIdxBuffer,GL_STATIC_DRAW); 

Le code pour les sommets tampon et le tampon de couleur fonctionne, comme je l'ai supprimé les références à la mémoire tampon d'index et le quad complet apparaît. J'ai aussi changé la méthode render pour tenir compte du nouveau type à rendre:

shaderProgram.bind(); 

     //bind to vao 
     glBindVertexArray(mesh.getVaoId()); 
     //enable positions buffer 
     glEnableVertexAttribArray(0); 
     //enable colour buffer 
     glEnableVertexAttribArray(1); 

     //draw verts 
     glDrawElements(GL_TRIANGLES, 
     mesh.getVertexCount(),GL_UNSIGNED_INT,0); 

     //restore state (?) 
     glDisableVertexAttribArray(0); 
     glDisableVertexAttribArray(1); 
     glBindVertexArray(0); 

     shaderProgram.unbind(); 

Toutes les suggestions sont appréciés comme je l'ai été à regarder pendant des heures et ne peut pas vraiment voir où je l'ai fait l'erreur .

EDIT: Quad code Mesh

 renderer.init(); 

    float[] positions = new float[]{ 
      -0.5f, 0.5f, 0.0f, 
      -0.5f, -0.5f, 0.0f, 
      0.5f, 0.5f, 0.0f, 
      0.5f, 0.5f, 0.0f, 
      -0.5f, -0.5f, 0.0f, 
      0.5f, -0.5f, 0.0f, 
    }; 

    float[] colours = new float[]{0.5f,0f,0f,0f,0.5f,0f,0f,0f,0.5f,0f,0.5f,0.5f}; 

    int[] indices = new int[]{ 
      0, 1, 3, 3, 1, 2, 
    }; 

    mesh = new BMesh(positions,colours,indices); 

2ND Modifier Avant et après tableau des positions changement

Before

After

+0

Peut-être à cause de * backface-culling *? Avez-vous activé 'GL_CULL_FACE', et quelle convention avez-vous défini? (Voir https://www.khronos.org/opengl/wiki/Face_Culling). Indiquez également où et comment vous avez déclaré les données de quadrillage. – meowgoesthedog

+0

Merci pour votre réponse, je vais regarder à l'abattage maintenant, j'ai ajouté le code qui forme le quadrillage –

Répondre

0

Après avoir regardé à travers le code d'initialisation du maillage quad, il semble l'erreur est due aux sommets 3 et 2 sur le second quad étant le même sommet, c'est-à-dire les deux sont à (0.5, 0.5, 0.0). Peut-être avez-vous copié par erreur les 4e et 5e vertices de votre tableau?

dire peut-être que vous vouliez dire avoir

float[] positions = new float[]{ 
     -0.5f, 0.5f, 0.0f, 
     -0.5f, -0.5f, 0.0f, 
     0.5f, 0.5f, 0.0f, 
     0.5f, -0.5f, 0.0f 
}; 

EDIT: Vos indices semblent se tromper. Changez-les en { 0, 1, 3, 0, 3, 2 }

+0

J'ai joint deux photos pour vous montrer ce que l'altération que vous avez proposé a atteint. Il semble maintenant qu'il y ait deux triangles séparés, mais ils ne s'alignent plus, je pense que cela pourrait concerner les valeurs dans le tampon d'index qui ne sont pas alignées avec le nouveau tableau de positions. –

+0

@LiamDevlin oui parce que vos indices sont faux. Je vais mettre à jour la réponse – meowgoesthedog

+0

Merci beaucoup pour votre aide, cela a résolu le problème. Morale de l'histoire: vérifiez vos coordonnées: D –