Binding issue with glDrawElements

Ognyan Moore ognyan.moore at gmail.com
Sun Oct 13 12:54:22 BST 2024


Hello,

There seems to be an issue with the binding on glDrawElements, specifically
the indices attribute.  Issue can be demonstrated w/ the following code:

import struct

from PyQt6 import QtGui, QtOpenGL
OFFSET = lambda x : x

# from PySide6 import QtGui, QtOpenGL
# from shiboken6 import VoidPtr
# OFFSET = lambda x : VoidPtr(x)

class MyWidget(QtOpenGL.QOpenGLWindow):
    def initializeGL(self):
        vtx = struct.pack('9f', 0, -1, -1, 1, -1, -1, 1, 1, 1)  # 1 bogus
float in front
        ind = struct.pack('6H', 0, 1, 2, 2, 3, 1)

        self.m_vbo =
QtOpenGL.QOpenGLBuffer(QtOpenGL.QOpenGLBuffer.Type.VertexBuffer)
        self.m_vbo.create()
        self.m_vbo.bind()
        self.m_vbo.allocate(vtx, len(vtx))

        self.m_ibo =
QtOpenGL.QOpenGLBuffer(QtOpenGL.QOpenGLBuffer.Type.IndexBuffer)
        self.m_ibo.create()
        self.m_ibo.bind()
        self.m_ibo.allocate(ind, len(ind))

        GL = self.get_functions()
        GL.glEnableVertexAttribArray(0)
        # specifying an integer offset to skip past the bogus float works
for glVertexAttribPointer
        GL.glVertexAttribPointer(0, 2, 0x1406, False, 0, OFFSET(4))

    def get_functions(self):
        vp = QtOpenGL.QOpenGLVersionProfile()
        vp.setVersion(2, 0)
        return QtOpenGL.QOpenGLVersionFunctionsFactory.get(vp,
self.context())

    def paintGL(self):
        GL = self.get_functions()
        GL.glClear(0x4000)

        # draw 2 triangles separately to demonstrate the issue

        try:
            # unlike the binding for glVertexAttribPointer, we are not able
to
            # supply an integer offset.
            GL.glColor3f(1, 0, 0)
            GL.glDrawElements(4, 3, 0x1403, OFFSET(None))

            GL.glColor3f(0, 1, 0)
            GL.glDrawElements(4, 3, 0x1403, OFFSET(6))
        except TypeError as e:
            # should have been defined as PYQT_OPENGL_BOUND_ARRAY?
            print(e)

app = QtGui.QGuiApplication([])
win = MyWidget()
win.show()
app.exec()


the except TypeError as e: print(e) outputs the following:

glDrawElements(self, mode: int, count: int, type: int, indices:
PYQT_OPENGL_ARRAY):
glDrawElements(self, mode: int, count: int, type: int, indices:
PYQT_OPENGL_ARRAY):

the OpenGL docs
<https://registry.khronos.org/OpenGL-Refpages/gl4/html/glDrawElements.xhtml>
indicate it should be a pointer to the location where the indices are
stored. With the pyside bindings, using VoidPtr(x) seems to be sufficient.
When using PyQt bindings, in other places we've often gotten what's needed
for similar arguments using lambda expressions, which we expected to be
able to do the same here as well.

Thanks,
Ogi
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://www.riverbankcomputing.com/pipermail/pyqt/attachments/20241013/9e90e2ae/attachment.htm>


More information about the PyQt mailing list