Meilleures pratiques avec Vertices dans Open GL

8

Quelle est la meilleure pratique en matière de stockage des données de sommet dans Open GL? C'est à 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[];
} 

ou les avoir stockés séparément dans la classe requise comme:

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

        GLuint vbo_vertices;
        GLuint vbo_normals;
        GLuint vbo_colors;
        GLuint ibo_elements;
}
Darestium
la source
je continue à entendre que le fait d'avoir vos valeurs par vertex entrelacées est important pour la performance, serait formidable si quelqu'un pouvait expliquer pourquoi exactement
dreta
1
Le deuxième exemple a un mauvais code: GLfloat [] ... -> GLfloat ... []
kravemir
Yup désolé, je l'ai juste fouetté pour donner un exemple, je viens d'un arrière-plan C # où vous déclarez des tableaux comme ceci: GLfloat [] array;
Darestium

Réponses:

11

Il n'y a pas de meilleure pratique. Tout varie selon l'application en cours de développement.

Pour le rendu de jeu, il n'est pas nécessaire de stocker les sommets dans la RAM et la VRAM , ce qui signifie que vous devez conserver uniquement l'ID vbo. L'exception est le terrain où vous devez avoir accès à des positions en raison du placement / des collisions des joueurs en hauteur.

Avez-vous besoin d'avoir toutes les données de sommet ensemble? Si vous voulez avoir plusieurs couleurs pour les mêmes sommets comme des couleurs différentes pour les mêmes modèles de joueurs, tout mettre ensemble peut causer peu d'obstacles au développement.

Accédez-vous aux données en dehors de la classe? Si non, vous ne vous retrouverez qu'avec plus de code comme vertices->position[i]au lieu de positions[i]. Dans le concepteur de jeu / modèle, vous devez y accéder de l'extérieur, mais vous n'accédez pas à toutes les données en même temps lorsque vous modélisez, vous accédez à des positions et lorsque vous coloriez, vous accédez à des couleurs.

La seule chose que je mettrais ensemble est xyz( rgb) les valeurs dans une structure pour un code plus agréable:

Vector3 {
   GLfloat x,y,z;
};

Color3 {
   GLbyte r,g,b;
};

Edit: Je voudrais ajouter que certaines personnes utilisent unionsplus facilement glVertex * 3v, glVertex * 4v, glUniform * v ... en appelant où le tableau est passé au lieu de variables séparées:

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

union Color3b {
   GLbyte c[3];
   struct {
      GLbyte r,g,b;
   };
};
kravemir
la source
Si vous voulez des couleurs différentes pour le même modèle, il vous suffit de modifier les textures ou de tout avoir en niveaux de gris et de les multiplier par couleur (ou texture de couleur) dans le pixel shader. Mais ne conservez pas les données du processeur si vous n'en avez pas besoin. Mais parfois, vous voulez les conserver, par exemple pour le raycasting, cela dépend, mais gardez juste les sommets.
Notabene