簡體   English   中英

Vulkan中的OpenGL GLSL原子計數器

[英]OpenGL GLSL atomic counter in Vulkan

當我嘗試將OpenGL實現遷移到Vulkan時,我發現Vulkan不支持'uniform atomic_uint'。 我的用例很簡單:在所有片段上增加一個整數。 我嘗試搜索解決方案,但未找到任何最新解決方案。

以下是舊解決方案的列表:

  1. https://software.intel.com/zh-CN/articles/opengl-performance-tips-atomic-counter-buffers-versus-shader-storage-buffer-objects 它說OpenGL原子計數器類似於SSBO原子操作,並且在某些平台上可以實現為SSBO原子操作。 (不確定今天是否仍然適用)。

  2. https://community.khronos.org/t/vulkan-atomic-counters/7146 它還說使用SSBO上的圖像加載/存儲或原子操作作為替代。 (但內容為2歲。)

由於Vulkan仍在增長,有人可以建議使用Vulkan中的GLSL在整數上進行原子增量的最新標准方法嗎?

編輯:

我有我的答案,但我會添加更多詳細信息。 在我的OpenGL代碼中,我具有一個帶有頂點着色器和片段着色器的渲染過程( 涉及計算着色器)。 在片段着色器中,我具有以下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沒有相應的內置關鍵字。 因此,我嘗試尋找替代品。 我沒有問如何查詢正在渲染的片段的數量,盡管這里的着色器看起來像我正在做的那樣。 我想知道Vulkan中是否存在通用圖形着色器中的“原子計數器”。 正如Nicol Bolas指出的那樣,在Vulkan中沒有這樣的事情,在硬件方面,NVIDIA GPU上也沒有實現,因此我決定使用SSBO和AtomicAdd來做同樣的事情。

希望這使我的問題更清楚。

Vulkan中不存在原子計數器,因此您必須使用其中一種解決方案。

順便說一句,原子計數器作為一種獨特的硬件概念,只是AMD硬件上存在的一種。 這就是為什么Vulkan不支持他們的原因。 非AMD硬件基本上將它們模擬為SSBO工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM