如何使用PyQt5 OpenGL将索引指定为GLDraweElements的void*

2024-09-28 12:16:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我想多次调用同一个元素缓冲区对象上的glDrawElements,其中每个draw调用访问元素缓冲区对象的不同部分。因此,在C/C++中,有许多可能的方法,其中之一就是设置void * indices参数。我使用QOpenGLWidget在PyQt5中尝试了类似的事情,但我得到了错误

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是什么意思?我似乎找不到任何暗示here之类的。虽然thispost看起来可能是重复的,但问题首先涉及到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()

最后,是指向整个示例code的链接

编辑:我不是在寻找建议使用PyOpenGL/ModernGL设置缓冲区对象的答案


Tags: topathinpyselfdirlinefile
1条回答
网友
1楼 · 发布于 2024-09-28 12:16:58

我遇到了同样的问题,最后使用numpy.ndarray.tolist()找到了解决方案

glf.glTexImage2D(glf.GL_TEXTURE_2D, 0, glf.GL_DEPTH_COMPONENT, self._images[i].shape[1], self._images[i].shape[0], 0, glf.GL_DEPTH_COMPONENT, glf.GL_FLOAT, self._images[i].flatten().tolist())

相关问题 更多 >

    热门问题