rendering 3D di nuvole di punti da x, y, z array 2d con texture

2

Serve una certa direzione per la visualizzazione della nuvola di punti 3d usando OpenGL in c ++ (vs2008). Sono nuovo di zecca per OpenGL e sto provando a fare una visualizzazione a nuvola di punti 3d con una texture. Ho 3 matrici 2D (ciascuna delle stesse dimensioni 1024x512) che rappresentano x, y, z di ogni punto. Penso di essere sulla strada giusta con

glBegin(GL_POLYGON);
 for(int i=0; i<1024; i++)
 {
      for(int j=0; j<512; j++)
      {
            glVertex3f(x[i][j], y[i][j], z[i][j]);
      }
 }
 glEnd();

Ora carica tutti i vertici nel buffer (credo) ma da qui non sono sicuro di come procedere. O sono completamente sbagliato qui.

Poi ho un altro array 2D (stessa dimensione) che contiene dati di colore (valori da 0-255) che voglio usare come texture sulla nuvola di punti 3D e display.

Capisco che questa potrebbe essere un'implementazione OpenGL molto semplice per alcuni, ma per me questa è una curva di apprendimento enorme. Quindi saranno apprezzati tutti i puntatori, spintoni o calci nella giusta direzione.

    
posta user1733628 10.10.2012 - 08:51
fonte

1 risposta

2

Dovresti usare un approccio moderno OpenGL e dimenticarti di glBegin e glEnd. Puoi utilizzarlo per apprenderlo Apprendimento della programmazione grafica 3D moderna ( sull'archivio web).

In primo luogo, dovresti mettere i tuoi dati in un array lineare, come (o qualcosa del genere). Quindi definisci i buffer opengl che puntano i tuoi dati e carica i programmi shader per dipingerli. E, dopo di che la tua routine di estrazione sarà facile come:

glClearColor( 0.2f, 0.0f, 0.0f, 0.0f );
glClear( GL_COLOR_BUFFER_BIT );

glUseProgram( myShaderProgram );

glBindBuffer( GL_ARRAY_BUFFER, posBufferObject );
glVertexAttribPointer( 0, 3, GL_FLOAT, GL_FALSE, 0, 0 );

glBindBuffer( GL_ARRAY_BUFFER, colBufferObject );
glVertexAttribPointer( 1, 1, GL_UNSIGNED_BYTE, GL_FALSE, 0, 0 );

glEnableVertexAttribArray( 0 );
glEnableVertexAttribArray( 1 );

glDrawArrays( GL_POINTS, 0, 1024*512 );

glDisableVertexAttribArray( 0 );
glDisableVertexAttribArray( 1 );
glUseProgram( 0 );

Il link mostra tutto ciò di cui hai bisogno. Il tuo codice di esempio è deprecato e l'utilizzo di buffer e shader è più efficiente.

    
risposta data 05.02.2013 - 16:28
fonte

Leggi altre domande sui tag