OpenGL: использование массива вершин для рисования куба вызывает графический сбой - PullRequest
1 голос
/ 16 апреля 2011

При попытке нарисовать следующие четырехугольники в OpenGL с использованием массива вершин (вместо непосредственного рендеринга в режиме), я получаю графический глюк (отрезок), показанный на рисунке, который можно найти во второй ссылке ниже. Кажется, что линия идет вверх до бесконечности.

GLdouble vertices[] = {
    // back
    0.0, 0.0, 0.0,
    si,  0.0, 0.0,
    si,  -si, 0.0,
    0.0, -si, 0.0,

    // front
    0.0, 0.0, si,
    0.0, -si, si,
    si,  -si, si,
    si,  0.0, si,

    // left
    0.0, 0.0, 0.0,
    0.0, -si, 0.0,
    0.0, -si, si,
    0.0, 0.0, si,

    // right
    si, 0.0, 0.0,
    si, 0.0, si,
    si, -si, si,
    si, -si, 0.0,

    // top
    0.0, 0.0, 0.0,
    0.0, 0.0, si,
    si, 0.0, si,
    si, 0.0, 0.0,

    // bottom
    0.0, -si, 0.0,
    si, -si, 0.0,
    si, -si, si,
    0.0, -si, si,
};

Немедленный рисунок:

 glBegin(GL_QUADS);
   for (int i = 0; i < sizeof(vertices)/sizeof(*vertices)/3; i++)
     glVertex3d(vertices[i * 3], vertices[i * 3 + 1], vertices[i * 3 + 2]);
 glEnd();

Рисование с массивом вершин:

glVertexPointer(3, GL_DOUBLE, 0, vertices);
glDrawArrays(GL_QUADS, 0, sizeof(vertices)/sizeof(*vertices));

Изображения:

Правильный куб, нарисованный в непосредственном режиме

Глицкий куб, нарисованный с помощью массива вершин

Что я делаю не так?

1 Ответ

5 голосов
/ 16 апреля 2011

Попробуйте изменить свой розыгрыш на

glVertexPointer(3, GL_DOUBLE, 0, vertices);
glDrawArrays(GL_QUADS, 0, 24);

sizeof () работает не так, как вы думаете. Он не возвращает количество элементов в массиве. Вам нужно как-то отслеживать количество вершин в этом массиве, а затем использовать этот счетчик в вызове glDrawArrays.

редактировать - больше информации:

Последний параметр в glDrawArrays - это количество вершин, которые вы отображаете. sizeof (вершины) должен возвращать количество байтов в GLdouble * (4 байта), а sizeof (вершины *) должен возвращать количество байтов в GLdouble (8 байтов). Тогда 4/8 технически должны округляться до нуля, поскольку они являются целыми числами, поэтому я не совсем уверен, почему он что-то рендерит.

Однако я почти уверен, что (при условии, что ваши вершины сделаны правильно), если вы измените это число на 24, оно будет работать.

...