HLSL - asuint типа float, кажется, возвращает неправильное значение - PullRequest
0 голосов
/ 01 февраля 2020

Я пытался закодировать 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.

1 Ответ

0 голосов
/ 05 февраля 2020

После долгого времени поиска я нашел какой-то ответ, поэтому решил, что я опубликую его здесь на тот случай, если кто-нибудь еще столкнется с этой проблемой. Причина, по которой этот код не работает, связана с денормализацией с плавающей точкой. (Я не совсем понимаю.) В любом случае, денормализованные числа с плавающей точкой интерпретировались как 0 как asuint, так что число денормализованных значений с плавающей точкой всегда было бы 0.

В некоторой степени приемлемым решением может быть (asuint (asfloat (x | 1073741824)) & 3221225471) Это гарантирует, что значение с плавающей точкой нормализовано, но также стирает любые данные, сохраненные во втором бите. Если у кого-то есть другие решения, которые могут сохранить этот бит, дайте мне знать!

...