2011-01-02 3 views
0

J'ai une pyramide qui a 5 vertex et 18 indices. Comme je veux ajouter des normales à chaque face, je viens de trouver une solution pour des normales pour chaque sommet. Cela signifie que je ne peux pas utiliser d'index pour définir ma pyramide. J'ai besoin d'avoir 18 vertex (et 3 fois le même sommet pour le même point dans l'espace).Normales par index?

Il doit y avoir une solution pour utiliser des normales non sur la base vertex mais sur la base d'index.

Certains code (javascript):

var vertices = [ 
    -half, -half, half, // 0 front left 
    half, -half, half, // 1 front right 
    half, -half, -half, // 2 back right 
    -half, -half, -half, // 3 back left 
     0.0, Math.sqrt((size * size) - (2 * (half * half))) - half, 0.0 // 4 top 
]; 

var vertexNormals = [ 
    // front face 
    normaleFront[0], normaleFront[1], normaleFront[2], 
    normaleFront[0], normaleFront[1], normaleFront[2], 
    normaleFront[0], normaleFront[1], normaleFront[2], 

    // back face 
    normaleBack[0], normaleBack[1], normaleBack[2], 
    normaleBack[0], normaleBack[1], normaleBack[2], 
    normaleBack[0], normaleBack[1], normaleBack[2], 

    // left face 
    normaleLeft[0], normaleLeft[1], normaleLeft[2], 
    normaleLeft[0], normaleLeft[1], normaleLeft[2], 
    normaleLeft[0], normaleLeft[1], normaleLeft[2], 

    // right face 
    normaleRight[0], normaleRight[1], normaleRight[2], 
    normaleRight[0], normaleRight[1], normaleRight[2], 
    normaleRight[0], normaleRight[1], normaleRight[2], 

    // bottom face 
    0.0, -1.0, 0.0, 
    0.0, -1.0, 0.0, 
    0.0, -1.0, 0.0, 
    0.0, -1.0, 0.0, 
    0.0, -1.0, 0.0, 
    0.0, -1.0, 0.0, 
]; 

var pyramidVertexIndices = [ 
    0, 1, 4, // Front face 
    2, 3, 4, // Back face 
    3, 0, 4, // Left face 
    1, 2, 4, // Right face 
    0, 1, 2, 2, 3, 0, // Bottom face 
]; 
+0

Juste pour ajouter: il ne peut pas être fait ... ce qui peut être fait est de créer un second réseau rempli avec le sommet de l'ordre et la dimension du tableau d'index. .. donc vous pouvez changer un sommet et il sera changé à tous les endroits dans le deuxième tableau généré – WarrenFaith

Répondre

1

Chaque sommet d'une pyramide a trois normales différentes, en fonction du visage il appartient. Donc, vous devez passer chacun des sommets trois fois, chaque fois avec une normale différente, pour utiliser glDrawElements.

Sinon, vous pouvez appeler

// Face 1 
glNormal 
glVertex 
glVertex 
glVertex

// Face 2 glNormal glVertex glVertex glVertex

// ...

+0

N'est-ce pas l'idée des indices de les utiliser pour pointer sur le même sommet au lieu de créer le même sommet encore et encore? J'ai besoin d'une possibilité de définir une normale pour un index et non pour le vertex. Je veux utiliser les indices pour réduire le nombre de sommets ... – WarrenFaith

+1

Ceci est bien expliqué ici: http://stackoverflow.com/questions/1664402/how-can-i-specify-per-face-colors-when- using-indexed-vertex-arrays-in-opengl-3-x-a Vertex est un ensemble d'attributs de vertex - tous les attributs, pas seulement la position. Vous ne pouvez pas les mélanger et les faire correspondre à plusieurs endroits, ce n'est pas comme cela que le GPU fonctionne en interne. –