Поддерживают ли встроенные функции HLSL половину типа? - PullRequest
0 голосов
/ 08 ноября 2019

Недавно я изучал glslang и заметил, что почти все встроенные функции HLSL не поддерживают половинный тип напрямую. Например, есть float max(float, float), int max(int, int), но нет half max(half, half). Документ Microsoft также указывает, что поддерживаются типы компонентов float и int, они не обозначают half: https://docs.microsoft.com/en-us/windows/win32/direct3dhlsl/dx-graphics-hlsl-max

Но в шейдере, если вы пишете half res = max(1.0h, 2.0h), шейдер компилируетсябез ошибок. Так значит ли это max на самом деле продвижение двух половинных параметров с плавающей запятой, получение результата с плавающей запятой и неявное приведение результата к половине?

1 Ответ

0 голосов
/ 12 ноября 2019

half сопоставляется с float в текущем HLSL, поэтому ваш код фактически вычисляет значения с использованием чисел с плавающей запятой. Подробнее здесь :

Но затем наступила эра D3D10 с унифицированными ядрами шейдеров, и внезапно математика fp16 перестала существовать. Ни одно из настольных устройств больше не поддерживало его, и поэтому HLSL пошел дальше и сопоставил половинный тип с плавающей точкой и назвал его day.

Если вы хотите использовать реальные 16-битные значения, вы можете попробовать использоватьmin16float вместо half.

...