2012-11-01 59 views
7

以下Python程序應該在窗口的右上角繪製白色三角形。如何讓VBOs使用Python和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() 

它不會拋出任何錯誤,但不幸的是它不繪製三角形。

我也試圖提交緩衝器數據作爲NumPy的陣列:

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

而且沒有三角形繪製。 PyOpenGL ...是啊不抽獎VBOs?

我的系統:Python 2.7.3; OpenGL 4.2.0; Linux Mint的瑪雅64位

回答

5

好吧,我只是覺得:

glVertexPointer調用的第四個參數必須是None代表NULL指針

glVertexPointer (3, GL_FLOAT, 0, None) 

我發誓,我搜索了幾個小時昨晚並沒有看到。

+1

第二主打在谷歌[「頂點緩衝區對象。」(http://www.songho.ca/opengl/gl_vbo.html) –

+0

哦,救了我一些白髮。 'GL.glVertexAttribPointer(0,4,GL.GL_FLOAT,GL.GL_FALSE,0,None)'是一樣的。傳遞'0'作爲最後一個參數可能適用於C/C++代碼,但顯然不在PyOpenGL中。它必須是「無」。在我找到這個之前,我花了幾個小時調試。我已經瘋了。你救了我,非常感謝! –

+0

最後一個參數是類型GLvoid *的,並且必須被轉換成ctypes.c_void_p(偏移),見[鏈接](https://bitbucket.org/tartley/gltutpy/src/tip/t02.playing-with-colors /VertexColors.py) – Adrian