Эффективность отображения списков в OpenGL с Python?

Я учил себя программированию 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 ответ

Решение

Это как здравый смысл был неправ. Вы вручную восстанавливаете трансформацию (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
Другие вопросы по тегам