2012-11-01 6 views
7

Das folgende Python-Programm sollte ein weißes Dreieck im oberen rechten Quadranten des Fensters zeichnen.Wie VBOs mit Python und PyOpenGL arbeiten können

import pygame 
from OpenGL.GL import * 
from ctypes import * 

pygame.init() 
screen = pygame.display.set_mode ((800,600), pygame.OPENGL|pygame.DOUBLEBUF, 24) 
glViewport (0, 0, 800, 600) 
glClearColor (0.0, 0.5, 0.5, 1.0) 
glEnableClientState (GL_VERTEX_ARRAY) 

vertices = [ 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0 ] 
vbo = glGenBuffers (1) 
glBindBuffer (GL_ARRAY_BUFFER, vbo) 
glBufferData (GL_ARRAY_BUFFER, len(vertices)*4, (c_float*len(vertices))(*vertices), GL_STATIC_DRAW) 

running = True 
while running: 

    for event in pygame.event.get(): 
     if event.type == pygame.QUIT: 
      running = False 

    glClear (GL_COLOR_BUFFER_BIT) 

    glBindBuffer (GL_ARRAY_BUFFER, vbo) 
    glVertexPointer (3, GL_FLOAT, 0, 0) 

    glDrawArrays (GL_TRIANGLES, 0, 3) 

    pygame.display.flip() 

Es wird keine Fehler werfen, aber leider zeichnet es nicht das Dreieck.

Ich habe auch versucht die Pufferdaten als NumPy-Array einreichen:

glBufferData (GL_ARRAY_BUFFER, len(vertices)*4, np.array (vertices, dtype="float32"), GL_STATIC_DRAW) 

Auch ist kein Dreieck gezeichnet. PyOpenGL ... Y U KEINE VBOs zeichnen?

Mein System: Python 2.7.3; OpenGL 4.2.0; Linux Mint Maya 64-Bit-

Antwort

5

Okay, fand ich es einfach:

Der 4. Parameter des glVertexPointer Aufruf None sein müssen, ein NULL-Zeiger

darstellt
glVertexPointer (3, GL_FLOAT, 0, None) 

Ich schwöre, ich letzte Nacht stundenlang gesucht und habe das nicht gesehen.

+1

Der zweite Treffer auf Google für ["Vertex Buffer Object".] (Http://www.songho.ca/opengl/gl_vbo.html) –

+0

Oh, das rettete mich aus einigen grauen Haaren. Es ist das gleiche mit 'GL.glVertexAttribPointer (0, 4, GL.GL_FLOAT, GL.GL_FALSE, 0, None)'. Die Übergabe von '0' als letzten Parameter funktioniert wahrscheinlich in C/C++ - Code, aber anscheinend nicht in PyOpenGL. Es muss "None" sein. Ich habe mehrere Stunden mit dem Debuggen verbracht, bevor ich das gefunden habe. Ich wurde schon verrückt. Du hast mich gerettet, vielen Dank! –

+0

Der letzte Parameter ist vom Typ GLvoid * und muss in einen ctypes.c_void_p (Offset) konvertiert werden, siehe [link] (https://bitbucket.org/tartley/gltutpy/src/tip/t02.playing-with-colors /VertexColors.py) – Adrian

Verwandte Themen