Я пытался закодировать 4 uint (8-бит) в один float, чтобы я мог легко сохранить их в текстуру вместе со значением глубины. Мой код не работал, и в итоге я обнаружил, что проблема сводится к следующему:
asuint (asfloat (uint (x))) возвращает 0 в большинстве случаев, когда он должен возвращать x.
Теоретически этот код должен возвращать x (где x - целое число), поскольку биты в x преобразуются в float, а затем обратно в uint, поэтому те же самые биты в конечном итоге интерпретируются как еще раз. Однако я обнаружил, что единственный случай, когда эта функция возвращает x, это когда биты x интерпретируются как очень большое число с плавающей запятой. Я рассмотрел возможность того, что это может быть проблемой с графическим драйвером, поэтому я попробовал его на двух разных компьютерах и получил ту же проблему на обоих.
Я протестировал несколько других вариантов этого кода, и все они, кажется, работать правильно.
asfloat(asuint(float(x))) = x
asuint(asint(uint(x))) = x
asuint(uint(x)) = x
Единственный случай, который не работает должным образом, это первый упомянутый случай в этом посте. Это ошибка или я что-то не так делаю? Также этот код запускается в фрагментном шейдере внутри Unity.