Opengl 在循环中计算着色器均匀更新

Opengl 在循环中计算着色器均匀更新,opengl,directx,particle-system,Opengl,Directx,Particle System,我有一个OpenGL计算着色器,它在循环的每个迭代中调度工作组。需要传递一个表示ID的唯一统一值。每个ID对于从每个分派调用生成的着色器调用集是唯一的 是否可以通过使用映射指针将值重新指定给循环中的UBO,使每个着色器调用集中的值保持唯一?通过测试,看起来在一个帧内只能将一个可能的值传递给所有着色器调用集。如果我错了,请纠正我 是否有其他方法可以在不牺牲性能的情况下将唯一值传递给整个工作组集?如果不是,如果性能不是一个问题,有什么方法可以解决这个问题 为了了解更多上下文,我尝试使用OpenGL而

我有一个OpenGL计算着色器,它在循环的每个迭代中调度工作组。需要传递一个表示ID的唯一统一值。每个ID对于从每个分派调用生成的着色器调用集是唯一的

是否可以通过使用映射指针将值重新指定给循环中的UBO,使每个着色器调用集中的值保持唯一?通过测试,看起来在一个帧内只能将一个可能的值传递给所有着色器调用集。如果我错了,请纠正我

是否有其他方法可以在不牺牲性能的情况下将唯一值传递给整个工作组集?如果不是,如果性能不是一个问题,有什么方法可以解决这个问题

为了了解更多上下文,我尝试使用OpenGL而不是DirectX实现与下面链接中的循环类似的东西:

在上面的示例中,在更新常量缓冲区之前有一个映射和取消映射操作。也许这需要使用OpenGL来完成,而不是使用持久映射?或者我可能会丢失旗帜

是否可以通过使用映射指针将值重新指定给循环中的UBO,使每个着色器调用集中的值保持唯一

是的,如果您将该内存的修改与OpenGL同步。意味着主机更改和GPU之间的同步现在由您负责

为了执行您的建议,您需要在每次循环迭代后有效地发出
glFinish
调用,以便CPU在GPU完成读取之前不会尝试修改该内存

这显然是个坏主意,所以不要这样做。在每次调度之间执行一系列映射/取消映射调用也是一个性能杀手。很有可能在某个时刻,它必须在每次迭代中执行与发出
glFinish
相同的操作。即使这不发生,实现也必须在幕后进行大量分配工作,以使其性能友好

对于简单的数字标识符,只需在每次迭代中使用
glUniform
调用