Ошибка примитивного перезапуска индекса в C ++ с OpenGL - PullRequest
1 голос
/ 24 июля 2011

Я только изучаю OpenGl и пытаюсь реализовать простой тест того, как работает индекс примитивного перезапуска. Что бы я ни пытался, 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, но проблема остается.

Ответы [ 2 ]

3 голосов
/ 24 июля 2011

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


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

1 голос
/ 24 июля 2011

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

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

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

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

...