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-
Der zweite Treffer auf Google für ["Vertex Buffer Object".] (Http://www.songho.ca/opengl/gl_vbo.html) –
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! –
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