Эффективность отображения списков в 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