glBufferData 仍然崩溃
glBufferData still crashes
我正在尝试根据以下示例创建 Python OpenGL 代码:
https://www.opengl.org/wiki/Tutorial2:_VAOs,_VBOs,_Vertex_and_Fragment_Shaders_(C_/_SDL)
我在调用 glBufferData 时面临应用程序崩溃。
我遇到的问题和这里提到的一样:
and http://www.cplusplus.com/forum/beginner/47978/
但是,这些页面中提到的解决方案 仍然无效。我正在使用 PyQt5.5,Python 3.4.0 和 PyOpenGL 3.1。此外,GPU Caps Viewer 报告说我的机器上可以使用 Open GL 4.5。
非常感谢任何有助于移动的帮助或指示。
注意:在崩溃时启动 PyDev 调试器时,检查
self.context().isValid()
返回真值
初始化代码如下:
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_() )
问题已解决。对
的调用
self._deltaPositions.tolist()
导致了问题。我将其替换为
self._deltaPositions.tostring()
崩溃消失了。
我正在尝试根据以下示例创建 Python OpenGL 代码: https://www.opengl.org/wiki/Tutorial2:_VAOs,_VBOs,_Vertex_and_Fragment_Shaders_(C_/_SDL)
我在调用 glBufferData 时面临应用程序崩溃。
我遇到的问题和这里提到的一样:
但是,这些页面中提到的解决方案 仍然无效。我正在使用 PyQt5.5,Python 3.4.0 和 PyOpenGL 3.1。此外,GPU Caps Viewer 报告说我的机器上可以使用 Open GL 4.5。
非常感谢任何有助于移动的帮助或指示。
注意:在崩溃时启动 PyDev 调试器时,检查
self.context().isValid()
返回真值
初始化代码如下:
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_() )
问题已解决。对
的调用self._deltaPositions.tolist()
导致了问题。我将其替换为
self._deltaPositions.tostring()
崩溃消失了。