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()
这样做的话,我可以渲染大约10,000个立方体,但当数量增多时,我开始注意到帧率下降。虽然这样还可以,但我希望能更快一点,这样我的程序就能在性能较差的电脑上运行。所以我想问:
渲染很多相同但独立的物体,最有效的方法是什么?这样做的性能会比我现在使用显示列表好很多吗?我应该使用C语言还是学习顶点缓冲?
注意:我发现关闭错误检查可以显著提高性能。
1 个回答
1
这就像常识出错了一样。你在画完cube
之后手动恢复了变换(glTranslatef(-x,-y,-z)
),这样一来,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