Infelizmente, procurei e não encontrei resposta definitiva.
Quando você normalizaria os dados do vértice no OpenGL usando o seguinte comando:
glVertexAttribPointer(index, size, type, normalize, stride, pointer);
Ou seja, quando seria normalize == GL_TRUE
; que situações e por que você escolheria deixar a GPU fazer os cálculos em vez de pré-processá-la? Todos os exemplos que eu já vi, definem isso como GL_FALSE; e eu pessoalmente não vejo utilidade para isso. Mas Khronos não é estúpido, então deve estar lá para algo útil (e provavelmente comum).
Esta é uma pergunta antiga, mas a resposta atual não explica realmente para que você as usaria.
É tudo sobre economia de espaço. E com atributos de vértice, menos espaço pode significar maior desempenho (se você estiver vinculado à transferência de vértices).
As cores normalmente não precisam de muito mais do que 8 bits por componente. Às vezes você precisa de 16 bits, se for um valor de luz HDR ou algo assim. Mas para as características da superfície (que é o que a maioria dos atributos de vértice são), 8 bits é bom. Portanto, os bytes normalizados não assinados são um bom formato de vértice.
As coordenadas de textura não precisam de precisão de 32 bits de ponto flutuante. Um valor de 16 bits de [0, 1] é suficiente. Portanto, os shorts não assinados normalizados são um formato de vértice razoável.
Os normais nunca precisam de 32 bits de precisão. São instruções. Os bytes normalizados assinados de 8 bits tendem a ser um pouco pequenos, mas os valores normalizados de 10 bits são bons o suficiente na maioria das vezes. O OpenGL (3.3+) ainda permite que você use normais de 10 bits por meio de um formato compactado de 10/10/10/2 bits, armazenado em um único inteiro não assinado de 32 bits.
Você pode até jogar com posições de vértice, se precisar de mais memória.
Sem normalização, você teria que desperdiçar ciclos preciosos no seu sombreador, dividindo os atributos de byte por 255,0. Por que fazer isso, quando o hardware pode fazer isso de graça?
fonte
Imagine que você tem uma malha com normais de alta precisão e outra malha com baixa. Com a normalização de atributo, você pode usar o mesmo sombreador, mas compactar os normais da segunda malha em bytes.
fonte