2012-11-01 31 views
7

Chương trình Python sau đây sẽ vẽ một hình tam giác màu trắng ở góc phần tư phía trên bên phải của cửa sổ.Cách để VBO hoạt động với Python và 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() 

Nó sẽ không ném bất kỳ lỗi nào, nhưng tiếc là nó không vẽ hình tam giác.

Tôi cũng đã cố gắng để gửi dữ liệu đệm như một NumPy mảng:

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

Cũng không có hình tam giác được vẽ. PyOpenGL ... Y U KHÔNG vẽ VBO?

Hệ thống của tôi: Python 2.7.3; OpenGL 4.2.0; Linux Mint Maya 64 bit

Trả lời

5

Được rồi, tôi chỉ tìm thấy nó:

Tham số thứ 4 của glVertexPointer gọi phải None đại diện cho một con trỏ NULL

glVertexPointer (3, GL_FLOAT, 0, None) 

Tôi thề, tôi đã tìm kiếm hàng giờ đồng hồ đêm qua và không thấy điều đó.

+1

Lần truy cập thứ hai trên Google cho ["Vertex Buffer Object".] (Http://www.songho.ca/opengl/gl_vbo.html) –

+0

Ồ đã cứu tôi khỏi mái tóc màu xám. Nó giống với 'GL.glVertexAttribPointer (0, 4, GL.GL_FLOAT, GL.GL_FALSE, 0, None)'. Chuyển '0' như tham số cuối cùng có thể hoạt động trong mã C/C++, nhưng dường như không có trong PyOpenGL. Nó phải là 'None'. Tôi đã dành vài giờ gỡ lỗi trước khi tôi tìm thấy điều này. Tôi đã phát điên rồi. Bạn đã cứu tôi, cảm ơn rất nhiều! –

+0

Thông số cuối cùng là loại GLvoid * và phải được chuyển đổi thành ctypes.c_void_p (offset), xem [link] (https://bitbucket.org/tartley/gltutpy/src/tip/t02.playing-with-colors /VertexColors.py) – Adrian

Các vấn đề liên quan