normalisasi glVertexAttribPointer

11

glVertexAttribPointer (indeks, ukuran, jenis, dinormalisasi, melangkah, pointer);

Jika saya menggunakan tipe = GL_UNSIGNED_BYTE dan dinormalisasi = GL_TRUE

bagaimana itu dinormalisasi? apakah data akan dibagi 256 untuk normalisasi? atau? Ini berarti tidak ada cara untuk memiliki nilai normal '1.0f' ..

Jonathan
sumber

Jawaban:

13

Dari manual,

Jika diatur ke GL_TRUE, dinormalisasi menunjukkan bahwa nilai yang disimpan dalam format integer harus dipetakan ke kisaran [-1,1] (untuk nilai yang ditandatangani) atau [0,1] (untuk nilai yang tidak ditandatangani) ketika nilai tersebut diakses dan dikonversi ke titik mengambang.

Saya menganggap itu berarti bahwa, dengan tipe 8 bit yang tidak ditandatangani, 0 akan memetakan ke 0.0f dan 255 akan memetakan ke 1.0f.

notlesh
sumber
Jadi itu berarti dibagi dengan 255?
Jonathan
Benar, byte unsigned memiliki rentang 0 - 255. Jadi jika Anda melewati 0xFF (yang sama dengan 255), Anda akan mendapatkan 1,0f.
notlesh
7
... Apakah Anda pernah memainkan Zelda asli? Jumlah maksimum rubi yang dapat Anda pegang adalah 255, bukan 256;)
notlesh
Saya tahu bahwa byte yang tidak ditandatangani hanya pergi ke 255 .. Saya hanya ingin tahu karena rasanya logis bagi GPU untuk membagi dengan kekuatan dua
Jonathan
Saya bertanya-tanya sesuatu yang serupa. Mungkin ada konversi yang efisien dari uint_8 ke float yang tidak melakukan lebih dari menggeser bit, tapi saya bukan orang yang bertanya ... Seseorang yang tahu lebih banyak tentang FPU mungkin berpadu?
notlesh