2012-01-05 4 views
2

Я хочу нарисовать прямоугольник в pyOpenGL, используя VBOs с индексами. Я использую glDrawRangeElements() функцию для этого, но я всегда получаю ту же ошибку в glDrawRangeElements линии:pyOpenGL VBOs с индексом

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