Apa tujuan dari indeks dalam rendering 3D?


11

Misalkan Anda membuat kubus 3D di OpenGL. Anda menerapkan data titik yang diperlukan untuk objek (kubus). Apa gunanya menggunakan indeks?

v

 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?


1
Di banyak tempat Anda akan melihat orang-orang memanggil mereka wajah. Dan itulah mereka. Setiap wajah biasanya disusun oleh 3 simpul, untuk membentuk segitiga. Oleh karena itu, masing-masing 3 indeks sesuai dengan satu segitiga di jala akhir. Mereka disebut indeks karena sebagian besar merupakan offset di mana informasi vertex aktual berada dalam array verteks. Semua yang perlu Anda ketahui tentang indeks, saya kira :)
Grimshaw

Jawaban:


24

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:

A--B 
|\ |   This cube face has two triangles:
| \|   ABD and ADC.
C--D

Untuk menentukan wajah itu tanpa indeks, Anda harus menentukan simpul A, B, D, A, D, C. Dua simpul ( AdanD ) diulangi dalam simpul penyangga.

Namun, dengan indeks, Anda dapat memiliki buffer vertex yang hanya berisi simpul yang diperlukan ( A, B, C, dan D) 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.


1
Haruskah 0,1,3, 0,1,2?
Sad CRUD Pengembang

0, 1, 3, 0, 3, 2 sebenarnya, terima kasih (berdasarkan A = 0, B = 1, C = 2, D = 3). Saya memperbarui jawabannya.

mungkin perlu disebutkan, bahwa pada mesh segitiga jumlah rata-rata segitiga yang berdekatan dengan vertex adalah 6.
Arne

7

Menggunakan indeks melayani tiga tujuan utama:

  • Mengurangi persyaratan memori dengan mengaktifkan simpul rangkap untuk dihapus dari jala asli.
  • Mengurangi kalkulasi vertex shader dengan memungkinkan duplikat simpul ditransformasikan hanya sekali.
  • Dengan primitif gabungan sehingga memungkinkan Anda untuk mengurangi panggilan draw.

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.


0

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.


Kapan maksudmu segitiga ??
Sad CRUD Pengembang

Perangkat keras grafis modern menjadikan semuanya sebagai segitiga.

1
Jika Anda benar - benar ingin memahami apa yang terjadi, dapatkan beberapa kertas grafik, gambar simpul 3D, dan gambar garis di antara simpul yang ditentukan oleh INDICES.
ggambett
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.