Leider habe ich gesucht und keine endgültige Antwort gefunden.
Wann würden Sie die Scheitelpunktdaten in OpenGL mit dem folgenden Befehl normalisieren:
glVertexAttribPointer(index, size, type, normalize, stride, pointer);
Dh wann würde normalize == GL_TRUE
; In welchen Situationen und warum sollten Sie die GPU die Berechnungen durchführen lassen, anstatt sie vorzuverarbeiten? Alle Beispiele, die ich jemals gesehen habe, haben dies auf GL_FALSE gesetzt; und ich persönlich kann keine Verwendung dafür sehen. Aber Khronos sind nicht dumm, also muss es für etwas Nützliches (und wahrscheinlich Gemeinsames) da sein.
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?
quelle
Stellen Sie sich vor, Sie haben ein Netz mit hochpräzisen Normalen und ein anderes Netz mit niedrigen Normalen. Mit der Attributnormalisierung können Sie denselben Shader verwenden, aber die Normalen des zweiten Netzes in Bytes packen.
quelle