Praktik terbaik dengan Vertices di Open GL

8

Apa praktik terbaik dalam hal menyimpan data vertex di Open GL? Yaitu:

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

atau meminta mereka disimpan secara terpisah di kelas yang diperlukan seperti:

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

        GLuint vbo_vertices;
        GLuint vbo_normals;
        GLuint vbo_colors;
        GLuint ibo_elements;
}
Darestium
sumber
saya terus mendengar bahwa memiliki nilai-nilai per-simpul yang saling terkait penting untuk kinerja, akan lebih baik jika seseorang dapat menjelaskan mengapa tepatnya
dreta
1
Contoh kedua memiliki kode yang salah: GLfloat [] ... -> GLfloat ... []
kravemir
Yup maaf, saya baru saja menyiapkannya untuk memberikan contoh, saya berasal dari latar belakang C # di mana Anda mendeklarasikan array seperti: array GLfloat [];
Darestium

Jawaban:

11

Tidak ada praktik terbaik. Semuanya bervariasi pada aplikasi yang sedang dikembangkan.

Untuk game penyaji ada tidak perlu ke toko simpul di kedua RAM dan VRAM , yang berarti Anda perlu menjaga hanya VBO id. Pengecualian adalah medan di mana Anda harus memiliki akses ke posisi karena penempatan / tabrakan pemain tinggi.

Apakah Anda perlu memiliki semua data vertex bersama? Jika Anda ingin memiliki beberapa warna untuk simpul yang sama seperti warna yang berbeda untuk model pemain yang sama maka menyatukan semuanya dapat menyebabkan sedikit hambatan dalam pengembangan.

Apakah Anda mengakses data di luar dari kelas? Jika tidak, Anda hanya akan berakhir dengan lebih banyak kode seperti vertices->position[i]daripada positions[i]. Dalam perancang permainan / model Anda harus mengaksesnya dari luar, tetapi Anda tidak mengakses semua data pada saat yang sama ketika Anda memodelkan maka Anda mengakses posisi dan ketika Anda mewarnai maka Anda mengakses warna.

Satu-satunya hal yang saya akan kumpulkan adalah xyz( rgb) nilai ke dalam satu struktur untuk kode yang lebih bagus:

Vector3 {
   GLfloat x,y,z;
};

Color3 {
   GLbyte r,g,b;
};

Sunting: Saya ingin menambahkan, bahwa beberapa orang menggunakan unionsuntuk glVertex * 3v, glVertex * 4v, glUniform * v ... lebih mudah memanggil di mana array dilewatkan daripada variabel yang dipisahkan:

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

union Color3b {
   GLbyte c[3];
   struct {
      GLbyte r,g,b;
   };
};
kravemir
sumber
Jika Anda menginginkan warna berbeda untuk model yang sama, Anda hanya perlu mengubah tekstur, atau memiliki segalanya dalam skala abu-abu dan dikalikan dengan warna (atau peta tekstur warna) dalam pixel shader. Tapi jangan menyimpan data CPU jika Anda tidak perlu. Tetapi kadang-kadang Anda ingin menyimpannya, misalnya untuk raycasting, itu tergantung, tetapi simpan hanya simpul.
Notabene