Sto cercando di studiare il mapping shadow in WebGL. Vedo lo stesso pezzo di codice shader copiato in varie librerie ed esempi che raggiungono questo obiettivo. Comunque da nessuna parte ho trovato la spiegazione di come funziona.Confezione fluttuante in vec4: come funziona questo codice?
L'idea è di salvare un valore di profondità (un singolo float) nel buffer dei colori (vec4). Esiste una funzione pack che salva float in vec4 e decomprime la funzione che recupera il float da 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;
}
avrei immaginato che l'imballaggio di un galleggiante in vec4 dovrebbe essere un problema banale, basta copiarlo in uno dei 4 slot di vec4 e lasciare gli altri non utilizzati. Ecco perché la logica del cambio di bit nel codice di cui sopra mi lascia perplessi.
Qualcuno può far luce?
Vedo. Non è stato chiaro per me che il buffer di colore memorizza internamente il valore del colore come 4 numeri interi anche se lo alimentiamo con un vec4. Se è così, allora il codice di cui sopra ha senso. Grazie. – Jayesh
In senso stretto la conversione è un numero a virgola fissa a 32 bit, non un numero a virgola mobile. – Mortennobel