1

私は、Python ラッパー PyOpenGL を使用して OpenGL プログラミングを独学で学んでおり、現在、それを使用した最初のプロジェクトに取り組んでいます。このプロジェクトは、多数の独立して移動し、独立して色付けされた立方体を使用する音楽ビジュアライザー (whitecap と似ていません) です。

私の現在の方法は、1 つの立方体の表示リストを作成し、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は、理由もなく 2 回呼び出されるだけでなく、すべての作業を行ったために役に立たなくなります。正しいコードは次のようになります。

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 に答える