OpenGL原子计数器缓冲混叠性能



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

我知道一些AMD硬件至少有有限的专用原子硬件单元。我想在这种情况下,计数器结果被写入缓冲区后,如果混叠到SSBO?所以可能在这种情况下,让原子计数器永远不与任何没有显式声明为原子计数器的东西别名可能会更好?

在别人问我之前,我没有大量的相关硬件来测试自己什么是最好的,所以我想知道是否有一个一般的经验法则?

性能不是您的问题。你的问题是它到底能不能起作用。

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

这都是真的…除非您尝试从它读取作为原子计数器。因为这样,执行模型就变成了…更少的定义。实现不需要跨呈现调用同步原子计数器访问

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

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

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

相关内容

  • 没有找到相关文章

最新更新