着色器存储缓冲区中的 OpenGL 顶点
OpenGL vertices in shader storage buffer
我现在正在使用计算着色器开发粒子系统。我把所有的粒子都放在着色器存储缓冲区中。粒子包含两个顶点,即当前位置和先前位置。
struct Particle{
glm::vec4 _currPosition;
glm::vec4 _prevPosition;
};
调度计算着色器后,我想直接从着色器存储缓冲区绘制所有粒子。这就是我所做的:
glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 0, shaderStorageBufferID);
_shaderManager->useProgram("computeProg");
glDispatchCompute((_numParticles/WORK_GROUP_SIZE)+1, 1, 1);
glMemoryBarrier(GL_SHADER_STORAGE_BARRIER_BIT);
_shaderManager->useProgram("shaderProg");
glBindBuffer(GL_ARRAY_BUFFER, shaderStorageBufferID);
glVertexPointer(4,GL_FLOAT, sizeof(glm::vec4), (GLvoid*)0);
glEnableClientState(GL_VERTEX_ARRAY);
glDrawArrays(GL_POINTS, 0, _numParticles);
glDisableClientState(GL_VERTEX_ARRAY);
问题是我在屏幕上看到了_numParticles,但一半是用我的粒子结构的_prevPosition属性渲染的。这意味着一个粒子被解释为在屏幕上绘制的两个顶点。但我希望他跳过每个粒子结构中的_prevPosition属性。我的错误在哪里?
也许我初始化着色器存储缓冲区的方式很重要:
GLuint shaderStorageBufferID;
glGenBuffers(1, &shaderStorageBufferID);
glBindBuffer(GL_SHADER_STORAGE_BUFFER, shaderStorageBufferID);
glBufferData(GL_SHADER_STORAGE_BUFFER, numParticles*sizeof(Particle), NULL ,GL_STATIC_DRAW);
struct Particle* particles = (struct Particle*) glMapBufferRange(GL_SHADER_STORAGE_BUFFER, 0, numParticles*sizeof(Particle), GL_MAP_WRITE_BIT | GL_MAP_INVALIDATE_BUFFER_BIT);
for(int i = 0; i < numParticles; ++i){
particles[i]._currPosition = glm::vec4(i, 0, 0.0, 1.0f);
particles[i]._prevPosition = glm::vec4(i, 0, 1.0, 1.0f);
}
您的Particle
结构包含两个vec4
。计算着色器为每个数组元素写入两个vec4
。
然而这句话:
glVertexPointer(4,GL_FLOAT, sizeof(glm::vec4), (GLvoid*)0);
告诉 OpenGL 你正在传递一个vec4
数组,你不是。你正在传递一个数组,其中每个元素都是两个vec4
。你想跳过第二个。
因此,告诉OpenGL,通过提供适当的步伐:
glVertexPointer(4, GL_FLOAT, sizeof(Particle), (GLvoid*)0);
哦,顺便说一句:你仍然使用错误的屏障。仅仅因为你的代码碰巧运行并不意味着它是有保证的。除非您正确执行所有操作,否则不同步的加载/存储操作可能会很棘手。
相关文章:
- OpenGL 顶点数组对象与 tinyobjloader
- OpenGL 顶点缓冲区类重定义和模板方法错误
- OpenGL 顶点未渲染
- 我的OpenGL顶点阵列将其抽象成课程不再起作用
- OpenGL顶点和索引obj
- 为什么我的 openGL 顶点缓冲区对象不会绘制任何内容?
- 将属性传递给OpenGL顶点着色器的行为很奇怪
- 着色器存储缓冲区中的 OpenGL 顶点
- OpenGL顶点属性指针或着色器不工作
- 从侧面剪裁OpenGL顶点
- OpenGL 顶点着色器的 NormalMatrix
- OpenGL 顶点缓冲区渲染不正确
- 动态打包 OpenGL 顶点缓冲区对象的数据
- 使用openGL顶点阵列的白屏
- OpenGL顶点缓冲区对象未显示
- 一个大的OpenGL顶点缓冲区,或者多个小的
- OpenGL顶点阵列,根据用户输入绘制
- OpenGL顶点缓冲区对象
- OpenGL顶点着色器运行时问题(不使用VBOs或纹理)
- OpenGL顶点缓冲对象不工作