2015-08-25 3 views
1

У меня проблемы с PyOpenGL функция glDrawArrays() при рисовании VBO. У меня есть объект (класс) ContactGeometry и создать VBO методом create_VBO() и отображения VBO методом paintGL_VBO():PyOpenGL: glDrawArrays() - WindowsError: exception: чтение нарушения доступа 0x0000000000000000

class ContactGeometry(object): 
    def __init__(self, _area=None, body=None, filename=None, uP=None, parent=None): 
     ... 
     self.VBO_created = False 

    def create_VBO(self): 
     if not self.VBO_created: 
      # generate a new VBO and get the associated vbo_id 
      num_of_VBOs = 1 
      # create buffer name 
      self.vbo_id = GLuint() 
      self.vbo_id = glGenBuffers(num_of_VBOs) 
      # bind name to buffer 
      glBindBuffer(GL_ARRAY_BUFFER, self.vbo_id) 
      self.vbo_data = np.hstack((self.contact_nodes)) 
      self.N = len(self.contact_nodes) 
      self.vbo_data = np.array(self.vbo_data, dtype='float32').flatten() 
      # VBO_data size in bytes 
      self.VBO_data_size_in_bytes = arrays.ArrayDatatype.arrayByteCount(self.vbo_data) 
      # add VBO data to buffer 
      glBufferData(GL_ARRAY_BUFFER, self.VBO_data_size_in_bytes, self.vbo_data, GL_STATIC_DRAW) 
      self.VBO_created = True 

    def paintGL_VBO(self): 
     if self._visible and self.VBO_created: 
      glBindBuffer(GL_ARRAY_BUFFER, self.vbo_id) 
      # pointers 
      v_pointer = ctypes.c_void_p(0 
      # stride in bits (1 float = 4 bits) 
      stride_in_bits = 0 
      glVertexPointer(3, GL_FLOAT, stride_in_bits, v_pointer) 
      glDisable(GL_LIGHTING) 
      glDrawArrays(GL_LINE_STRIP, 0, self.N) 
      glEnable(GL_LIGHTING) 
      glBindBuffer(GL_ARRAY_BUFFER, 0) 

Проблема заключается в том, что программа работает нормально на платформе со свойствами:

PyOpenGL_version = 3.1.0a1 
GL Version: 4.2.12217 Compatibility Profile Context 12.104.0.0 
GL Vendor: ATI Technologies Inc. 
GL Renderer: AMD Radeon HD 6300M Series 

Но NOT OK на платформе со свойствами:

PyOpenGL_version = 3.0.2 
GL Version: 4.3.0 
GL Vendor: NVIDIA Corporation 
GL Renderer: Quadro 600/PCIe/SSE2 

Как возвращает следующее сообщение об ошибке:

WindowsError: exception: access violation reading 0x0000000000000000 

Любые идеи, как исправить это, поскольку я хотел бы запустить код на нескольких платформах (с разными графическими процессорами). Это очень иррационально, как код работает на старой версии программного обеспечения, но не на новой версии ...

В init() класса OpenGLWidget я установил:

class OpenGLWidget(QtOpenGL.QGLWidget): 
    def __init__(self, parent=None): 
     ... 
     # core profile 
     glformat = QtOpenGL.QGLFormat() 
     glformat.setProfile(QtOpenGL.QGLFormat.CompatibilityProfile) 
+1

Проверьте, self.contact_nodes правильно распределена. Ошибка, которую вы получаете, предполагает, что вы пытаетесь прочитать значение нулевого указателя. – Xirema

+0

@Xirema, если я напечатаю указатель на 'self.contact_nodes', будут напечатаны правильные данные. Также, если я запускаю 'glIsBuffer (self.vbo_id)' на обеих платформах, он возвращает '1'. – avstenit

+1

Назначьте «длину» как переменную в предыдущей строке перед glDrawArrays(), например: «int length = len (self.contact_nodes)», затем используйте «glDrawArrays (GL_TRIANGLES, 0, length)». Сообщите мне, если это изменит местоположение ошибки или нет. – Xirema

ответ

1

Я думаю, что я нашел проблему и решить ее ... Проблема заключалась в том, что я включен нормальный указатель:

glEnableClientState(GL_NORMAL_ARRAY) 

но не определили любой нормальный указатель. Решение состоит в том, чтобы dissable нормальный указатель:

glDisableClientState(GL_NORMAL_ARRAY) 

или добавить указатель на нормальный, как:

glNormalPointer(GL_FLOAT, 0, ctypes.c_void_p(0)) 
1

Похоже glEnableClientState осуждается в современных версиях OpenGL. Карточка AMD определенно дает вам профиль совместимости, а это значит, что вам будет неловко, если вы попытаетесь использовать устаревшие функции, но карта NVidia не указывает, является ли ваш профиль ядром или совместимостью. Вы должны убедиться, что ваш код явно запрашивает профиль совместимости.

+0

См. Основной вопрос, поскольку я добавил код, в котором я задал профиль, и проблема не исправлена. Я забыл сказать, что, в основном с той же логикой кода, я вижу трехмерные треугольные сетки без проблем. Но у меня проблемы с этим ... – avstenit

Смежные вопросы