Best practice con Vertices in Open GL


8

Qual è la migliore pratica per quanto riguarda l'archiviazione dei dati dei vertici in Open GL? Vale a dire:

struct VertexColored {
    public:
        GLfloat position[];
        GLfloat normal[];

        byte colours[];
}

class Terrian  {
    private:
        GLuint vbo_vertices;
        GLuint vbo_normals;
        GLuint vbo_colors;
        GLuint ibo_elements;

        VertexColored vertices[];
} 

o averli memorizzati separatamente nella classe richiesta come:

class Terrian  {
    private:
        GLfloat vertices[];
        GLfloat normals[];
        GLfloat colors[];

        GLuint vbo_vertices;
        GLuint vbo_normals;
        GLuint vbo_colors;
        GLuint ibo_elements;
}

continuo a sentire che intrecciare i tuoi valori per vertice è importante per le prestazioni, sarebbe bello se qualcuno potesse spiegare esattamente il perché
dreta,

1
Il secondo esempio ha un codice errato: GLfloat [] ... -> GLfloat ... []
kravemir

Sì scusa, l'ho appena montato per fare un esempio, vengo da uno sfondo C # in cui dichiari array in questo modo: GLfloat [] array;
Darestium,

Risposte:


11

Non esiste alcuna buona pratica. Tutto varia a seconda dell'applicazione che si sta sviluppando.

Per il renderizzatore di giochi non è necessario archiviare i vertici sia nella RAM che nella VRAM , ciò significa che è necessario mantenere solo l'ID vbo. L'eccezione è il terreno in cui è necessario avere accesso alle posizioni a causa della posizione / collisioni del giocatore in altezza.

Devi avere tutti i dati del vertice insieme? Se vuoi avere più colori per gli stessi vertici come colori diversi per gli stessi modelli di giocatori, mettere tutto insieme può causare piccoli ostacoli allo sviluppo.

Accedete ai dati al di fuori della lezione? Se no, finirai solo con più codice come vertices->position[i]invece di positions[i]. In game / model designer è necessario accedervi dall'esterno, ma non si accede a tutti i dati contemporaneamente quando si modella, si accede a posizioni e quando si colorano si accede ai colori.

L'unica cosa che vorrei mettere insieme è xyz( rgb) valori in una struttura per codice più bello:

Vector3 {
   GLfloat x,y,z;
};

Color3 {
   GLbyte r,g,b;
};

Modifica: Vorrei aggiungere che alcune persone stanno usando unionsper facilitare glVertex * 3v, glVertex * 4v, glUniform * v ... chiamando dove viene passato l'array invece di variabili separate:

union Vector3f {
   GLfloat v[3];
   struct {
      GLfloat x,y,z;
   };
};

union Color3b {
   GLbyte c[3];
   struct {
      GLbyte r,g,b;
   };
};

Se vuoi colori diversi per lo stesso modello, devi solo cambiare le trame o avere tutto in scala di grigi e moltiplicare per il colore (o la mappa delle trame dei colori) in pixel shader. Ma non conservare i dati della CPU se non è necessario. Ma a volte vuoi tenerli, ad esempio per il raycasting, dipende, ma mantieni solo i vertici.
Notabene,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.