Saya perlu menggambar banyak poligon yang terdiri dari 6 simpul (dua segitiga).
Tanpa koordinat tekstur, normal, dll., Kedua pendekatan menghasilkan 72 byte. Di masa depan saya pasti juga akan membutuhkan koordinat tekstur dan normal, yang akan membuat gambar indeks mengkonsumsi lebih sedikit memori. Tapi tidak banyak.
Jadi pertanyaan saya adalah: Untuk VAO dengan beberapa titik tumpang tindih, pendekatan mana yang lebih cepat? Saya tidak peduli dengan memori ekstra yang dikonsumsi oleh gambar non-indeks, hanya kecepatan.
Sunting: Untuk membuatnya jelas.
Pendekatan non-indeks:
float[18] vertices = {
//Triangle 1
1,1,0,
1,0,0,
0,0,0,
//Triangle 2
1,0,0,
0,1,0,
0,0,0,
};
Pendekatan indeks:
float[12] vertices = {
1,1,0,
1,0,0,
0,0,0,
0,1,0,
};
int[6] indices = {
//Triangle 1
0,1,2,
//Triangle 2
0,3,2
};
Jawaban:
Saya mencoba menjawab pertanyaan itu. Saya pikir Anda harus menggunakan indeks, karena beberapa alasan:
1) Dalam hal apa pun, pengindeksan adalah operasi gratis di sisi GPU, Anda tidak menerima penalti di sana. (ditambahkan) Tentu saja, indeks adalah operasi akses acak, dan dapat merusak kinerja cache memori GPU.
2) Pengindeksan dapat memungkinkan cache vertex GPU untuk membuat beberapa optimasi untuk tumpang tindih simpul.
3) Jejak memori yang lebih kecil di sisi GPU berkali-kali berarti kinerja yang lebih baik, karena bandwidth memori adalah salah satu kendala, dan karena berkali-kali operasi penggalian (mis. 10_10_10_2 -> 4 x float) tidak berbiaya.
Perbedaan kecepatan mungkin tidak terlihat jika tidak ada banyak titik yang tumpang tindih di mana Anda mungkin mendapatkan peningkatan kecepatan. Tetapi saya benar-benar tidak memiliki fakta keras untuk mendukung pendapat saya (sesuai dengan indeks).
Lihat juga ini:
/programming/17503787/buffers-indexed-or-direct-interlaced-or-separate
sumber
Jika posisinya selalu sama, Anda bahkan dapat melakukannya tanpa buffer dengan menyimpan array di shader dan menggunakannya
gl_VertexID
untuk memilih vertex di vertex shader.sumber
seperti semua hal kinerja, jangan menebak, buat profil untuk mengetahuinya.
itu akan bervariasi tergantung pada perangkat keras dan faktor rumit yang sangat banyak. mengukurnya dengan membuat profil akan secara otomatis mempertimbangkan semua hal ini untuk Anda tanpa Anda perlu tahu apa-apa tentang mereka.
sumber
Asumsi saya adalah bahwa menggunakan pengindeksan untuk simpul akan lebih lambat.
Saya salah paham dengan pertanyaan aslinya, tetapi inilah jawaban untuk pengindeksan warna. Saya menebak aturan yang sama akan berlaku untuk pengindeksan vertex (tanpa kehilangan presisi), tapi itu hanya dugaan.
Tapi...
72 byte sangat kecil sehingga mungkin akan lebih efisien memori untuk tidak mengindeksnya.
Beberapa aturan praktis: Pengindeksan lebih hemat memori. Pengindeksan kehilangan presisi warna. Tidak mengindeks lebih cepat.
Ini mungkin membuat Anda ingin tidak pernah menggunakan pengindeksan, tetapi pertukaran memori agak signifikan untuk gambar berukuran layak. Ketepatan warna tidak terlalu mencolok.
Cara pengindeksan bekerja adalah ketika menggambar pixel, itu diberikan indeks dan harus melihat warna dalam tabel ukuran yang telah ditentukan. (Katakanlah 256 byte, jadi Anda terbatas pada 256 warna). Kemudian itu menarik pixel itu. Tidak ada pengindeksan yang menyimpan data piksel secara langsung, jadi tidak ada batas warna hingga 256. Namun dalam gambar 100x100, gambar 400ish byte Anda sekarang 10.000 byte.
Penafian, saya menarik angka-angka ini dari topiku.
sumber