当我尝试将我的OpenGL实现迁移到Vulkan时,我发现'uniform atomic_uint‘在Vulkan中不受支持。我的用例很简单:在所有片段中递增一个整数。我试图搜索解决方案,但没有找到任何最新的解决方案。
以下是旧解决方案的列表:
既然Vulkan还在增长,有没有人能推荐一种最新的标准方法,在Vulkan中使用GLSL对整数进行原子递增?
编辑:
我已经得到了答案,但我会添加更多细节。在我的OpenGL代码中,我有一个带有顶点着色器和片段着色器的渲染过程(No compute着色器涉及)。在片段着色器中,我有以下glsl (简化):
#version 450
layout (binding = 0) uniform atomic_uint fragmentCount;
void main()
{
atomicCounterIncrement(fragmentCount);
}
这个着色器在OpenGL中工作得很好,因为OpenGL在glBindBuffer中有枚举'GL_ATOMIC_COUNTER_BUFFER‘,在glBindBuffer中有关键字'atomic_uint’。但是,Vulkan没有对应的内置关键字。因此,我试图寻找它的替代品。我没有问如何查询正在渲染的碎片的数量,尽管这里的着色器看起来像是在做这件事。我想知道在Vulkan中是否存在通用图形着色器中的“原子计数器”。正如Nicol Bolas指出的那样,在Vulkan中没有这样的东西,在NVIDIA GPU上也没有实现,所以我决定使用SSBO和AtomicAdd来做同样的事情。
希望这能让我的问题更清晰。
发布于 2019-06-20 23:15:34
原子计数器在Vulkan中不存在,因此您必须使用这些解决方案之一。
顺便说一句,原子计数器作为一个独特的硬件概念,只是存在于AMD硬件上的东西。这就是为什么Vulkan不支持它们;非AMD硬件基本上将它们模拟为SSBO工作。
https://stackoverflow.com/questions/56682438
复制相似问题