Python PyOt5 OpenGL Indexbuffer语法

时间:2017-04-19 09:49:44

标签: python-3.x opengl pyqt5

我似乎无法弄清楚如何正确使用索引缓冲区和glDrawElements。软件基础是:

  • Python 3.5.2
  • OpenGL 4.5(版本函数4.1核心加载)
  • Qt 5.7.1

当我创建并使用这样的缓冲区时:

ibo = QOpenGLBuffer(QOpenGLBuffer.IndexBuffer)
ibo.create()
.... //do some stuff like filling with data here
glDrawElements(GL_POINTS, 1, GL_UNSIGNED_INT, ibo)

我收到错误说:

Traceback (most recent call last):
  File "ogltest.py", line 134, in paintGL
    glDrawElements(GL_POINTS, 1, GL_UNSIGNED_INT, ibo)
TypeError: QOpenGLFunctions_4_1_Core.glDrawElements(): array must be a sequence or a buffer

我认为这是指最后一个论点。 根据文档(http://doc.qt.io/qt-5/qopenglbuffer.html),该对象的一个​​实例(类型设置为IndexBuffer的QOpenGLBuffer)应该在glDrawElements()调用中使用。看似没有。

与文档相反,内置数组类型效果很好:

ia = array.array('I')
.... //do the same stuff
glDrawElements(GL_POINTS, 1, GL_UNSIGNED_INT, ia)

,但我怀疑glDrawElements()包装器每次都会上传到GPU。如果这应该是使用绘制调用的正确方法,那么我想知道IndexBuffer类型的QOpenGLBuffer的使用场景。

非常感谢任何指针!

-Tasche

1 个答案:

答案 0 :(得分:0)

好的,我明白了。 不幸的是,这在任何地方都没有记录(无论是在Khronos的OpenGL文档还是在任何Qt文档中,或者至少我没有找到它):

当您打算使用驻留在GPU上的索引缓冲区时,将Null指针传递给绘制调用(C ++)。在Python中,这转换为传递“无”:

glDrawElements(GL_POINTS, 1, GL_UNSIGNED_INT, None)

不要忘记绑定正确的IBO。