Misalkan Anda membuat kubus 3D di OpenGL. Anda menerapkan data titik yang diperlukan untuk objek (kubus). Apa gunanya menggunakan indeks?
void CreateCube()
{
const Vertex VERTICES[8] =
{
{ { -.5f, -.5f, .5f, 1 }, { 0, 0, 1, 1 } },
{ { -.5f, .5f, .5f, 1 }, { 1, 0, 0, 1 } },
{ { .5f, .5f, .5f, 1 }, { 0, 1, 0, 1 } },
{ { .5f, -.5f, .5f, 1 }, { 1, 1, 0, 1 } },
{ { -.5f, -.5f, -.5f, 1 }, { 1, 1, 1, 1 } },
{ { -.5f, .5f, -.5f, 1 }, { 1, 0, 0, 1 } },
{ { .5f, .5f, -.5f, 1 }, { 1, 0, 1, 1 } },
{ { .5f, -.5f, -.5f, 1 }, { 0, 0, 1, 1 } }
};
const GLuint INDICES[36] =
{
0,2,1, 0,3,2,
4,3,0, 4,7,3,
4,1,5, 4,0,1,
3,6,2, 3,7,6,
1,6,5, 1,2,6,
7,5,6, 7,4,5
};
//....
glBufferData(GL_ARRAY_BUFFER, sizeof(VERTICES), VERTICES, GL_STATIC_DRAW);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(INDICES), INDICES, GL_STATIC_DRAW);
Dalam contoh di atas, sebuah kubus dibuat dengan simpul yang diperlukan di ruang dunia. Apa relevansi untuk indeks?
Jawaban:
Indeks ada untuk mengurangi jejak memori yang diperlukan untuk mewakili model 3D, banyak dengan cara yang sama bahwa palet warna dapat digunakan untuk mengurangi jejak memori gambar 2D.
Pengindeksan memungkinkan Anda untuk menghindari pengulangan definisi penuh dari suatu titik jika Anda harus menduplikasi data titik tersebut, seperti yang biasanya perlu Anda lakukan untuk model yang kompleks.
API 3D modern dirender menggunakan segitiga; setiap muka kubus membutuhkan dua segitiga:
Untuk menentukan wajah itu tanpa indeks, Anda harus menentukan simpul
A, B, D, A, D, C
. Dua simpul (A
danD
) diulangi dalam simpul penyangga.Namun, dengan indeks, Anda dapat memiliki buffer vertex yang hanya berisi simpul yang diperlukan (
A
,B
,C
, danD
) dan enam indeks:0, 1, 3, 0, 3, 2
. Karena indeks umumnya jauh lebih kecil daripada simpul dan banyak simpul umumnya mengulang dalam model praktis, ini bisa menjadi penghematan ruang yang signifikan.Perhatikan bahwa beberapa simpul hanya akan berbagi atribut parsial. Misalnya, ketika merender kubus dengan pemetaan tekstur, orang umumnya menginginkan koordinat tekstur yang unik per wajah, sehingga Anda akan memiliki banyak simpul dengan posisi yang sama dan koordinat tekstur yang berbeda. Jumlah duplikasi itu dapat diterima dan perlu; itu saat Anda menduplikasi keseluruhan rangkaian atribut simpul yang Anda akan mulai melihat manfaat dari pengindeksan.
Jika memang semua simpul mesh Anda 100% berbeda, tidak ada manfaat untuk indeks (pada kenyataannya Anda akan menggunakan lebih banyak ruang dalam konsumsi buffer indeks redundan). Namun, ini tidak selalu terjadi.
sumber
Menggunakan indeks melayani tiga tujuan utama:
Dari jumlah tersebut yang pertama jelas karena Anda dapat mengukurnya langsung dalam kode Anda sendiri: jika sebuah mesh, katakanlah, 50k simpul tetapi jika 30k dari mereka adalah duplikat, maka Anda memiliki penghematan memori.
Yang kedua dan ketiga tidak begitu jelas - Anda harus sudah membuat keputusan untuk menggunakan indeks, dan Anda perlu profil kode Anda dan mengisolasi kinerja "sebelum" dan "setelah" untuk mendapatkan pengukuran mereka.
Untuk yang kedua, perangkat keras dapat melakukan cache hasil dari simpul yang baru saja diubah. Jika titik yang sama dengan yang baru-baru ini diubah datang, versi cache bisa digunakan daripada harus melakukan perhitungan lagi. Perangkat keras menggunakan indeks untuk mengidentifikasi ini, sehingga indeks mutlak diperlukan untuk mendapatkan perilaku ini.
Untuk yang ketiga, setiap panggilan undian yang Anda lakukan memiliki overhead CPU terlepas dari berapa banyak pekerjaan GPU yang harus dilakukan. Jika semuanya sama, menggambar mesh 50k dalam 1 draw draw akan jauh lebih cepat daripada menggambarnya dalam draw draw 10k. Tetapi jika mesh Anda terdiri dari beberapa strip, atau (lebih buruk lagi) kombinasi strip dan kipas, Anda tidak dapat melakukannya dalam satu kali draw draw tanpa (1) menggunakan indeks, atau (2) memperkenalkan segitiga yang merosot. Tetapi karena indeks jauh lebih kecil daripada simpul, menggunakan indeks lebih disukai dalam kasus umum.
sumber
Indeks mengatakan kelompok apa dari tiga simpul bersama-sama membentuk wajah kubus. Tidak setiap set dari tiga simpul segitiga adalah wajah segitiga.
Anda bisa menggunakan setiap simpul tepat sekali, dan hanya mengulangi berkali-kali yang digunakan dalam lebih dari satu segitiga, tetapi itu berarti transformasi simpul tambahan. Dengan indeks, Anda mengubah simpul hanya sekali dan menggunakannya sebanyak yang Anda butuhkan.
sumber