相关疑难解决方法(0)

OpenGL Compute Shader Invocations

我得到了一个与新计算着色器相关的问题.我目前正在研究粒子系统.我将所有粒子存储在着色器存储缓冲区中,以便在计算着色器中访问它们.然后我派遣一个一维工作组.

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

我的计算着色器:

#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;
}
Run Code Online (Sandbox Code Playgroud)

但不知何故并非所有粒子都受到影响.我这样做就像在这个例子中一样,但它不起作用.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);
Run Code Online (Sandbox Code Playgroud)

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

c++ opengl gpgpu compute-shader

6
推荐指数
2
解决办法
5175
查看次数

标签 统计

c++ ×1

compute-shader ×1

gpgpu ×1

opengl ×1