Estoy tratando de estudiar el mapeo de sombra en WebGL. Veo el mismo código de sombreador copiado en varias bibliotecas y ejemplos que logran esto. Sin embargo, en ninguna parte encontré la explicación de cómo funciona.Embalaje flotante en vec4: ¿cómo funciona este código?
La idea es guardar un valor de profundidad (un solo flotante) en el búfer de color (vec4). Hay una función de paquete que guarda float a vec4 y descomprime la función que recupera el float de vec4.
vec4 pack_depth(const in float depth)
{
const vec4 bit_shift = vec4(256.0*256.0*256.0, 256.0*256.0, 256.0, 1.0);
const vec4 bit_mask = vec4(0.0, 1.0/256.0, 1.0/256.0, 1.0/256.0);
vec4 res = fract(depth * bit_shift);
res -= res.xxyz * bit_mask;
return res;
}
float unpack_depth(const in vec4 rgba_depth)
{
const vec4 bit_shift = vec4(1.0/(256.0*256.0*256.0), 1.0/(256.0*256.0), 1.0/256.0, 1.0);
float depth = dot(rgba_depth, bit_shift);
return depth;
}
me hubiera imaginado que el embalaje de un flotador en vec4 debería ser un problema trivial, simplemente copiarlo en una de las 4 ranuras de vec4 y dejar a otros sin usar. Es por eso que la lógica de cambio de bit en el código anterior me resulta desconcertante.
¿Alguien puede arrojar algo de luz?
I see. No era evidente para mí que el búfer de color almacena internamente el valor de color como 4 enteros, aunque lo alimentamos con un vec4. Si eso es así, entonces el código anterior tiene sentido. Gracias. – Jayesh
Estrictamente hablando, la conversión es a un número de punto fijo de 32 bits, no a un número de coma flotante. – Mortennobel