gpt4 book ai didi

c++ - 着色器存储缓冲区中的 OpenGL 顶点

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:16:11 27 4
gpt4 key购买 nike

我现在正在使用计算着色器开发粒子系统。我将所有粒子都放在着色器存储缓冲区中。一个粒子包含两个顶点,当前位置和先前位置。

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。你的compute shader为每个数组元素写入两个 vec4

然而这一行:

glVertexPointer(4,GL_FLOAT, sizeof(glm::vec4), (GLvoid*)0);

告诉 OpenGL 您正在传递一个 vec4 数组。你不。您正在传递一个数组,其中每个元素都是两个 vec4。你想跳过第二个。

因此,通过提供适当的步幅告诉 OpenGL:

glVertexPointer(4, GL_FLOAT, sizeof(Particle), (GLvoid*)0);

哦,顺便说一句:你还是using the wrong barrier .仅仅因为您的代码恰好起作用并不意味着它是有保证的。除非您正确地执行所有操作,否则不同步的加载/存储操作可能会很棘手。

关于c++ - 着色器存储缓冲区中的 OpenGL 顶点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12752279/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com