Por desgracia, he buscado y no he encontrado una respuesta definitiva.
¿Cuándo normalizaría los datos de vértice en OpenGL usando el siguiente comando:
glVertexAttribPointer(index, size, type, normalize, stride, pointer);
Es decir, cuándo lo haría normalize == GL_TRUE
; ¿Qué situaciones y por qué elegiría dejar que la GPU haga los cálculos en lugar de preprocesarla? Todos los ejemplos que he visto, tienen esto configurado en GL_FALSE; y personalmente no puedo ver su uso. Pero Khronos no es estúpido, por lo que debe estar ahí para algo útil (y probablemente común).
Esta es una vieja pregunta, pero la respuesta actual realmente no explica para qué los usarías.
Se trata de ahorrar espacio. Y con los atributos de vértice, menos espacio puede significar un mayor rendimiento (si está vinculado a la transferencia de vértice).
Los colores generalmente no necesitan más de 8 bits por componente. A veces necesitas 16 bits, si es un valor de luz HDR o algo así. Pero para las características de la superficie (que es lo que son la mayoría de los atributos de vértice), 8 bits está bien. Por lo tanto, los bytes normalizados sin signo son un buen formato de vértice.
Las coordenadas de textura no necesitan 32 bits de precisión de punto flotante. Un valor de 16 bits de [0, 1] es suficiente. Por lo tanto, los cortos sin signo normalizados son un formato de vértice razonable.
Las normales nunca necesitan 32 bits de precisión. Son direcciones. Los bytes normalizados con signo de 8 bits tienden a ser un poco pequeños, pero los valores normalizados de 10 bits son lo suficientemente buenos la mayor parte del tiempo. OpenGL (3.3+) incluso le permite usar normales de 10 bits a través de un formato empaquetado 10/10/10/2 bits, almacenado en un único entero sin signo de 32 bits.
Incluso puedes jugar juegos con posiciones de vértice, si te encuentras con una gran necesidad de más memoria.
Sin normalización, tendrías que desperdiciar preciosos ciclos en tu sombreador dividiendo los atributos de byte por 255.0. ¿Por qué hacer esto, cuando el hardware puede hacerlo gratis?
fuente
Imagine que tiene una malla con normales de alta precisión y otra malla con baja. Con la normalización de atributos, puede usar el mismo sombreador pero empaquetar las normales de la segunda malla en bytes.
fuente