Почему D3DCOLORtoUBYTE4 умножает компоненты на 255.001953f? - PullRequest
0 голосов
/ 30 августа 2018

Я скомпилировал пиксельный шейдер, который использует D3DCOLORtoUBYTE4 , а затем декомпилирован. Вот что я нашел:

r0.xyzw = float4(255.001953,255.001953,255.001953,255.001953) * r0.zyxw;
o0.xyzw = (int4)r0.xyzw;

Предполагается, что rgba-> bgra swizzle использует 255.001953 вместо 255.0? Правила преобразования данных довольно конкретно описывает, что должно произойти, в нем говорится следующее:

Преобразование из плавающей шкалы в целочисленную шкалу: c = c * (2 ^ n-1).

1 Ответ

0 голосов
/ 18 сентября 2018

Краткий ответ: Это только часть определения внутреннего. Так реализовано во всех современных версиях компилятора HLSL.

255.0 в виде 32-разрядного числа с плавающей запятой представляется в двоичном виде как

0100`0011`0111`1111`0000`0000`0000`0000

255.001953 в виде 32-разрядного числа с плавающей точкой на самом деле представляется как 255.001953125, что в двоичном виде:

0100`0011`0111`1111`0000`0000`1000`0000

Это небольшое смещение помогает в определенных случаях, например, в качестве входного значения 0,9999999. Если бы мы использовали 255.0, вы бы получили 254. С 255.001953 вы получите 255. Иначе в большинстве других случаев ответ после преобразования в целое число (с использованием усечения) приводит к тому же самому ответу в любом случае.

Несколько полезных и интересных рассуждений о числах с плавающей точкой здесь

...