Sto scrivendo uno shader (HLSL) e ho bisogno di comprimere un valore di colore nel formato R32. Ho trovato vari pezzi di codice per l'imballaggio di un float nel formato R8G8B8A8, ma nessuno di essi sembra funzionare al contrario. Mi rivolgo a SM3.0, quindi le operazioni di bit (afaik) non sono un'opzione.Confezione quattro byte in virgola mobile
Per riassumere, ho bisogno di essere in grado di fare questo:
float4 color = ...; // Where color ranges from 0 -> 1
float packedValue = pack(color);
qualcuno sa come fare questo?
UPDATE
ho ottenuto un po 'di progressi ... forse ciò contribuirà a chiarire la questione.
La mia soluzione temporanea in quanto tale:
const int PRECISION = 64;
float4 unpack(float value)
{
float4 color;
color.a = value % PRECISION;
value = floor(value/PRECISION);
color.b = value % PRECISION;
value = floor(value/PRECISION);
color.g = value % PRECISION;
value = floor(value/PRECISION);
color.r = value;
return color/(PRECISION - 1);
}
float pack(float4 color)
{
int4 iVal = floor(color * (PRECISION - 1));
float output = 0;
output += iVal.r * PRECISION * PRECISION * PRECISION;
output += iVal.g * PRECISION * PRECISION;
output += iVal.b * PRECISION;
output += iVal.a;
return output;
}
Sono fondamentalmente ... finta Sto usando tipi interi: s
Attraverso indovinare e verificare, 64 era il numero più alto ho potuto usare, pur mantenendo un intervallo [0 ... 1]. Sfortunatamente, questo significa anche che sto perdendo un po 'di precisione - 6 bit invece di 8.
Alla fine verrà richiesto, quindi è meglio farla finita :) perché devi usare R32 invece di un formato intero? – eodabash
Heh ... sapevo che stava arrivando, ma ancora ... In realtà, sto usando R32G32B32A32, ho solo detto R32 per semplificare. Sto solo cercando di capire come posso spingere quante più informazioni possibili in un singolo obiettivo di rendering. Certo, ho ancora bisogno di fare alcune misurazioni, ma immagino che spingere tutti i miei dati in un singolo obiettivo di rendering sia un po 'più economico rispetto all'utilizzo di quattro tramite MRT. – YellPika
Non vedo l'ora di vedere quali risposte le persone possono trovare per questa domanda. – Olhovsky