Vulkan 中的 OpenGL GLSL 原子计数器
OpenGL GLSL atomic counter in Vulkan
当我尝试将我的 OpenGL 实现迁移到 Vulkan 时,我发现 Vulkan 不支持 'uniform atomic_uint'。我的用例很简单:在所有片段中递增一个整数。我试图搜索解决方案,但没有找到任何最新的解决方案。
这是旧解决方案的列表:
https://software.intel.com/en-us/articles/opengl-performance-tips-atomic-counter-buffers-versus-shader-storage-buffer-objects。据说OpenGL原子计数器类似于SSBO原子操作,在某些平台上可能实现为SSBO原子操作。 (不确定今天是否仍然如此)。
https://community.khronos.org/t/vulkan-atomic-counters/7146。它还说在 SSBO 上使用图像 load/store 或原子操作作为替代。 (但内容已有 2 年历史了。)
由于 Vulkan 仍在发展,有谁能推荐一种最新的标准方法来在 Vulkan 中使用 GLSL 对整数进行原子增量?
编辑:
我已经得到答案,但我会添加更多详细信息。在我的 OpenGL 代码中,我有一个带有顶点着色器和片段着色器的渲染通道(涉及 No 计算着色器)。在片段着色器中,我有以下 glsl(简化):
#version 450
layout (binding = 0) uniform atomic_uint fragmentCount;
void main()
{
atomicCounterIncrement(fragmentCount);
}
此着色器在 OpenGL 中运行良好,因为 OpenGL 在 glBindBuffer 中具有枚举 'GL_ATOMIC_COUNTER_BUFFER',在 glsl 中具有关键字 'atomic_uint'。但是,Vulkan 没有相应的内置关键字。因此,我试图寻找替代品。我没有询问如何查询正在渲染的片段数量,尽管这里的着色器看起来像我正在做的那样。我想知道一般图形着色器中的 'atomic counter' 是否存在于 Vulkan 中。正如 Nicol Bolas 指出的那样,Vulkan 中没有这样的东西,而且硬件方面在 NVIDIA GPU 上没有实现,所以我决定使用 SSBO 和 AtomicAdd 来做同样的事情。
希望这能让我的问题更清楚。
Vulkan 中不存在原子计数器,因此您必须采用其中一种解决方案。
顺便说一句,原子计数器作为一个独特的硬件概念,仅存在于 AMD 硬件上。这就是 Vulkan 不支持它们的原因; non-AMD 硬件基本上将它们模拟为 SSBO 工作。
当我尝试将我的 OpenGL 实现迁移到 Vulkan 时,我发现 Vulkan 不支持 'uniform atomic_uint'。我的用例很简单:在所有片段中递增一个整数。我试图搜索解决方案,但没有找到任何最新的解决方案。
这是旧解决方案的列表:
https://software.intel.com/en-us/articles/opengl-performance-tips-atomic-counter-buffers-versus-shader-storage-buffer-objects。据说OpenGL原子计数器类似于SSBO原子操作,在某些平台上可能实现为SSBO原子操作。 (不确定今天是否仍然如此)。
https://community.khronos.org/t/vulkan-atomic-counters/7146。它还说在 SSBO 上使用图像 load/store 或原子操作作为替代。 (但内容已有 2 年历史了。)
由于 Vulkan 仍在发展,有谁能推荐一种最新的标准方法来在 Vulkan 中使用 GLSL 对整数进行原子增量?
编辑:
我已经得到答案,但我会添加更多详细信息。在我的 OpenGL 代码中,我有一个带有顶点着色器和片段着色器的渲染通道(涉及 No 计算着色器)。在片段着色器中,我有以下 glsl(简化):
#version 450
layout (binding = 0) uniform atomic_uint fragmentCount;
void main()
{
atomicCounterIncrement(fragmentCount);
}
此着色器在 OpenGL 中运行良好,因为 OpenGL 在 glBindBuffer 中具有枚举 'GL_ATOMIC_COUNTER_BUFFER',在 glsl 中具有关键字 'atomic_uint'。但是,Vulkan 没有相应的内置关键字。因此,我试图寻找替代品。我没有询问如何查询正在渲染的片段数量,尽管这里的着色器看起来像我正在做的那样。我想知道一般图形着色器中的 'atomic counter' 是否存在于 Vulkan 中。正如 Nicol Bolas 指出的那样,Vulkan 中没有这样的东西,而且硬件方面在 NVIDIA GPU 上没有实现,所以我决定使用 SSBO 和 AtomicAdd 来做同样的事情。
希望这能让我的问题更清楚。
Vulkan 中不存在原子计数器,因此您必须采用其中一种解决方案。
顺便说一句,原子计数器作为一个独特的硬件概念,仅存在于 AMD 硬件上。这就是 Vulkan 不支持它们的原因; non-AMD 硬件基本上将它们模拟为 SSBO 工作。