OpenGL 计算着色器调用
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);
我的计算着色器:
#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);
那么在这种情况下使用哪个位是合适的呢?
你的障碍倒退了。这是一个常见的问题。
您提供给屏障的位描述您打算如何使用写入的数据,而不是如何写入数据。 仅当您有一些进程通过图像加载/存储(或存储缓冲区/原子计数器)写入缓冲区对象,然后使用存储缓冲区读取该缓冲区对象数据时,GL_SHADER_STORAGE_BARRIER_BIT
才适用。
由于将缓冲区作为顶点属性数组缓冲区读取,因此应使用标题巧妙的 GL_VERTEX_ATTRIB_ARRAY_BARRIER_BIT
。
我解决了这个问题。问题只是我派出的工作组数量。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);
从现在开始,每个粒子都在移动。:)
- 当 A 在 for 循环中调用函数 B 时,如何计算函数 A 的空间复杂度?
- 计算对类函数的所有调用次数
- "noexcept-expression 由于对......的调用而计算为'假'"是什么意思?
- 计算一个单词在映射中出现的次数 - 使用 transform() - 调用不匹配
- 在 openGL 中,模型坐标应该在我的 CPU 上计算还是在 GPU 上使用 OpenGL 调用计算?
- 如果我放弃哈希计算,我必须调用 SHA1_Final() 吗?
- 应由于计算费用而避免对STD的多个调用::发现,否则这是可以接受的情况
- 输出 = 0 尝试计算标头中的函数并在主程序中调用它们时
- 从C++调用 Python 或 Lua 来计算表达式,仅在需要时计算未知变量
- C++复合函数调用和计算
- OpenGL 计算着色器在调用 glComputeDispatch 后过早中止
- C++:cout 和函数调用之间的计算顺序
- 如果对象是静态的,则C 确实会计算每个调用
- 避免计算图中的虚函数调用
- 避免在函数调用中计算数组元素
- 为什么此 stl 函数调用会导致不正确的布尔计算
- 如何计算递归功能的调用(增量1)|C
- 在计算后,在基类之后调用参数化构造函数
- OpenGL 计算着色器调用
- 在内核调用(计算1.1或1.2)期间,仅用于设备计算的CUDA内存(类型)