Sta*_*tan 6 c++ opengl gpgpu compute-shader
我得到了一个与新计算着色器相关的问题.我目前正在研究粒子系统.我将所有粒子存储在着色器存储缓冲区中,以便在计算着色器中访问它们.然后我派遣一个一维工作组.
#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)
那么在这种情况下哪个位适合使用?
我解决了这个问题。问题只是出在我派出的工作组的数量上。numParticles/WORK_GROUP_SIZE 将被四舍五入,因为这两个变量都是整数。这导致派出的具有不同数量粒子的工作组太少。
当我获得 1000 个粒子时,则仅调度 1000/128 = 7 个工作组。每个工作组的大小为 128。这意味着我得到 7*128 = 896 个线程,因此 104 个粒子根本不会移动。由于 numParticles%128 的范围可能是 0...128,我刚刚又调度了一个工作组:
glDispatchCompute((_numParticles/WORK_GROUP_SIZE)+1, 1, 1);
Run Code Online (Sandbox Code Playgroud)
从现在开始,每个粒子都会移动。:)
| 归档时间: |
|
| 查看次数: |
5175 次 |
| 最近记录: |