PyQt5应用程序中的极简PyOpenGL示例
问题描述:
我在学习PyOpenGL
并在PyQt5
应用程序中使用它。我试图将我的一些简单示例从C++
/Qt
转换为Python
。以下示例应在黑色背景上绘制白色三角形。至少它在相应的代码中包含C++
/Qt
代码。但它什么都不做,只是一个黑色的窗口。任何想法我失踪?请注意,我需要使用着色器的“现代”方法(但根据我的知识 - 我可能是错的 - 下面的代码应该使用默认的平凡着色器,即2D中的白色),而不是所有旧式的glBegin()
,glEnd()
。PyQt5应用程序中的极简PyOpenGL示例
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_()
答
OK,终于,我发现我的错误:
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_()
注意,然而,这不遵循'最好的公关actice' - 你应该使用着色器和VAO!此代码真的只是最短的...