2016-04-07 8 views
1

Ich versuche, Python OpenGL-Code zu erstellen, die auf das folgende Beispiel basiert: https://www.opengl.org/wiki/Tutorial2:_VAOs,_VBOs,_Vertex_and_Fragment_Shaders_(C_/_SDL)glBufferData stürzt noch

ich einen Absturz der Anwendung bin vor, wenn glBufferData aufgerufen wird.

Das Problem, das ich Gesicht ist das gleiche wie die, die hier erwähnt: Crash on glBufferData und http://www.cplusplus.com/forum/beginner/47978/

jedoch die in diesen Seiten erwähnten Lösungen sind nicht noch arbeiten. Ich benutze PyQt5.5, Python 3.4.0 mit PyOpenGL 3.1. Außerdem meldet GPU Caps Viewer, dass Open GL 4.5 auf meinem Computer verfügbar ist.

Jede Hilfe oder Hinweise, um in Bewegung zu kommen, wird sehr geschätzt.

Hinweis: Beim Starten des PyDev Debugger zum Zeitpunkt des Absturzes, das Kontroll

self.context().isValid() 

Der Initialisierungscode unter Wahr zurückgegeben wird:

from PyQt5 import QtGui, QtCore 
import sys, array 
from OpenGL import GL 

class PulleysWithWeights3D(QtGui.QOpenGLWindow): 

    def __init__(self): 
     super().__init__() 

     # These are the 4D coordinates of a triangle that needs to be drawn. 
     _vertexPos = [ 0.075, 0.075, 0.075, 0.075, \ 
         0.275, 0.275, 0.275, 0.075, \ 
         0.550, 0.550, 0.550, 0.075 ] 

     # These are the RGBA colours for each vertex. 
     _vertexCols = [ 0.875, 0.525, 0.075, 0.500, \ 
         0.875, 0.525, 0.075, 0.500, \ 
         0.875, 0.525, 0.075, 0.500 ] 

     self._deltaPositions = array.array('f', _vertexPos) 
     self._deltaColours = array.array('f', _vertexCols) 

     self._appSurfaceFormat = QtGui.QSurfaceFormat() 

     self._appSurfaceFormat.setProfile(QtGui.QSurfaceFormat.CoreProfile) 
     self._appSurfaceFormat.setMajorVersion(4) 
     self._appSurfaceFormat.setMinorVersion(2) 
     self._appSurfaceFormat.setRenderableType(QtGui.QSurfaceFormat.OpenGL) 
     self._appSurfaceFormat.setSamples(16)   
     self._appSurfaceFormat.setSwapBehavior(QtGui.QSurfaceFormat.DoubleBuffer) 
     self.setSurfaceType(QtGui.QSurface.OpenGLSurface) 

     self.setFormat(self._appSurfaceFormat) 

     self.setIcon(QtGui.QIcon('OpenGL.png')) 
     self.setTitle('Pulleys3D') 
     self.setMinimumSize(QtCore.QSize(1280, 640)) 
     self.show() 


    def initializeGL(self): 

     GL.glClearColor(0.0, 0.0, 0.0, 0.500) # RGBA 
     GL.glClearDepthf(1.0) 
     GL.glClearStencil(0) 
     GL.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT | GL.GL_STENCIL_BUFFER_BIT) 

     self._vaoColouredDelta = GL.glGenVertexArrays(1) 
     GL.glBindVertexArray(self._vaoColouredDelta) 

     self._vboPositions = GL.glGenBuffers(1) 
     GL.glBindBuffer(GL.GL_ARRAY_BUFFER, self._vboPositions) 

     GL.glBufferData(GL.GL_ARRAY_BUFFER, \ 
         self._deltaPositions.buffer_info()[1] * self._deltaPositions.itemsize, \ 
         self._deltaPositions.tolist(), GL.GL_STATIC_DRAW) 

     # PS: Code has been stopped here. 

    def resizeGL(self, wd, ht): 
     GL.glViewport(0, 0, wd, ht) 


    def paintGL(self): 
     pass 


if __name__ == '__main__': 
    _pww3dApp = QtGui.QGuiApplication(sys.argv) 
    _pww3d = PulleysWithWeights3D() 
    sys.exit(_pww3dApp.exec_()) 
+0

Der Code im folgenden Beispiel scheint glBufferData mit 3 Parametern zu verwenden, während PyOpenGL 4 angibt. [Link] (http://stackoverflow.com/questions/11125827/how-to-use-glbufferdata-in-pyopengl?rq = 1). Ich probiere das aus. –

+0

Gibt es irgendwelche registrierten OpenGL-Fehler vor glBufferData? – Andreas

+0

@Andreas Nein, in der Debug-Konsole sind keine Fehler aufgeführt, wenn Sie den Code einzeln durchlaufen. –

Antwort

0

Die Frage wurde gelöst. Der Anruf an

verursachte das Problem. Ich ersetzte es mit

self._deltaPositions.tostring() 

und der Absturz geht weg.