Chciałbym przechowywać dwie wartości zmiennoprzecinkowe w pojedynczej 32-bitowej zmiennej zmiennoprzecinkowej. Kodowanie będzie miało miejsce w języku C#, podczas gdy dekodowanie będzie wykonywane w module cieniującym HLSL.Przechowywanie dwóch wartości zmiennoprzecinkowych w jednej zmiennej zmiennoprzecinkowej
Najlepszym rozwiązaniem znalazłem tak daleko jest hard-okablowanie offset po przecinku w kodowanym wartości i przechowywanie ich jako liczba całkowita i dziesiętną „nośnik” float:
123.456 -> 12.3 and 45.6
Może” t obsługuje ujemne wartości, ale to jest w porządku.
Jednak zastanawiałem się, czy jest lepszy sposób na zrobienie tego.
EDIT: Jeszcze kilka szczegółów na temat zadania:
pracuję z ustaloną strukturą danych w jedności, w której dane są przechowywane jako wierzchołek pływaków. (Float2 dla UV, float3 normalny, i tak dalej.) Najwyraźniej nie ma sposobu na poprawne dodawanie dodatkowych danych, więc muszę pracować w tych granicach, dlatego pomyślałem, że wszystko sprowadza się do bardziej ogólnego problemu kodowania danych . Na przykład mogłem poświęcić dodatkowe dane UV, aby przenieść dodatkowe kanały danych 2x2.
Celem jest model cieniowania 3.0, ale nie miałbym nic przeciwko, jeśli dekodowanie działa również na SM2.0.
Utrata danych jest w porządku, o ile jest "uzasadniona". Oczekiwany zakres wartości to 0..64, ale gdy przyjdę do tego wniosku, 0..1 również będzie w porządku, ponieważ jest on tani, aby zamienić go na dowolny zakres wewnątrz modułu cieniującego. Ważne jest, aby precyzja była jak najwyższa. Wartości ujemne nie są ważne.
@ZoltanE: Czy znasz zakresy zmiennych, które próbujesz kodować? –
@ZoltanE: Na który model shadera i wersja DirectX celujesz? Czy możesz podać więcej szczegółów o tym, dlaczego kodujesz w ten sposób? Wreszcie: Zastanów się nad pytaniem na stronie [gamedev] (http://gamedev.stackexchange.com/), możesz uzyskać lepsze odpowiedzi. –
Może może Ci pomóc pytanie http://stackoverflow.com/questions/4811219/pack-four-bytes-in-a-float. – Gnietschow