Python 3.x Python PyOt5 OpenGL索引缓冲语法

Python 3.x Python PyOt5 OpenGL索引缓冲语法,python-3.x,opengl,pyqt5,Python 3.x,Opengl,Pyqt5,我似乎很难弄清楚如何正确地将索引缓冲区与gldrawerelements结合使用。软件基础是: 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,

我似乎很难弄清楚如何正确地将索引缓冲区与gldrawerelements结合使用。软件基础是:

  • 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
我相信这是指最后一个论点。 根据docs(),这个对象的一个实例(类型设置为IndexBuffer的QOpenGLBuffer)应该用于glDrainElements()调用。似乎不是

与文档相反,内置数组类型非常有效:

ia = array.array('I')
.... //do the same stuff
glDrawElements(GL_POINTS, 1, GL_UNSIGNED_INT, ia)
,但是我怀疑glDrawerElements()包装器每次都会上传到GPU。如果这应该是使用draw调用的正确方法,那么我想知道IndexBuffer类型的QOpenGLBuffer的使用场景

非常感谢任何指点

-塔什

好的,我想出来了。 不幸的是,这在任何地方都没有记录(既没有在Khronos的OpenGL文档中,也没有在任何Qt文档中,或者至少我没有找到它):

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


别忘了绑定正确的IBO。

似乎我没有找到这篇文章,但上面的链接正是这个问题。我确实找到了一个有点不同的解决方案,但另一个问题中发布的解决方案更一般、更全面。我假设您正确地阅读了该解决方案,以便能够得出未记录的评估结果。“我想说那也是。”瓦伦丁,我现在已经读了好几遍赫罗诺斯的页面了。也许我的英语还不够好,但我从文档中推断,我的要求是“从索引开始”做一些事情。我发布的答案是“无”,而且电话肯定不是从“无”开始的。param desc中还表示“指定指向索引存储位置的指针”。我在“IndexBuffer”中指定索引,而不是在“None”中。我想文档对我来说还不够完美。使用类型“I”array.array,2:gl.glpaurements(gl.gl\u三角形、self.n\u索引、gl.gl\u无符号\u INT、self.index\u数组)
glDrawElements(GL_POINTS, 1, GL_UNSIGNED_INT, None)