0

私はOpenGL Programming Guideから OpenGL を学んでおり、立方体の単純な 3D ビューが機能しています。VBO を使用するとパフォーマンスが向上することがわかっており、それらを使用するようにコードを変更したいと考えています。これを機能させるのに問題があり、オンラインできれいな例を実際に見つけていません。

これが私が取り組んでいるものです。

私のインポートは次のとおりです。

import numpy as np

from OpenGL.GL import *
from OpenGL.arrays import vbo
from OpenGL.GLU import *
from OpenGL.GLUT import *

私の初期化では、次のものがあります。

    # Unit cube, centered at the origin.
    self.positions = np.array([(0.5, -0.5, -0.5), (0.5, 0.5, -0.5),
                               (0.5, 0.5, 0.5), (0.5, -0.5, 0.5),
                               (-0.5, 0.5, -0.5), (-0.5, -0.5, -0.5),
                               (-0.5, -0.5, 0.5), (-0.5, 0.5, 0.5),
                               (-0.5, 0.5, -0.5), (-0.5, 0.5, 0.5),
                               (0.5, 0.5, 0.5), (0.5, 0.5, -0.5),
                               (-0.5, -0.5, 0.5), (-0.5, -0.5, -0.5),
                               (0.5, -0.5, -0.5), (0.5, -0.5, 0.5),
                               (-0.5, -0.5, 0.5), (0.5, -0.5, 0.5),
                               (0.5, 0.5, 0.5), (-0.5, 0.5, 0.5),
                               (0.5, -0.5, -0.5), (-0.5, -0.5, -0.5),
                               (-0.5, 0.5, -0.5), (0.5, 0.5, -0.5)],
                              dtype=np.float32)
    self.normals = np.array([(1.0, 0.0, 0.0), (1.0, 0.0, 0.0),
                             (1.0, 0.0, 0.0), (1.0, 0.0, 0.0),
                             (-1.0, 0.0, 0.0), (-1.0, 0.0, 0.0),
                             (-1.0, 0.0, 0.0), (-1.0, 0.0, 0.0),
                             (0.0, 1.0, 0.0), (0.0, 1.0, 0.0),
                             (0.0, 1.0, 0.0), (0.0, 1.0, 0.0),
                             (0.0, -1.0, 0.0), (0.0, -1.0, 0.0),
                             (0.0, -1.0, 0.0), (0.0, -1.0, 0.0),
                             (0.0, 0.0, 1.0), (0.0, 0.0, 1.0),
                             (0.0, 0.0, 1.0), (0.0, 0.0, 1.0),
                             (0.0, 0.0, -1.0), (0.0, 0.0, -1.0),
                             (0.0, 0.0, -1.0), (0.0, 0.0, -1.0)],
                            dtype=np.float32)

    self.faces = np.array(range(24), dtype=np.uint32)

私の描画コードでは:

    # clear color and depth buffers
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)

    glEnableClientState(GL_VERTEX_ARRAY)
    glEnableClientState(GL_NORMAL_ARRAY)

    # self.position_vbo.bind()
    glVertexPointer(3, GL_FLOAT, 0, self.positions)

    # self.normal_vbo.bind()
    glNormalPointer(GL_FLOAT, 0, self.normals)

    glColor3f(0., 1., 0.)
    glDrawElements(GL_QUADS, 24, GL_UNSIGNED_INT, self.faces)

    glDisableClientState(GL_VERTEX_ARRAY)
    glDisableClientState(GL_NORMAL_ARRAY)

これを VBO を使用するようにリファクタリングするために、これを init に追加しました。

    self.position_vbo = vbo.VBO(self.positions)
    self.normal_vbo = vbo.VBO(self.normals)
    self.faces_vbo = vbo.VBO(self.faces, target=GL_ELEMENT_ARRAY_BUFFER)

VBO をバインドするように描画を変更しました。

    # clear color and depth buffers
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)

    glEnableClientState(GL_VERTEX_ARRAY)
    glEnableClientState(GL_NORMAL_ARRAY)

    self.position_vbo.bind()
    glVertexPointer(3, GL_FLOAT, 0, 0)

    self.normal_vbo.bind()
    glNormalPointer(GL_FLOAT, 0, 0)

    self.faces_vbo.bind()
    glIndexPointer(GL_UNSIGNED_INT, 0, 0)

    glColor3f(0., 1., 0.)
    glDrawElements(GL_QUADS, 24, GL_UNSIGNED_INT, None)

    glDisableClientState(GL_VERTEX_ARRAY)
    glDisableClientState(GL_NORMAL_ARRAY)

また、位置と法線のみを VBO に配置して、そのままにしておくことも試みましたfacesNoneまた、glDrawElements の代わりに 0 を使用してみました。

PyOpenGL で利用可能なラッパーを使用しないことを除いて、ここに同様の質問があります。vbo.VBO

4

1 に答える 1