在循环中计算Shader统一更新

问题描述 投票:0回答:1

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

是否可以简单地通过在循环中使用映射指针重新分配一个值到UBO来保持每个shader调用集内的唯一值?根据测试,在一个帧内,似乎只有一个可能的值可以传入所有shader调用集。如果我说的不对,请纠正我。

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

为了更多的背景,我试图实现类似于下面链接中的循环,使用OpenGL而不是DirectX。

https:/github.comGPUOpen-LibrariesAndSDKsGPUParticles11blobmastergpuparticles11srcGPUParticleSystem.cpp#L1163

在上面的例子中,在更新Constant Buffer之前有一个map和unmap操作。也许这需要用OpenGL来完成,而不是使用持久化地图?或者我是否遗漏了一些标志?

opengl directx particle-system
1个回答
2
投票

是否可以简单地通过在循环中使用映射指针向UBO重新分配一个值来保持每个shader调用集内的唯一值?

是的,如果您将该内存的修改与OpenGL同步。永久性映射内存 意味着主机变化和GPU之间的同步现在是 你的责任.

为了实现你的建议,你需要有效地发出一个 glFinish 调用,这样CPU就不会尝试修改该内存,直到GPU完成从该内存的读取。

这显然是个坏主意,所以不要这么做。在每次调度之间做一堆mapunmap调用也是一个性能杀手。很有可能在某些时候,它要做的事情与发出一个 glFinish 在每个迭代中。即使不这样做,实现也要在幕后做很多分配工作,使其性能友好。

对于一个简单的数字标识符,只需使用一个 glUniform 称为每迭。

© www.soinside.com 2019 - 2024. All rights reserved.