OpenGL中使用Python的显示列表效率如何?

1 投票
1 回答
567 浏览
提问于 2025-04-17 08:10

我一直在自学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

撰写回答