Когда я попытался перенести мою реализацию OpenGL на Vulkan, я обнаружил, что «universal atomic_uint» не поддерживается в Vulkan.Мой вариант использования прост: увеличение целого числа на все фрагменты.Я пытался найти решение, но не нашел ни одного последнего решения.
Вот список старых решений:
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.(Но содержанию уже 2 года.)
Поскольку Vulkan все еще растет, кто-нибудь может предложить последний стандартный способ увеличения атома над целым числом с использованием GLSL в Vulkan?
Редактировать:
Я получил свой ответ, но я добавлю больше деталей.В моем коде OpenGL у меня есть проход рендеринга с вершинным шейдером и фрагментным шейдером (задействован No вычислительный шейдер).В фрагментном шейдере у меня есть следующий glsl (упрощенно):
#version 450
layout (binding = 0) uniform atomic_uint fragmentCount;
void main()
{
atomicCounterIncrement(fragmentCount);
}
Этот шейдер отлично работает в OpenGL, потому что OpenGL имеет enum 'GL_ATOMIC_COUNTER_BUFFER' в glBindBuffer и ключевое слово 'atomic_uint' в glsl.Однако Vulkan не имеет соответствующего встроенного ключевого слова.Поэтому я стараюсь искать замену этому.Я не спрашивал, как запросить количество отображаемых фрагментов, хотя шейдер здесь выглядит так, как будто я делаю это.Мне было интересно, существует ли этот «атомный счетчик» в общих графических шейдерах в Vulkan.Как отметил Никол Болас, в Vulkan такого нет, а с аппаратной точки зрения нет реализации на NVIDIA GPU, поэтому я решил использовать SSBO и AtomicAdd, чтобы сделать то же самое.
Надеюсь, что это делает мою проблемупонятнее.