Il seguente programma Python dovrebbe disegnare un triangolo bianco nel quadrante in alto a destra della finestra.Come far funzionare i VBO con Python e PyOpenGL
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()
Non genera alcun errore, ma sfortunatamente non disegna il triangolo.
Ho anche cercato di presentare i dati del buffer come NumPy-array:
glBufferData (GL_ARRAY_BUFFER, len(vertices)*4, np.array (vertices, dtype="float32"), GL_STATIC_DRAW)
anche senza triangolo è disegnato. PyOpenGL ... Y U NO draw VBOs?
Il mio sistema: Python 2.7.3; OpenGL 4.2.0; Linux Mint Maya a 64 bit
Il secondo hit su Google per ["Vertex Buffer Object".] (Http://www.songho.ca/opengl/gl_vbo.html) –
Oh che mi ha salvato da alcuni capelli grigi. È lo stesso con 'GL.glVertexAttribPointer (0, 4, GL.GL_FLOAT, GL.GL_FALSE, 0, None)'. Passare '0' come ultimo parametro probabilmente funziona nel codice C/C++, ma apparentemente non in PyOpenGL. Deve essere "Nessuno". Ho passato diverse ore a debugging prima di aver trovato questo. Stavo già diventando pazzo. Mi hai salvato, grazie mille! –
Il parametro finale è di tipo GLvoid * e deve essere convertito in ctypes.c_void_p (offset), vedi [link] (https://bitbucket.org/tartley/gltutpy/src/tip/t02.playing-with-colors /VertexColors.py) – Adrian