2017-06-27 16 views
0

我在學習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_() 

回答

0

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!此代碼真的只是最短的...