HLSL 内部函数是否支持半类型?
Do HLSL intrinsic functions support half type?
我最近一直在研究 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
实际上是不是把两个half参数都提升为float,得到一个float结果然后隐式的将结果转为half呢?
half
在当前 HLSL 上映射到 float
,因此您的代码实际上使用浮点数计算值。 More info here:
But then the D3D10 era came along with its unified shader cores, and suddenly fp16 math was no more. None of the desktop hardware supported it anymore, and so HLSL went ahead and mapped the half type to float and called it day.
如果您想使用真正的 16 位值,您可以尝试使用 min16float
而不是 half
。
我最近一直在研究 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
实际上是不是把两个half参数都提升为float,得到一个float结果然后隐式的将结果转为half呢?
half
在当前 HLSL 上映射到 float
,因此您的代码实际上使用浮点数计算值。 More info here:
But then the D3D10 era came along with its unified shader cores, and suddenly fp16 math was no more. None of the desktop hardware supported it anymore, and so HLSL went ahead and mapped the half type to float and called it day.
如果您想使用真正的 16 位值,您可以尝试使用 min16float
而不是 half
。