2010-07-18 3 views
1

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

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 * Указатель ожидает ?

ответ

2

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

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

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

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

+0

Проблема в том, что glVertexPointer ожидает плоский массив чисел, а не точек *. Мне нужно каким-то образом сказать glVertexPointer, что данные координат находятся в Point-> x и Point-> y, не создавая плоский массив. –

+0

О, а в Polygon есть Point ** s вместо Point * s, потому что Point - это тип расширения Python. Предпочтительный способ работы с типами расширений - всегда манипулировать указателями. –

+0

Я обновил ответ с информацией управления памятью C, которая, по моему мнению, является понимающим недостатком. Используйте «полиморфизм памяти», только если вам комфортно с тем, что вы делаете. И я мало знаю о Python, поэтому я предполагаю, что вы знаете, что вы там делаете. :) –