Как указать индексы как void * для glDrawElements с PyQt5 OpenGL - PullRequest
1 голос
/ 06 апреля 2020

Я хочу вызывать 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

Вызов Draw выглядит следующим образом. Мне известно, что я могу напрямую использовать весь элементный буфер для рисования двух треугольников, но я хочу иметь возможность использовать эту функциональность 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 для установки объектов буфера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...