我似乎无法弄清楚如何正确使用索引缓冲区和glDrawElements。软件基础是:
当我创建并使用这样的缓冲区时:
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
答案 0 :(得分:0)
好的,我明白了。 不幸的是,这在任何地方都没有记录(无论是在Khronos的OpenGL文档还是在任何Qt文档中,或者至少我没有找到它):
当您打算使用驻留在GPU上的索引缓冲区时,将Null指针传递给绘制调用(C ++)。在Python中,这转换为传递“无”:
glDrawElements(GL_POINTS, 1, GL_UNSIGNED_INT, None)
不要忘记绑定正确的IBO。