2012-09-30 5 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가 glMapBufferRange가 아닌 glMapBuffer만으로 지정되었지만 OpenGL-4.3에만 추가되었습니다. 특히 OpenGL-4.3을 사용하는 경우 드라이버가 약간 버그가있는 경우 놀라지 않을 것입니다. 여전히 아주 새로운. – datenwolf

답변

1

좋아, 마침내 문제가 발견되었습니다. GLFW-Window 클래스를 디자인 할 때 GLFW_OPENGL_FORWARD_COMPAT 힌트를 사용하여 앞으로 호환되는 OpenGL 컨텍스트를 만들었습니다. 내가 왜 이랬는지 모르지만,이 힌트를 사용하지 않으면 모든 것이 잘 작동합니다. :)