C++ glMapBufferRange访问冲突

C++ glMapBufferRange访问冲突,c++,opengl,C++,Opengl,我想在着色器存储缓冲区中存储一些粒子。我使用glMapBufferRange()函数来设置粒子值,但每当调用此函数时,总是会出现访问冲突错误 glGenBuffers(1, &bufferID); glBindBuffer(GL_SHADER_STORAGE_BUFFER, bufferID); glBufferData(GL_SHADER_STORAGE_BUFFER, numParticles*sizeof(Particle), NULL ,GL_STATIC_DRAW); st

我想在着色器存储缓冲区中存储一些粒子。我使用glMapBufferRange()函数来设置粒子值,但每当调用此函数时,总是会出现访问冲突错误

glGenBuffers(1, &bufferID);
glBindBuffer(GL_SHADER_STORAGE_BUFFER, bufferID);
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){
    //.. Do something with particles..//
}

glUnmapBuffer(GL_SHADER_STORAGE_BUFFER);
glGenBuffers(1,&bufferID);
glBindBuffer(GL\u SHADER\u STORAGE\u BUFFER,bufferID);
glBufferData(GL_着色器_存储_缓冲区,numParticles*sizeof(粒子),NULL,GL_静态_绘制);
结构粒子*粒子=(结构粒子*)glMapBufferRange(GL_着色器\存储\缓冲区,0,numParticles*大小(粒子),GL_贴图\写入\位| GL_贴图\无效\缓冲区\位);
对于(int i=0;i

当我使用glMapBuffer()时,一切正常。我已经确定使用glfw创建了OpenGL上下文并正确初始化了glew。

好的,我终于找到了问题所在。当我设计我的GLFW窗口类时,我使用GLFW_OPENGL_FORWARD_COMPAT提示来创建一个向前兼容的OPENGL上下文。我不知道我为什么这样做,但当我不使用此提示时,一切都很好。:)

您确定glMapBufferRange出于某种原因没有返回NULL吗?我没有在上面的代码中包含所有错误检查,但在调用glMapBufferRange()之后,我立即检查NULL指针。不幸的是,执行工作甚至没有走到这一步。它总是在glMapBufferRange()处停止。是否可以将glMapBufferRange与GL_着色器_存储以外的其他目标类型一起使用?在最初的ARB扩展着色器中,存储被指定为仅被glMapBuffer而不是GLMAPEBUFFERANGE接受,这只是为OpenGL-4.3添加的,如果驱动程序在这方面仍然有点问题,我不会感到惊讶,特别是在OpenGL-4.3还很新的情况下,我现在将驱动程序更新到306.63,并尝试使用GL_着色器、存储缓冲区和GL_数组缓冲区。两次都会出现相同的问题:/