Эффективность отображения списков в OpenGL с Python? - PullRequest
1 голос
/ 12 декабря 2011

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

Мой текущий метод состоит в том, чтобы иметь список отображения для одного куба и вызывать его многократно изменяя цвет и местоположение с помощью glColor и glTranslatef, например, так (псевдокод):

glPushMatrix()
glPushMatrix() #Why do I need to call this twice?
for x in xrange(...):
    for z in xrange(...):
        y = height[x,z] #numpy array
        glTranslatef(x,y,z)
        glColor((r,g,b))
        glCallList(cube)
        glTranslatef(-x,-y,-z)
glPopMatrix()
glPopMatrix()

Таким образом, я могу сделать около 10000 кубов, прежде чем я начну замечать частоту кадров, это нормально, но я бы хотел, чтобы она была быстрее, поэтому моя программа переносима на менее способные компьютеры, поэтому мой вопрос:

Какой самый эффективный способ сделать много одинаковых, но независимые объекты, и я получу гораздо лучшую производительность, чем я теперь используете списки отображения? Должен ли я использовать C или обучение вершины Буферизация

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

1 Ответ

1 голос
/ 12 декабря 2011

Как будто здравый смысл был неправ. Вы вручную восстанавливаете преобразование (glTranslatef(-x,-y,-z)) после рисования cube, поэтому glPopMatrix не только вызывается дважды без причины, но и бесполезно, потому что вы сделали всю работу для него. Правильный код хотел бы так:

for x in xrange(...):
    for z in xrange(...):
        y = height[x,z] #numpy array
        glPushMatrix() #Remember the matrix
        glTranslatef(x,y,z) #change the matrix
        glColor((r,g,b))
        glCallList(cube)
        glPopMatrix() #Restore tha matrix as it was before glTranslate changed it
...