Массивы вершин OpenGL

У меня есть структура с именем 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?


person Brad Zeis    schedule 18.07.2010    source источник


Ответы (2)


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

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

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

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

person Ben Zotto    schedule 18.07.2010
comment
Проблема в том, что glVertexPointer ожидает плоский массив чисел, а не Points*. Мне нужен какой-то способ сообщить glVertexPointer, что данные координат находятся в Point-›x и Point-›y, без необходимости построения плоского массива. - person Brad Zeis; 18.07.2010
comment
О, и у Polygon есть Point*s вместо Point, потому что Point является типом расширения Python. Предпочтительный способ работы с типами расширений — всегда манипулировать указателями на них. - person Brad Zeis; 18.07.2010
comment
Я обновил ответ информацией об управлении памятью C, которая, как мне кажется, является пробелом в понимании здесь. Используйте полиморфизм памяти, только если вам удобно то, что вы делаете. И я мало что знаю о Python, поэтому я предполагаю, что вы знаете, что вы там делаете. :) - person Ben Zotto; 18.07.2010
comment
Что ж, я должен был указать это в исходном вопросе, но типы расширений имеют другие члены в структурах, поэтому координатные члены Point не будут располагаться рядом друг с другом. И между элементами не будет согласованного смещения байтов, поэтому использование шага также не сработает. Похоже, мне придется построить еще один массив, содержащий только данные координат. - person Brad Zeis; 18.07.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)

person fazo    schedule 18.07.2010