Dies ist eine alte Frage, aber die aktuelle Antwort erklärt nicht wirklich, wofür Sie sie verwenden würden.
Es geht darum, Platz zu sparen. Und mit Scheitelpunktattributen kann weniger Speicherplatz eine höhere Leistung bedeuten (wenn Sie an die Scheitelpunktübertragung gebunden sind).
Farben benötigen normalerweise nicht viel mehr als 8 Bit pro Komponente. Manchmal benötigen Sie 16-Bit, wenn es sich um einen HDR-Lichtwert handelt oder so. Für Oberflächeneigenschaften (was die meisten Scheitelpunktattribute sind) sind 8 Bit in Ordnung. Vorzeichenlose normalisierte Bytes sind also ein gutes Scheitelpunktformat.
Texturkoordinaten benötigen keine 32-Bit-Gleitkomma-Genauigkeit. Ein 16-Bit-Wert von [0, 1] ist ausreichend. Normalisierte Shorts ohne Vorzeichen sind also ein vernünftiges Vertex-Format.
Normalen benötigen niemals eine Genauigkeit von 32 Bit. Das sind Anweisungen. Normalisierte 8-Bit-Bytes mit Vorzeichen sind in der Regel etwas klein, aber normalisierte 10-Bit-Werte sind die meiste Zeit gut genug. Mit OpenGL (3.3+) können Sie sogar 10-Bit-Normalen über ein gepacktes 10/10/10/2-Bit-Format verwenden, das in einer einzelnen 32-Bit-Ganzzahl ohne Vorzeichen gespeichert ist.
Sie können sogar Spiele mit Scheitelpunktpositionen spielen, wenn Sie dringend mehr Speicher benötigen.
Ohne Normalisierung müssten Sie wertvolle Zyklen in Ihrem Shader verschwenden, indem Sie die Byteattribute durch 255,0 teilen. Warum dies tun, wenn die Hardware dies kostenlos kann?