Python PyQt5应用程序中的最小PyOpenGL示例

Python PyQt5应用程序中的最小PyOpenGL示例,python,pyqt,pyside,pyopengl,Python,Pyqt,Pyside,Pyopengl,我正在学习PyOpenGL并在PyQt5应用程序中使用它。我正在尝试将一些旧的简单示例从C++/Qt转换为Python。以下示例应在黑色背景上绘制白色三角形。至少在相应的C++/Qt代码中是这样。但它什么也没做,只是一扇黑色的窗户。你知道我遗漏了什么吗?请注意,我需要使用着色器的“现代”方法(但据我所知-我可能错了-下面的代码应该只使用默认的普通着色器,即2D中的白色),而不是所有那些陈旧的glBegin(),glEnd() 好的,最后,我发现了我的错误: GL.glBufferData(GL.

我正在学习
PyOpenGL
并在
PyQt5
应用程序中使用它。我正在尝试将一些旧的简单示例从
C++
/
Qt
转换为
Python
。以下示例应在黑色背景上绘制白色三角形。至少在相应的
C++
/
Qt
代码中是这样。但它什么也没做,只是一扇黑色的窗户。你知道我遗漏了什么吗?请注意,我需要使用着色器的“现代”方法(但据我所知-我可能错了-下面的代码应该只使用默认的普通着色器,即2D中的白色),而不是所有那些陈旧的
glBegin()
glEnd()


好的,最后,我发现了我的错误:

GL.glBufferData(GL.GL_ARRAY_BUFFER, vertices.nbytes, vertices, GL.GL_STATIC_DRAW)  # nbytes instead of size

完整的简约示例如下所示:

import numpy as np
from OpenGL import GL
from PyQt5.QtWidgets import QOpenGLWidget, QApplication


class OpenGLWidget(QOpenGLWidget):

    def initializeGL(self):
        vertices = np.array([0.0, 1.0, -1.0, -1.0, 1.0, -1.0], dtype=np.float32)

        bufferId = GL.glGenBuffers(1)
        GL.glBindBuffer(GL.GL_ARRAY_BUFFER, bufferId)
        GL.glBufferData(GL.GL_ARRAY_BUFFER, vertices.nbytes, vertices, GL.GL_STATIC_DRAW)

        GL.glEnableVertexAttribArray(0)
        GL.glVertexAttribPointer(0, 2, GL.GL_FLOAT, GL.GL_FALSE, 0, None)

    def paintGL(self):
        GL.glDrawArrays(GL.GL_TRIANGLES, 0, 3)


app = QApplication([])
widget = OpenGLWidget()
widget.show()
app.exec_()
请注意,这并不遵循“最佳实践”-您应该使用着色器和VAO!这段代码实际上是最短的…

如果您使用PySide2(它是Qt的官方绑定),您需要编写这行代码

QApplication.setAttribute(Qt.AA_UseDesktopOpenGL)
main.py

import numpy as np
from OpenGL import GL
from PySide2.QtWidgets import QOpenGLWidget, QApplication
from PySide2.QtCore import Qt


class OpenGLWidget(QOpenGLWidget):

    def initializeGL(self):
        vertices = np.array([0.0, 1.0, -1.0, -1.0, 1.0, -1.0], dtype=np.float32)

        bufferId = GL.glGenBuffers(1)
        GL.glBindBuffer(GL.GL_ARRAY_BUFFER, bufferId)
        GL.glBufferData(GL.GL_ARRAY_BUFFER, vertices.nbytes, vertices, GL.GL_STATIC_DRAW)

        GL.glEnableVertexAttribArray(0)
        GL.glVertexAttribPointer(0, 2, GL.GL_FLOAT, GL.GL_FALSE, 0, None)

    def paintGL(self):
        GL.glDrawArrays(GL.GL_TRIANGLES, 0, 3)


QApplication.setAttribute(Qt.AA_UseDesktopOpenGL)
app = QApplication([])
widget = OpenGLWidget()
widget.show()
app.exec_()
QApplication.setAttribute(Qt.AA_UseDesktopOpenGL)
import numpy as np
from OpenGL import GL
from PySide2.QtWidgets import QOpenGLWidget, QApplication
from PySide2.QtCore import Qt


class OpenGLWidget(QOpenGLWidget):

    def initializeGL(self):
        vertices = np.array([0.0, 1.0, -1.0, -1.0, 1.0, -1.0], dtype=np.float32)

        bufferId = GL.glGenBuffers(1)
        GL.glBindBuffer(GL.GL_ARRAY_BUFFER, bufferId)
        GL.glBufferData(GL.GL_ARRAY_BUFFER, vertices.nbytes, vertices, GL.GL_STATIC_DRAW)

        GL.glEnableVertexAttribArray(0)
        GL.glVertexAttribPointer(0, 2, GL.GL_FLOAT, GL.GL_FALSE, 0, None)

    def paintGL(self):
        GL.glDrawArrays(GL.GL_TRIANGLES, 0, 3)


QApplication.setAttribute(Qt.AA_UseDesktopOpenGL)
app = QApplication([])
widget = OpenGLWidget()
widget.show()
app.exec_()