Нарушение прав доступа с использованием VBO с glew

Я пытаюсь использовать VBO в своем проекте OpenGL. Я использую библиотеку glew для расширений и glfw для обработки окон. Когда я пытаюсь создать приложение VBO, происходит сбой, и я получаю

Необработанное исключение по адресу 0x00000000 в symulator3C.exe: 0xC0000005: нарушение прав доступа

в функции glGenBuffersARB. Вот мой код:

GLuint vboId1=0; //this is global variable

void createVBO(){
normalsVBO = (float *) malloc(sizeof(float)*3*(SIZE_X-1)*SIZE_Y*2);
verticesVBO = (float *) malloc(sizeof(float)*3*(SIZE_X-1)*SIZE_Y*2);
if(normalsVBO==NULL) exit(-1);
if(verticesVBO==NULL) exit(-1);

glGenBuffersARB(1, &vboId1); //HERE IT CRASHES!

// bind VBO in order to use
glBindBufferARB(GL_ARRAY_BUFFER_ARB, vboId1);

...
glBufferDataARB(GL_ARRAY_BUFFER_ARB, sizeof(float)*3*(SIZE_X-1)*SIZE_Y*2, verticesVBO, GL_DYNAMIC_DRAW);
glEnableClientState(GL_VERTEX_ARRAY);             // activate vertex coords array
glVertexPointer(3, GL_FLOAT, 0, 0);

}

Я не знаю, что случилось. Конечно, перед вызовом этой функции я вызываю glewInit(), и результатом является успех. РЕДАКТИРОВАТЬ: я использую Visual Studio 2010


person pchot    schedule 22.10.2011    source источник
comment
Что ваш отладчик говорит вам о том, где программа останавливается?   -  person Nicol Bolas    schedule 23.10.2011
comment
как уже упоминалось, он останавливается на строке glGenBuffersARB(1, &vboId1). или вы имеете в виду что-то другое?   -  person pchot    schedule 23.10.2011
comment
Ваша реализация OpenGL действительно поддерживает ARB_vertex_buffer_object? Похоже, вы не проверяете это расширение через GLEW.   -  person genpfault    schedule 23.10.2011
comment
Опубликуйте полную минимальную программу, демонстрирующую проблему.   -  person genpfault    schedule 23.10.2011


Ответы (1)


Поскольку ваша программа дает сбой при первом использовании функции, связанной с VBO, похоже, что вы либо неправильно инициализировали GLEW (путем вызова glewInit после создания и активации контекста GL), либо ваше оборудование просто не поддерживает VBO.

Просто проверьте, поддерживает ли ваше оборудование GL_ARB_vertex_buffer_object или версия OpenGL не ниже 1.5, и в этом случае вы можете использовать базовые версии функций VBO (без суффикса ARB, но для них вам, конечно, все равно нужен должным образом инициализированный GLEW) :

printf("%s\n", glGetString(GL_VERSION));
if(!strstr(glGetString(GL_EXTENSIONS), "GL_ARB_vertex_buffer_object"))
    //no VBO extension

И убедитесь, что вы работаете с последним графическим драйвером. Если вы работаете с драйвером Windows по умолчанию, он может поддерживать только OpenGL 1.1.

person Christian Rau    schedule 23.10.2011
comment
Мне, вероятно, не нужно рассказывать вам, но для тех, кто следит за мной дома, GLEW есть собственный набор расширения и проверка версии. - person genpfault; 23.10.2011
comment
У меня самая новая версия glew. @Christian Rau, когда я вызываю glGetString (GL_VERSION), он возвращает значение null. Странно то, что у меня есть рабочие примеры VBO, но когда я проверил версию openGL в файле gl.h, там была 1.1. Сейчас пытаюсь найти новую версию GL.h может поможет - person pchot; 23.10.2011
comment
@pchot Не ищите новую версию GL.h, ее нет. Каждая функция выше 1.1 доступна только через функцию указателя функции, аналогичную расширениям, и управляется для вас GLEW. Фактическая реализация этих функций обеспечивается вашим графическим драйвером. Но старый добрый GL.h — это всего лишь версия 1.1 (по крайней мере, для Windows), и вы ее не измените. - person Christian Rau; 23.10.2011
comment
@Christian Rau Хорошо, проблема была в том, что у меня был glewInit() после создания контекста GL, но также и после того, как я вызвал glGenBuffersARB. Глупая ошибка и столько времени потеряно :/ Спасибо за помощь. - person pchot; 23.10.2011