Вершинные массивы OpenGL - PullRequest
1 голос
/ 18 июля 2010

У меня есть структура с именем Point (которая является расширением Python), которая выглядит следующим образом:

struct Point {
    PyObject_HEAD    // Macro that expands to include a few more members
    double x;
    double y;
};

И у меня есть другая структура, которая будет содержать несколько таких объектов в двух массивах:

struct Polygon {
    int length;
    Point **vertex_points;
    Point **texcrd_points;
}

Я хочу использовать их для сопоставления вершин и координат текстуры многоугольника с массивами вершин.Проблема в том, что вершинные массивы ожидают массивы в формате:

[x, y, x, y, x, y, etc]

Есть ли способ, которым я могу вызвать glVertexPointer и glTexCoordPointer с помощью Polygon->vertex_points и Polygon->texcrd_points, или мне нужно создатьновые массивы, которые соответствуют тому, что ожидает gl * Pointer?

Ответы [ 2 ]

2 голосов
/ 18 июля 2010

Вы можете вызвать glVertexPointer с базой вашего массива вершин и glTexCoordPointer с базой массива текстурных координат.Пока количество элементов в этих массивах совпадает с правильным (одинаковым) числом вершин, это должно работать нормально.

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

Если вы слишком новичок вC, чтобы иметь это концептуально под вашим поясом (наряду с предостережениями о расположении памяти), тогда вам нужно просто скопировать все двойники в новый массив перед вызовом GL.

Я подвергаю сомнению пару вещей: возможно, здесь отсутствует код, но наличие Point** вместо Point* выглядит подозрительно, поскольку glVertexPointer и т. Д. Будут ожидать плоский массив значений здесь.К тому же, хотя он, вероятно, уже выровнен нормально, теоретически массив этих структур не может быть запакован в память.Вы можете сделать это явно в зависимости от вашего компилятора, или вы можете поиграть с параметром stride в вызовах GL, чтобы явно указать расстояние в памяти между каждым вертиком.

0 голосов
/ 18 июля 2010

http://www.opengl.org/sdk/docs/man/xhtml/glVertexPointer.xml

http://www.opengl.org/sdk/docs/man/xhtml/glTexCoordPointer.xml

параметр 'size' в обеих функциях, вероятно, то, что вам нужно (и вам нужно 2 для вершин - struct Point и 'type' = GL_DOUBLE)

...