Ошибка примитивного индекса перезапуска в C++ с OpenGL

Я только изучаю OpenGl и пытаюсь реализовать простой тест того, как работает Primitive Restart Index. Что бы я ни пытался, g++ выдает ошибку «неопределенная ссылка на `__glewPrimitiveRestartIndex'».

Вот код, о котором идет речь:

#include <GL/glew.h>
#include <GL/freeglut.h>

static GLfloat vertices[] = {0.0, 0.0, 0.0, 5.0, -5.0, 0.0,
0xffff, 0.0, -10.0, 5.0, -15.0, 6.0, -8.0};

void init(void)
{
    glEnable(GL_PRIMITIVE_RESTART);
    glPrimitiveRestartIndex(0xffff);

    glEnableClientState(GL_VERTEX_ARRAY);
    glVertexPointer(2, GL_FLOAT, 0, vertices);
}

Я признаю, что я немного новичок в использовании g++ и не совсем понимаю его механизмы переключения и включения. Команда g++, которую я использую для ее компиляции, выглядит следующим образом: g++ -o test test.cpp -lGL -lglut

После добавления «-lGLEW» к команде программа компилируется, но выдает ошибку сегментации. Удаление строки "glPrimitiveRestartIndex(0xffff);" из кода заставляет его компилироваться и работать без ошибок (конечно, без работы примитивного индекса перезапуска), когда -lGLEW добавляется к команде компиляции, но выдает ту же ошибку при попытке без.

Это наводит меня на мысль, что первоначальная проблема возникает из-за того, что я не включил -lGLEW, поэтому единственная оставшаяся проблема - выяснить, почему мне выдается ошибка сегментации. Я пробовал с другими значениями, кроме 0xffff, но проблема остается.


person Jonathan    schedule 23.07.2011    source источник


Ответы (2)


Вы не должны вызывать функции OpenGL до тех пор, пока вы их не загрузите. Поскольку вы используете GLEW, вы должны использовать процедуры инициализации GLEW перед вызовом функций GL. Подробности смотрите в документации GLEW.


О, и это не то, как работает примитивный перезапуск. Индекс перезапуска — это индекс, а не позиция вершины. Это должно войти в ваш список индексов, которые вы даете glDrawElements. Если у вас нет списка индексов и вы рисуете с помощью glDrawArrays, вы не можете использовать примитивный перезапуск.

person Nicol Bolas    schedule 23.07.2011

Это наводит меня на мысль, что первоначальная проблема возникает из-за того, что я не включил -lGLEW, поэтому единственная оставшаяся проблема - выяснить, почему мне выдается ошибка сегментации. Я пробовал с другими значениями, кроме 0xffff, но проблема остается.

Проблема не в значении, которое вы передаете, а в том, что GLEW не инициализирован, поэтому glPrimitiveRestartIndex недопустимый указатель, и попытка разыменования/вызова его приведет к неопределенному поведению. Вы должны инициализировать GLEW после создания и установления текущего контекста OpenGL. В случае использования GLUT это происходит после вызова glutCreateWindow, поэтому ваш код должен выглядеть примерно так:

glutCreateWindow("...");
glewInit();

Также вы должны проверить, действительно ли присутствуют желаемые расширения. И, как уже сказал вам @Nicol Bolas, начальный индекс примитива входит в массив индексов, переданный в glDrawElements.

person datenwolf    schedule 23.07.2011