如何在Python和PyOpenGL中使用VBOs

11
以下 Python 程序应该在窗口的右上象限绘制一个白色三角形。
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...为什么不绘制VBO?

我的系统:Python 2.7.3; OpenGL 4.2.0; Linux Mint Maya 64位

1个回答

11

好的,我刚找到了:

glVertexPointer 调用的第四个参数必须是 None,表示一个空指针。

glVertexPointer (3, GL_FLOAT, 0, None)

我发誓,昨晚我搜寻了好几个小时,但没看到那个。


1
在谷歌上搜索"Vertex Buffer Object".,第二个结果。 - Nicol Bolas
1
哦,这救了我一命。GL.glVertexAttribPointer(0, 4, GL.GL_FLOAT, GL.GL_FALSE, 0, None)也是一样的。在C/C++代码中将0作为最后一个参数传递可能有效,但在PyOpenGL中显然不行。它必须是None。在我发现这个问题之前,我花了几个小时进行调试。我已经快疯了。你救了我,非常感谢! - Jiří Stránský
1
最终参数的类型为GLvoid*,必须转换为ctypes.c_void_p(offset),请参见链接 - Adrian
嘿,Adrian。我每天花了大约2个小时一周,但是无法找出如何使用ctypes模块中的void这个最后一个问题。现在一切都清楚了。我已经为游戏制作了许多令人惊叹的3D模型,并且已经编程了90%,但它使用的是固定功能管道,而且很卡顿,但现在,通过一些优化,我也可以使用现代OpenGL管道,并且我知道它将大大提高性能。非常感谢!我希望我能做更多,而不仅仅是说声谢谢... - Mudit Bhatia

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接