У меня проблемы с 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)
Проверьте, self.contact_nodes правильно распределена. Ошибка, которую вы получаете, предполагает, что вы пытаетесь прочитать значение нулевого указателя. – Xirema
@Xirema, если я напечатаю указатель на 'self.contact_nodes', будут напечатаны правильные данные. Также, если я запускаю 'glIsBuffer (self.vbo_id)' на обеих платформах, он возвращает '1'. – avstenit
Назначьте «длину» как переменную в предыдущей строке перед glDrawArrays(), например: «int length = len (self.contact_nodes)», затем используйте «glDrawArrays (GL_TRIANGLES, 0, length)». Сообщите мне, если это изменит местоположение ошибки или нет. – Xirema