OpenGL 原子计数器缓冲区别名性能

OpenGL atomic counters buffer aliasing performance

如果我在 say 着色器 'A' 中使用原子计数器进行 rendering/compute 分派,但随后将该计数器别名为着色器 'B' 中的缓冲区以用于后续 rendering/compute 调度,但在第二次调度中将其声明为统一或 SSBO 而不是实际的原子计数器是否有任何我应该注意的性能影响? (假设采取了适当的 glMemoryBarriers() 等)

我知道某些 AMD 硬件至少具有有限的专用原子硬件单元。我想在这种情况下,如果别名为 SSBO,计数器结果稍后会写入缓冲区?所以可能在这种情况下最好不要让原子计数器别名化为任何未明确声明为原子计数器的东西?

我无法访问大量相关硬件来测试自己什么是最好的,所以我想知道这是否有一般的经验法则?

这里的性能不是你的问题。你的问题是它是否会起作用。

根据 OpenGL 内存模型的规则,如果您执行一些执行原子计数器操作的操作,并且在该渲染操作之后从该缓冲区读取,那么您需要能够获得所有操作的结果原子计数器操作。那代表同步执行。

这都是真的...除非您尝试从中读取作为原子计数器。因为那样的话,执行模型会变得...不太明确。实现不需要同步原子计数器访问 across rendering calls.

现在,原子计数器操作的性质不会因此改变。例如,如果您只增加或减少计数器,您仍然可以保证在渲染调用中获得唯一值。而如果你修改了计数器的缓冲存储,然后执行一个计数器操作,下一次操作将看到修改(由于同步操作)。

但是如果修改此内存的唯一操作是原子计数器,那么使用原子计数器读取 不能 保证从先前的渲染命令中看到原子计数器操作。

所以是的,访问原子计数器的变量将比使用 SSBO 或 UBO 或其他任何东西更快。但是你 不会得到正确的答案。 所以这不是一个好的权衡 ;)