我有一个与新的计算着色器有关的问题。我目前正在研究粒子系统。我将所有粒子存储在shader-storage-buffer中,以在计算着色器中访问它们。然后,我分派(dispatch)一维工作组。

#define WORK_GROUP_SIZE 128
_shaderManager->useProgram("computeProg");
glDispatchCompute((_numParticles/WORK_GROUP_SIZE), 1, 1);
glMemoryBarrier(GL_SHADER_STORAGE_BARRIER_BIT);

我的计算着色器:
#version 430
struct particle{
         vec4 currentPos;
         vec4 oldPos;
};

layout(std430, binding=0) buffer particles{
         struct particle p[];
};

layout (local_size_x = 128, local_size_y = 1, local_size_z = 1) in;
void main(){
         uint gid = gl_GlobalInvocationID.x;

         p[gid].currentPos.x += 100;
}

但是某种程度上并不是所有的粒子都会受到影响。我正在以与本示例相同的方式进行操作,但是不起作用。 http://education.siggraph.org/media/conference/S2012_Materials/ComputeShader_6pp.pdf

编辑:

在我调用glMemoryBarrier(GL_SHADER_STORAGE_BARRIER_BIT)之后,我继续这样:
_shaderManager->useProgram("shaderProg");
glBindBuffer(GL_ARRAY_BUFFER, shaderStorageBufferID);
glVertexPointer(4,GL_FLOAT,sizeof(glm::vec4), (void*)0);
glEnableClientState(GL_VERTEX_ARRAY);
glDrawArrays(GL_POINTS, 0, _numParticles);
glDisableClientState(GL_VERTEX_ARRAY);

那么在这种情况下,哪一位适合使用?

最佳答案

你有你的barriers on backwards。这是一个普遍的问题。

您提供给屏障的位描述了您打算如何使用写入的数据,而不是数据的写入方式。 GL_SHADER_STORAGE_BARRIER_BIT仅在您有一些进程通过图像加载/存储(或存储缓冲区/原子计数器)写入缓冲区对象,然后使用存储缓冲区读取该缓冲区对象数据的情况下才适用。

由于您正在将缓冲区读取为顶点属性数组缓冲区,因此应使用标题为GL_VERTEX_ATTRIB_ARRAY_BARRIER_BIT的巧妙名称。

10-08 09:29