Best Practices mit Vertices in Open GL

8

Was ist die beste Vorgehensweise zum Speichern von Scheitelpunktdaten in Open GL? Dh:

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[];
} 

oder sie separat in der erforderlichen Klasse speichern lassen wie:

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

        GLuint vbo_vertices;
        GLuint vbo_normals;
        GLuint vbo_colors;
        GLuint ibo_elements;
}
Darestium
quelle
Ich
höre
1
Das zweite Beispiel hat einen falschen Code: GLfloat [] ... -> GLfloat ... []
Kravemir
Tut mir leid, ich habe es nur ausgepeitscht, um ein Beispiel zu nennen. Ich komme aus einem C # -Hintergrund, in dem Sie Arrays wie folgt deklarieren: GLfloat [] array;
Darestium

Antworten:

11

Es gibt keine Best Practice. Alles variiert je nach Anwendung, die entwickelt wird.

Für Spiel Renderer gibt es keine Notwendigkeit zum Speichern von Eckpunkten in RAM- und VRAM , das bedeutet , Sie nur vbo id halten müssen. Ausnahme ist Gelände, in dem Sie aufgrund der Platzierung / Kollisionen von Höhenspielern Zugriff auf Positionen benötigen .

Müssen Sie alle Scheitelpunktdaten zusammen haben? Wenn Sie mehrere Farben für dieselben Scheitelpunkte wie unterschiedliche Farben für dieselben Spielermodelle haben möchten, kann das Zusammenfügen aller Elemente kaum Entwicklungshemmnisse verursachen.

Greifen Sie außerhalb des Unterrichts auf Daten zu? Wenn nein, erhalten Sie nur mehr Code wie vertices->position[i]statt positions[i]. Im Spiel- / Modelldesigner müssen Sie von außen darauf zugreifen, aber Sie greifen nicht auf alle Daten gleichzeitig zu, wenn Sie modellieren, dann greifen Sie auf Positionen zu, und wenn Sie färben, greifen Sie auf Farben zu.

Das einzige, was ich zusammenstellen würde, sind xyz( rgb) Werte in einer Struktur für schöneren Code:

Vector3 {
   GLfloat x,y,z;
};

Color3 {
   GLbyte r,g,b;
};

Bearbeiten: Ich möchte hinzufügen, dass einige Leute unionsfür einfachere glVertex * 3v, glVertex * 4v, glUniform * v ... verwenden, wo Array anstelle von getrennten Variablen übergeben wird:

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

union Color3b {
   GLbyte c[3];
   struct {
      GLbyte r,g,b;
   };
};
Kravemir
quelle
Wenn Sie unterschiedliche Farben für dasselbe Modell wünschen, ändern Sie einfach die Texturen oder haben alles in Graustufen und multiplizieren mit der Farbe (oder Farbtexturkarte) im Pixel-Shader. Aber bewahren Sie keine CPU-Daten auf, wenn Sie dies nicht benötigen. Aber manchmal möchten Sie sie behalten, zum Beispiel für Raycasting, das hängt davon ab, aber behalten Sie nur Eckpunkte.
Notabene