如果我在着色器'A'中使用原子计数器进行渲染/计算调度,但是然后使用对应于着色器'B'中的缓冲区的别名来进行后续渲染/计算调度,但是在第二次调度中声明它作为制服或SSBO而不是实际的原子计数器,我应该注意哪些性能影响? (假设采用了适当的glMemoryBarriers()等)
我知道一些AMD硬件至少拥有有限的专用原子硬件单元。我想在这种情况下,如果别名为SSBO,计数器结果会被写入缓冲区吗?所以可能在这种情况下,保持原子计数器永远不会混淆任何未明确声明为原子计数器的东西可能会更好吗?
我无法访问大量相关硬件来测试自己什么是最好的问题,所以我想知道是否有一般的经验法则?
答案 0 :(得分:1)
性能不是你的问题。你的问题在于它是否会起作用。
根据OpenGL的内存模型的规则,如果你执行一些执行原子计数器操作的操作,并且在渲染操作之后从那个缓冲区读取,那么你需要能够获得所有的结果你的原子计数器操纵。这表示同步执行。
这一切都是真的......除非你试图从它中读取作为原子计数器。因为那时,执行模型变得......定义不太明确。实现不需要在 rendering calls之间同步原子计数器访问。
现在,由于这个原因,原子计数器操作的性质并没有改变。例如,如果您只增加或减少计数器,则仍可保证在渲染调用中获得唯一值。如果修改计数器的缓冲存储器,然后执行计数器操作,下一步操作将看到修改(由于同步操作)。
但是如果修改这个内存的唯一操作是原子计数器,那么使用原子计数器读并不保证看到先前渲染命令的原子计数器操作。
所以,是的,访问原子计数器的变量将比使用SSBO或UBO等更快。但是你没有得到正确的答案。所以这不是一个很好的权衡;)