Vorrei memorizzare due valori float in una singola variabile float a 32 bit. La codifica avverrà in C# mentre la decodifica deve essere eseguita in uno shader HLSL.Memorizzazione di due valori float in una variabile float singola
La soluzione migliore che ho trovato finora è hard-cablaggio l'offset del decimale nei valori codificati e la loro memorizzazione come intero e decimale del "carrier" float:
123.456 -> 12.3 and 45.6
Può' t gestire valori negativi ma va bene.
Tuttavia mi stavo chiedendo se c'è un modo migliore per farlo.
EDIT: qualche dettaglio in più circa l'operazione:
sto lavorando con una struttura di dati fissa in Unity in cui i dati vengono memorizzati come vertici galleggianti. (Float2 per un UV, float3 il normale e così via.) Apparentemente non c'è modo di aggiungere dati extra in modo appropriato, quindi devo lavorare entro questi limiti, ecco perché ho pensato che fosse tutto un problema più generale dei dati di codifica . Per esempio potrei sacrificare i dati UV secondari per trasferire i canali dati extra 2x2.
L'obiettivo è shader modello 3.0 ma non mi dispiacerebbe se la decodifica funzionasse anche su SM2.0.
La perdita di dati va bene fintanto che è "ragionevole". L'intervallo di valori atteso è 0.60, ma, a mio avviso, lo 0..1 potrebbe anche andare bene dal momento che è economico rimappare in qualsiasi intervallo all'interno dello shader. L'importante è mantenere la precisione il più in alto possibile. I valori negativi non sono importanti.
@ZoltanE: conosci gli intervalli delle variabili che stai tentando di codificare? –
@ZoltanE: anche quale modello di shader e versione di DirectX stai prendendo di mira? Puoi dare maggiori dettagli sul perché stai codificando in questo modo? Infine: considera la possibilità di chiedere informazioni sul sito [gamedev] (http://gamedev.stackexchange.com/), potresti ottenere risposte migliori. –
Forse la domanda http://stackoverflow.com/questions/4811219/pack-four-bytes-in-a-float potrebbe aiutarti. – Gnietschow