Я хотел бы сохранить два значения float в одной 32-битовой переменной float. Кодировка произойдет в C#, в то время как декодирование должно выполняться в шейдере HLSL.Сохранение двух значений float в одной переменной float
Лучшее решение, которое я нашел до сих пор трудно проводкой смещение в дробной кодированных значений и сохранение их в виде целого числа и десятичной части «носителя» поплавка:
123.456 -> 12.3 and 45.6
Это может» t обрабатывает отрицательные значения, но это нормально.
Однако мне было интересно, есть ли лучший способ сделать это.
EDIT: Несколько более подробно о задаче:
я работаю с фиксированной структурой данных в Unity, где данные вершин хранятся как поплавки. (Float2 для UV, float3 - нормальный и т. Д.). По-видимому, нет возможности правильно добавлять дополнительные данные, поэтому я должен работать в этих пределах, поэтому я решил, что все это связано с более общей проблемой кодирования данных , Например, я могу пожертвовать вторичными УФ-данными для передачи 2х2 дополнительных каналов данных.
Цель - шейдерная модель 3.0, но я бы не прочь, если бы декодирование работало разумно и на SM2.0.
Потеря данных в порядке, если она «разумна». Ожидаемый диапазон значений равен 0..64, но, как я думаю, 0..1 тоже будет хорошо, так как это дешево для переназначения в любой диапазон внутри шейдера. Важно держать точность как можно выше. Отрицательные значения не важны.
@ZoltanE: Вы знаете диапазоны переменных, которые вы пытаетесь кодировать? –
@ZoltanE: Какую модель шейдеров и версию DirectX вы нацеливаете? Можете ли вы дать более подробную информацию о том, почему вы кодируете это? Наконец: рассмотрите вопрос о сайте [gamedev] (http://gamedev.stackexchange.com/), вы можете получить более качественные ответы. –
Возможно, вам может помочь вопрос http://stackoverflow.com/questions/4811219/pack-four-bytes-in-a-float. – Gnietschow