簡體   English   中英

如何使用 PyQt5 OpenGL 將索引指定為 void * 到 glDrawElements

[英]How to specify indices as void * to glDrawElements with PyQt5 OpenGL

我想在同一個元素緩沖區 object 上多次調用 glDrawElements,其中每個繪制調用訪問元素緩沖區 object 的不同部分。 因此,在 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類型是什么意思? 我似乎在這里或在 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, self._images[i].shape[1], self._images[i].shape[0], 0, glf.GL_DEPTH_COMPONENT, glf.GL_FLOAT, self. _images[i].flatten().tolist())

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM