2012-01-05 7 views
2

インデックス付きVBOを使用してpyOpenGLで矩形を描きたい。私はそのためglDrawRangeElements()関数を使用していますが、私は常にラインglDrawRangeElementsで同じ間違いを得る:インデックス付きのpyOpenGL VBO

WindowsError:例外:アクセス違反が0x00000000の

を読んで、私は多くのことを試してみましたが、インターネット上で探していましたコードの例を終日勉強していたので、今はどうやって進めるべきか分かりません。ここの誰かが私を助けることができればいいと思う。

これは、エラーが作成されたコードの一部であるべきである:私は本当にまだこれらすべてのものの手掛かりを持っていないことを認めざるを得ない

vertexPositions = [[-0.75, -0.75, 0.0], 
        [0.75, -0.75, 0.0], 
        [0.75, 0.75, 0.0], 
        [-0.75, 0.75, 0.0] ] 
vertexIndices = [0, 1, 2, 
       1, 2, 3] 
vertexComponents = 3 

positionBufferObject = None 
indexBufferObject = None 

x = 0 

def glGenVertexArray(): 
    vao_id = GL.GLuint(0) 
    vertex_array_object.glGenVertexArrays(1, vao_id) 
    return vao_id.value 

def initialize_vertex_buffer(): 
    global positionBufferObject, indexBufferObject 

    indexBufferObject = GL.glGenBuffers(1) 
    GL.glBindBuffer(GL.GL_ELEMENT_ARRAY_BUFFER, indexBufferObject) 

    array_type = (GL.GLushort * len(vertexIndices)) 
    GL.glBufferData(GL.GL_ELEMENT_ARRAY_BUFFER, len(vertexIndices) * 2, 
         array_type(*vertexIndices), GL.GL_STATIC_DRAW) 
    GL.glBindBuffer(GL.GL_ELEMENT_ARRAY_BUFFER, 0) 

    positionBufferObject = GL.glGenBuffers(1) 
    GL.glBindBuffer(GL.GL_ARRAY_BUFFER, positionBufferObject) 

    array_type = (GL.GLfloat * len(vertexPositions)) 
    GL.glBufferData(GL.GL_ARRAY_BUFFER, 
        len(vertexPositions[0])*len(vertexPositions)*sizeOfFloat, 
        array_type(*vertexPositions), GL.GL_STATIC_DRAW 
    ) 
    GL.glBindBuffer(GL.GL_ARRAY_BUFFER, 0) 
    glBindVertexArray(glGenVertexArray()) 


def init(): 
    initialize_vertex_buffer() 


def display(): 
    global x 
    GL.glClearColor(0.0, 0.0, 0.0, 0.0) 
    GL.glClear(GL.GL_COLOR_BUFFER_BIT) 

    GL.glMatrixMode(GL.GL_MODELVIEW) 
    GL.glEnableClientState(GL.GL_VERTEX_ARRAY) 
    GL.glEnableClientState(GL.GL_INDEX_ARRAY) 
    GL.glLoadIdentity() 
    GL.glTranslate(0, 0, -5) 
    GL.glRotate(x, 0, 1, 0) 

    GL.glBindVertexArray(glGenVertexArray()) 
    GL.glBindBuffer(GL.GL_ARRAY_BUFFER, positionBufferObject) 
    GL.glBindBuffer(GL.GL_ELEMENT_ARRAY_BUFFER, indexBufferObject) 
    GL.glEnableVertexAttribArray(0) 

    GL.glDrawRangeElements(GL.GL_TRIANGLES,0, 4, 6, GL.GL_UNSIGNED_SHORT, c_void_p(0)) 

    #GL.glVertexAttribPointer(0, vertexComponents, GL.GL_FLOAT, False, 0, null) 

    #GL.glDrawArrays(GL.GL_QUADS, 0, len(vertexPositions)/vertexComponents) 

    GL.glDisableVertexAttribArray(0) 
    GL.glDisableClientState(GL.GL_VERTEX_ARRAY) 
    GL.glDisableClientState(GL.GL_INDEX_ARRAY) 

    pygame.display.flip() 

、という理由だけで、それを理解しようとしています私はこのプロジェクトのためにそれを必要とするので、任意の追加的なミスがあった場合、私はこれまでのところ、私の教えてください見落としている、事前に)

感謝を

答えて

1

べきではない、あなたのコール:

GL.glBindVertexArray (glGenVertexArray()) 

はまた、あなたはおそらく、あなたが後でそれを削除し、それが使用するリソースを解放することができますので、その頂点配列のトラックを維持したい

GL.glBindVertexArray (GL.glGenVertexArray()) 

なります。

+0

実際に私は自分の関数glGenVertexArray()を定義しました –

+0

まだ、あなたは 'display'関数で毎回新しいものを作成したくありません。 'init'で一度作成して再利用してください。 – kloffy

関連する問題