1

我一直在使用 Python 包装器 PyOpenGL 自学 OpenGL 编程,现在正在使用它进行我的第一个项目。这个项目是一个音乐可视化器(与 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 还是学习顶点缓冲?

注意:我发现禁用错误检查可以显着提升性能。

4

1 回答 1

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
于 2011-12-12T05:23:54.300 回答