如何使用 Vulkan 在现代 GLSL 中获得 16 位浮点数?

How to get 16bit floats in modern GLSL with Vulkan?

它似乎在某个时间点有一个扩展,允许现代 GLSL 规范在某个时候为 OpenGL 1.1, but apparently since that time *the world half has been reclaimed 提供半浮点值。

今天我可以使用 16bit floating point values in CUDA no problem, there should not be an issue in hardware for NVIDIA to support 16bit floats, and they appear to support them in HLSL, and heck even seem to contradictory support them in HLSL cross compilation to SPIR-V while GLSL does not for Nvidia. It seems like SPIR-V has all the primitives needed to support 16bit floating point regardless with primary extensions (KHR) 所以似乎没有理由禁止我使用它们。

我不确定为什么,尽管有 Nvidia 卡,但我无法利用 16 位浮点运算,显然我 forced to use AMD 或者完全切换 API 如果我想的话利用这一点。肯定有某种方法可以为两者实际使用真正的 16 位浮点值吗?

我不是在询问主机到设备分配的缓冲区(IE 顶点缓冲区)。是的,您可以将它们分配为具有 KHR 扩展名的 16 位浮点数并且不会有太大问题,但在实际着色器中,使用 16 位浮点数,而不是将 16 位浮点数强制转换为 32 位浮点数是我担心的。

您可能正在使用 glslang 编译器将 GLSL 编译为 SPIR-V。使用该编译器,针对 GLSL 的平台特定扩展并不是 真正 "platform-specific"。 编译器 和接收 SPIR-V 代码的 Vulkan 通常很重要。

因为 GL_AMD_gpu_shader_half_float 功能直接映射到 SPIR-V 功能而不是 AMD 扩展,glslang 将输出使用 Float16 功能的 SPIR-V 代码。只要接收 Vulkan 实现提供 Float16 功能,就没问题。

当然,您并不好,因为 Vulkan 实现提供此功能。没有 Vulkan 功能或扩展,甚至 VK_AMD_gpu_shader_half_float 提供此 SPIR-V 功能。如果 Vulkan 不提供该功能,则您无法将使用上限的 SPIR-V 着色器传递给它。

也就是说,您可以编译使用它的着色器,但不能将这些着色器传递给 Vulkan at present