glMultiDrawElements - PullRequest
       0

glMultiDrawElements

1 голос
/ 13 августа 2011

Я прочитал Красную книгу (7-е издание), и во время тестирования glMultiDrawElements у меня ничего не появилось на экране, и в консоли отладки произошла ошибка «Нарушение доступа». Я использую MVS2010, и вот основные части кода, которые я компилирую:

// C4UB_V2F interwined format, vertex are CCW ordered
static const GLfloat vertex[] = {

    // First triangle
    0xff0000ff, 0.25f, 1.0f, // nevermind on that incorrect integer colors
    0x00ff00ff, 0.0f,  0.0f,
    0x0000ffff, 0.5f,  0.0f,

    // Second one
    0xff0000ff, 0.75f, 0.0f,
    0x00ff00ff, 0.5f,  1.0f,
    0x0000ffff, 1.0f,  1.0f

};


void init() {

    glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
    glShadeModel(GL_SMOOTH);
    glInterleavedArrays(GL_C4UB_V2F, 0, vertex);

}


static const GLubyte order[] = { 0, 1, 2, 3, 4, 5 };

static GLubyte oneIndices[] = {0, 1, 2};
static GLubyte twoIndices[] = {3, 4, 5};
static GLsizei count[] = {3, 3};
static GLvoid * indices[2] = {oneIndices, twoIndices};

void render() {

    glClear(GL_COLOR_BUFFER_BIT);

    // This one works perfectly:
    //glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_BYTE, order); 

    // And this one generates access violation error
    // in the book there's no indices casting, but MVS2010 is too lazy to cast it itself
    glMultiDrawElements(GL_TRIANGLES, count, GL_UNSIGNED_BYTE, (const GLvoid **)indices, 2);


    // This command never executes 'cause of acces violation error occuring 
    glFlush();

}

Мне кажется, что я что-то упустил во время чтения индексов , но я не могу точно понять, что именно. Есть идеи?

Ответы [ 2 ]

1 голос
/ 14 августа 2011

Я только что проверил - printf ("% i", glDrawElementsInstanced);печатает ноль.

Для этого есть две возможности.

  1. Ваша реализация OpenGL их не поддерживает.Это будет означать, что у вас есть древние драйверы, или вы неправильно создаете контекст.Поскольку вы используете FreeGLUT, проблема создания контекста маловероятна.Если ваше оборудование было изготовлено за последние 7 лет, вы сможете его получить.

  2. Вы не инициализировали GLEW.Вы должны вызвать glewInit после создания окна OpenGL с FreeGLUT.В противном случае у вас не будет должным образом инициализированного GLEW, и ваши указатели функций будут иметь значение NULL.

0 голосов
/ 14 августа 2011

Из-за ваших комментариев кажется, что эти функции не поддерживаются вашим оборудованием и / или драйвером. glMultiDrawElements поддерживается с версии 1.4 и glDrawRangeElements поддерживается с версии 1.2. Убедитесь, что ваше оборудование поддерживает эти версии, и вы получили последние версии драйверов.

И, конечно, сначала вы должны получить соответствующие указатели на функции, прежде чем сможете их использовать. Это можно сделать вручную с помощью wglGetProcAddress (с учетом Windows из-за вашего упоминания VS) или с помощью библиотеки загрузки расширений, например GLEW .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...