首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OpenGL计算着色器调用

OpenGL计算着色器调用
EN

Stack Overflow用户
提问于 2012-10-05 16:10:57
回答 2查看 5.8K关注 0票数 6

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

代码语言:javascript
复制
#define WORK_GROUP_SIZE 128
_shaderManager->useProgram("computeProg");
glDispatchCompute((_numParticles/WORK_GROUP_SIZE), 1, 1);
glMemoryBarrier(GL_SHADER_STORAGE_BARRIER_BIT);

我的计算着色器:

代码语言:javascript
复制
#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)之后,我继续这样做:

代码语言:javascript
复制
_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);

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-10-06 02:57:41

我解决了这个问题。问题只是我派出的工作组数量太多。numParticles/WORK_GROUP_SIZE将进行四舍五入,因为两个变量都是整数。这导致了太少的调度工作组具有不同数量的粒子。

当我得到1000个粒子时,那么只有1000/128 =7个工作组被调度。每个工作组的规模为128人。这意味着我得到了7*128 = 896个线程,因此104个粒子根本不会移动。由于numParticle%128的范围可能是0...128,所以我刚刚又派了一个工作组:

代码语言:javascript
复制
glDispatchCompute((_numParticles/WORK_GROUP_SIZE)+1, 1, 1);

从现在开始每个粒子都在运动。:)

票数 1
EN

Stack Overflow用户

发布于 2012-10-05 16:56:22

你有你的barriers on backwards。这是一个常见的问题。

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

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

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12742142

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档