2012-09-30 116 views
2

我想將一些粒子存儲在着色器存儲緩衝區中。我使用glMapBufferRange()函數來設置粒子值,但每次調用此函數時,我都會收到訪問衝突錯誤。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); 

當我使用glMapBuffer()代替時,一切正常。我已經確定我已經用glfw創建了一個OpenGL上下文,並正確初始化了glew。

+0

你確定glMapBufferRange由於某種原因沒有返回NULL嗎? – Sergey

+0

我沒有在上面的代碼中包含所有的錯誤檢查,但在glMapBufferRange()調用之後,我檢查了一個NULL指針。不幸的是,執行甚至沒有達到這個目標。它總是停在glMapBufferRange()處。 – Stan

+0

你可以glMapBufferRange與另一個目標類型比GL_SHADER_STORAGE?在最初的ARB擴展中,SHADER_STORAGE被指定爲只被glMapBuffer接受,而不是glMapeBufferRange,這只是爲OpenGL-4.3添加的,我不會感到驚訝,如果驅動程序仍然有點bug,尤其是OpenGL-4.3還是很新的。 – datenwolf

回答

1

好吧,我終於找到了問題。當我設計我的GLFW-Window類時,我使用GLFW_OPENGL_FORWARD_COMPAT提示來創建向前兼容的OpenGL上下文。我不知道爲什麼我這樣做,但是當我不使用這個提示時,一切正常。 :)