Sayangnya, saya telah mencari, dan tidak menemukan jawaban yang pasti.
Kapan Anda akan menormalkan data vertex di OpenGL menggunakan perintah berikut:
glVertexAttribPointer(index, size, type, normalize, stride, pointer);
Yaitu kapan akan normalize == GL_TRUE
; situasi apa, dan mengapa Anda memilih untuk membiarkan GPU melakukan perhitungan alih-alih memprosesnya? Semua contoh yang pernah saya lihat, set ini ke GL_FALSE; dan saya pribadi tidak bisa melihat gunanya. Tapi Khronos tidak bodoh, jadi itu pasti ada untuk sesuatu yang berguna (dan mungkin umum).
Ini adalah pertanyaan lama, tetapi jawaban saat ini tidak benar-benar menjelaskan untuk apa Anda akan menggunakannya.
Ini semua tentang menghemat ruang. Dan dengan atribut vertex, lebih sedikit ruang dapat berarti kinerja lebih tinggi (jika Anda terikat transfer vertex).
Warna biasanya tidak membutuhkan lebih dari 8-bit per komponen. Kadang-kadang Anda membutuhkan 16-bit, jika itu nilai cahaya HDR atau sesuatu. Tetapi untuk karakteristik permukaan (yang merupakan atribut vertex paling banyak), 8 bit baik-baik saja. Jadi byte dinormalisasi unsigned adalah format simpul yang baik.
Koordinat tekstur tidak perlu presisi floating-point 32-bit. Nilai 16-bit dari [0, 1] sudah cukup. Jadi celana pendek unsigned yang dinormalisasi adalah format vertex yang masuk akal.
Normalnya tidak pernah membutuhkan presisi 32-bit. Mereka arah. 8-bit normalized byte yang ditandatangani cenderung agak kecil, tetapi nilai normalisasi 10-bit cukup baik. OpenGL (3.3+) bahkan memungkinkan Anda untuk menggunakan normals 10-bit melalui format 10/10/10/2 bit, disimpan dalam integer 32-bit unsigned tunggal.
Anda bahkan dapat bermain game dengan posisi titik, jika Anda membutuhkan lebih banyak memori.
Tanpa normalisasi, Anda harus membuang siklus berharga dalam atribut byte pembagi shader Anda dengan 255.0. Mengapa melakukan ini, ketika perangkat keras dapat melakukannya secara gratis?
sumber
Bayangkan Anda memiliki mesh dengan normals presisi tinggi dan mesh lain dengan low. Dengan normalisasi atribut, Anda dapat menggunakan shader yang sama tetapi mengemas normals mesh kedua dalam byte.
sumber