glBufferData по-прежнему падает

Я пытаюсь создать код Python OpenGL на основе следующего примера: https://www.opengl.org/wiki/Tutorial2:_VAOs,_VBOs,_Vertex_and_Fragment_Shaders_(C_/_SDL)

Я столкнулся со сбоем приложения при вызове glBufferData.

Проблема, с которой я сталкиваюсь, такая же, как и упомянутые здесь: Сбой в glBufferData и 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_() )

person Pralines And Cream    schedule 07.04.2016    source источник
comment
Код в следующем примере, кажется, использует glBufferData с 3 параметрами, тогда как PyOpenGL указывает 4. ">ссылка. Я пробую это.   -  person Pralines And Cream    schedule 07.04.2016
comment
Есть ли зарегистрированные ошибки OpenGL перед glBufferData?   -  person Andreas    schedule 07.04.2016
comment
@Andreas Нет, в консоли отладки нет ошибок при пошаговом выполнении кода.   -  person Pralines And Cream    schedule 07.04.2016
comment
Ошибки opengl AFAIK не передаются автоматически в консоль отладки. Вам нужно получить их вручную через glGetErrors и проанализировать их в соответствии с полученным кодом.   -  person Andreas    schedule 07.04.2016
comment
Спасибо @Andreas - это новая информация. Я попробую это.   -  person Pralines And Cream    schedule 08.04.2016
comment
@Andreas Функция glGetError() всегда возвращает GL.GL_NO_ERROR. Я устанавливаю эту проверку в нескольких местах: при создании привязки VAO, при создании привязки VBO и после вызова glBindVertexArray и glEnableVertexAttribArray.   -  person Pralines And Cream    schedule 08.04.2016
comment
Хорошо. Один раз перед заменой буфера рекомендуется для релизной версии. Я тоже поставил один после инициализации. Таким образом, производительность не сильно пострадает, и вы все равно будете иметь хорошее представление о том, работает ли программа должным образом. Во время разработки проведите дополнительные проверки или найдите отладчик (gDEBugger), который может сломаться при ошибке OpenGL.   -  person Andreas    schedule 09.04.2016
comment
Большое спасибо за ваши полезные советы, @Andreas. :).   -  person Pralines And Cream    schedule 13.04.2016


Ответы (1)


Проблема решена. Призыв к

self._deltaPositions.tolist()

вызывал проблему. я заменил его на

self._deltaPositions.tostring()

и треск уходит.

person Pralines And Cream    schedule 07.04.2016
comment
использовать tobytes() сейчас - person roberto; 04.08.2019