【发布时间】:2015-01-28 19:17:23
【问题描述】:
我在计算着色器中使用原子计数器,将atomic_uint 绑定到动态GL_ATOMIC_COUNTER_BUFFER(与此opengl-atomic-counter tutorial lighthouse3d 类似)。
我在粒子系统中使用原子计数器来检查所有粒子是否已达到条件;当所有粒子都在正确的位置时,我希望看到counter==numParticles。
我在每一帧都映射缓冲区,并检查原子计数器是否计算了所有粒子:
GLuint *ptr = (GLuint *) glMapBuffer( GL_ATOMIC_COUNTER_BUFFER, GL_READ_ONLY );
GLuint particleCount = ptr[ 0 ];
glUnmapBuffer( GL_ATOMIC_COUNTER_BUFFER );
if( particleCount == numParticles() ){ // do stuff }
在单个 GPU 主机上,代码运行良好,particleCount 始终达到 numParticles(),但在多 GPU 主机上,particleCount 永远无法达到 numParticles()。
我可以直观地检查是否已达到条件并且测试应该为真,但是particleCount 会上下改变每一帧,但从未达到 numParticles()。
在我取消映射particleCount之前,我已经在GL_ATOMIC_COUNTER_BARRIER_BIT上尝试了opengl内存屏障:
glMemoryBarrier(GL_ATOMIC_COUNTER_BARRIER_BIT);
GLuint *ptr = (GLuint *) glMapBuffer( GL_ATOMIC_COUNTER_BUFFER, GL_READ_ONLY );
GLuint particleCount = ptr[ 0 ];
glUnmapBuffer( GL_ATOMIC_COUNTER_BUFFER );
if( particleCount == m_particleSystem->numParticles() )
{ // do stuff }
在计算着色器中增加计数器之前,我尝试了一个 glsl 屏障:
memoryBarrierAtomicCounter();
atomicCounterIncrement( particleCount );
但原子计数器似乎没有跨设备同步。
让原子计数器与多个设备一起工作的正确同步方法是什么?
【问题讨论】:
标签: c++ opengl glsl compute-shader