【问题标题】:minimalist PyOpenGL example in PyQt5 applicationPyQt5 应用程序中的极简 PyOpenGL 示例
【发布时间】:2017-11-30 13:30:45
【问题描述】:

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

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.size, vertices, GL.GL_STATIC_DRAW)

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

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


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

【问题讨论】:

    标签: python pyqt pyside pyopengl


    【解决方案1】:

    好的,我终于找到了我的错误:

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

    GL.glVertexAttribPointer(0, 2, GL.GL_FLOAT, GL.GL_FALSE, 0, None)  # i.e. None instead of 0
    

    完整的简约示例如下:

    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!这段代码真的是最短的……

    【讨论】:

      【解决方案2】:

      如果你使用 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_()
      

      【讨论】:

        猜你喜欢
        • 2011-12-27
        • 1970-01-01
        • 2011-07-15
        • 2011-02-24
        • 1970-01-01
        • 2011-07-30
        • 1970-01-01
        • 2019-09-08
        • 1970-01-01
        相关资源
        最近更新 更多