2013-01-24 11 views
5

Qual è il modo migliore (memoria più bassa, velocità più veloce) per tessere un cubo? dopo un po 'ho trovare questa soluzione:Il modo migliore per strutturare un cubo in openGL

struct dati: la funzione

GLfloat Cube::vertices[] = 
{-0.5f, 0.0f, 0.5f, 0.5f, 0.0f, 0.5f, 0.5f, 1.0f, 0.5f, -0.5f, 1.0f, 0.5f, 
    -0.5f, 1.0f, -0.5f, 0.5f, 1.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, 1.0f, -0.5f, 0.5f, 1.0f, 0.5f, 
    -0.5f, 0.0f, -0.5f, -0.5f, 0.0f, 0.5f, -0.5f, 1.0f, 0.5f, -0.5f, 1.0f, -0.5f 
    }; 

GLfloat Cube::texcoords[] = { 0.0,0.0, 1.0,0.0, 1.0,1.0, 0.0,1.0, 
           0.0,0.0, 1.0,0.0, 1.0,1.0, 0.0,1.0, 
           0.0,0.0, 1.0,0.0, 1.0,1.0, 0.0,1.0, 
           0.0,0.0, 1.0,0.0, 1.0,1.0, 0.0,1.0 
          }; 

GLubyte Cube::cubeIndices[24] = {0,1,2,3, 4,5,6,7, 3,2,5,4, 7,6,1,0, 
            8,9,10,11, 12,13,14,15}; 

pareggio:

 glEnable(GL_TEXTURE_2D); 
     glBindTexture(GL_TEXTURE_2D, texture); 
     glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); 
     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 
     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 
     glColor3f(1.0f, 1.0f, 1.0f); 

     glEnableClientState(GL_TEXTURE_COORD_ARRAY); 
     glEnableClientState(GL_VERTEX_ARRAY); 

     glTexCoordPointer(2, GL_FLOAT, 0, texcoords); 
     glVertexPointer(3, GL_FLOAT, 0, vertices); 

     glDrawElements(GL_QUADS, 24, GL_UNSIGNED_BYTE, cubeIndices); 
     glDisableClientState(GL_VERTEX_ARRAY); 
     //glDisableClientState(GL_COLOR_ARRAY); 
     glDisable(GL_TEXTURE_2D); 

Come si può vedere il risultato è corretto: cube

ma per per questo risultato devo ridefinire qualche vertice (ci sono 16 punti 3D nell'array vertices) altrimenti la texture non riesce a mappare in e Funzione DrawElement.

Qualcuno conosce un modo migliore per strutturare un cubo in un array di vertici?

+3

perché hai bisogno della "memoria più veloce/più bassa", pensi di avere un miliardo di cubi sullo schermo? Inoltre, cosa intendi con "ridefinire qualche vertice"? –

+0

Dopo aver impostato le trame del cubo, il fps è diminuito (da 60 a 40). Ho ridefinito qualche vertice nella matrice dei "vertici", se guardi da vicino ci sono 16 punti (3D) in quella matrice, ma per definire un cubo 8 sono sufficienti. – Luca

+2

Allora stai facendo qualcosa di molto sbagliato e probabilmente non è il cubo, 8 o 16 vertici non faranno molta differenza. Considera anche che ogni vertice collega 3 facce e tutte hanno una diversa coordinata uv, hai bisogno di quei vertici "extra". Non sono sicuro, ma devi solo chiamare glTexParameteri una volta, quando crei la texture, se è sul tuo loop potrebbe essere il motivo del rallentamento. –

risposta

1

Mi sono imbattuto nello stesso problema un po 'di tempo fa con le opengl es. La mia ricerca indicava che non c'era altro modo di farlo perché ogni vertice poteva avere solo una coordinata della trama associata ad essa.

0

Bene, è possibile utilizzare le trame della mappa cubica in cui il vertex shader si prenderà cura delle coordinate della trama. Tutto quello che dovete fare per generare coordinate Tex è aggiungere questa riga nel vertex shader:

out vec2 texcoords; 
texcoords=normalize(vertex_data.xy) 

Non c'è bisogno di ridefinire i vertici, inoltre è possibile migliorare le prestazioni utilizzando oggetti vertex buffer.

+0

è presto per me l'uso di uno shader – Luca

+0

non ti capisco cosa intendi per "presto per me" ..? – debonair

+0

sono nuovo nel mondo openGl, sto solo imparando le basi – Luca

Problemi correlati