我想在同一个元素缓冲区对象上多次调用glDrawElements,其中每个draw调用都访问元素缓冲区的不同部分。因此,在C/C++中,有多种可能的方法,其中之一就是设置void * indices
参数。我在PyQt5中使用QOpenGLWidget尝试了类似的操作,但我得到了错误
Traceback (most recent call last):
File "path/to/dir/scratch.py", line 305, in paintGL
self.renderer.draw(self.m_gl)
File "path/to/dir/scratch.py", line 257, in draw
obj.drawCall(gl)
File "path/to/dir/scratch.py", line 217, in drawCall
gl.glDrawElements(gl.GL_TRIANGLES, 3, self.idxdtype, 2) # tri2.
TypeError: glDrawElements(self, int, int, int, PYQT_OPENGL_ARRAY): array must be a sequence or a buffer
类型PYQT_OPENGL_ARRAY
是什么意思?我在这里或SO上似乎找不到任何提示。尽管这篇文章看起来可能是重复的,但问题首先涉及PyOpenGL,除了建议的答案ctypes.c_void_p(int)
之外,还给出了错误
Traceback (most recent call last):
File "path/to/dir/scratch.py", line 305, in paintGL
self.renderer.draw(self.m_gl)
File "path/to/dir/scratch.py", line 257, in draw
obj.drawCall(gl)
File "path/to/dir/scratch.py", line 217, in drawCall
gl.glDrawElements(gl.GL_TRIANGLES, 3, self.idxdtype, ctypes.c_void_p(2)) # tri2.
TypeError: a 1-dimensional buffer is required
绘图调用看起来是这样的。我知道我可以直接使用整个元素缓冲区来绘制两个三角形,但我希望能够使用void * indices
的功能
def drawCall(self, gl):
self.shaderProgram.bind()
self.vao.bind()
self.shaderProgram.setUniformValue(self.u_ColorIdx, self.color)
self.shaderProgram.setUniformValue(self.u_MVPidx, self.mvpMatrix)
# tri1 would be in the y-ve region and colored red.
gl.glDrawElements(gl.GL_TRIANGLES, 3, self.idxdtype, None) # tri1
# tri2 would be in the y+ve region and colored green.
self.shaderProgram.setUniformValue(self.u_ColorIdx, QtGui.QVector4D(0.0, 0.7, 0.3, 1.0))
gl.glDrawElements(gl.GL_TRIANGLES, 3, self.idxdtype, ctypes.c_void_p(2)) # tri2.
# I am aware that I might as well rotate tri1 by 180 degrees around z-axis,
# and set u_color uniform value to green to achieve the desired effect. But I want
# to do it using indices. It seems better for a large number of objects.
self.shaderProgram.release()
self.vao.release()
最后,链接到整个示例代码。
编辑:我不是在寻找建议使用PyOpenGL/ModernGL来设置缓冲区对象的答案。
我遇到了同样的问题,最终使用numpy.ndarray.tolist((.找到了解决方案
glf.glTexImage2D(glf.GL_TEXTURE_2D,0,glf.GL_DEPTH_COMPONENT,自我_图像[i]。形状[1],自我_图像[i].shape[0],glf。GL_DEPTH_COMPONENT,glf。GL_ FLOAT,自我_images[i].platin((.tolist((