2012-11-01 12 views
7

Poniższy program w języku Python powinien narysować biały trójkąt w prawym górnym kwadracie okna.Jak zmusić VBO do pracy z Pythonem i 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() 

Nie spowoduje żadnych błędów, ale niestety nie rysuje trójkąta.

że próbował również przesłać dane bufora, jako NumPy-tablicy:

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

także ma trójkąta jest zasysane. PyOpenGL ... Y U NIE rysujesz VBO?

Mój system: Python 2.7.3; OpenGL 4.2.0; Linux Mint Maya 64 bit

Odpowiedz

5

porządku, po prostu znalazłem go:

4th parametr wywołania glVertexPointer musi być None reprezentujący wskaźnik NULL

glVertexPointer (3, GL_FLOAT, 0, None) 

Przysięgam, szukałem przez kilka godzin w nocy i tego nie widziałem.

+1

Drugie uderzenie w Google dla ["Vertex Buffer Object".] (Http://www.songho.ca/opengl/gl_vbo.html) –

+0

Och, to uratowało mnie przed siwymi włosami. Podobnie jest z 'GL.glVertexAttribPointer (0, 4, GL.GL_FLOAT, GL.GL_FALSE, 0, None)'. Podanie '0' jako ostatniego parametru prawdopodobnie działa w kodzie C/C++, ale najwyraźniej nie w PyOpenGL. Musi to być "Brak". Spędziłem kilka godzin na debugowaniu, zanim znalazłem to. Już szaleję. Uratowałeś mnie, wielkie dzięki! –

+0

Ostatnim parametrem jest typ GLvoid * i musi zostać przekonwertowany na ctypes.c_void_p (offset), patrz [link] (https://bitbucket.org/tartley/gltutpy/src/tip/t02.playing-with-colors /VertexColors.py) – Adrian