绘制VBO时,PyOpenGL
函数glDrawArrays()
出现问题。我有一个对象(类)ContactGeometry
,我使用方法create_VBO()
创建VBO并使用方法paintGL_VBO()
显示VBO:
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
但在具有属性的平台上不行:
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
任何想法如何解决这个问题,因为我想在多个平台上运行代码(使用不同的GPU)。这是非常不合理的,因为代码适用于旧版本的软件,但不适用于较新的版本...
在班级init()
的{{1}}中,我设置了:
OpenGLWidget
答案 0 :(得分:1)
在现代版本的OpenGL中,似乎不推荐使用glEnableClientState。 AMD卡肯定会给你一个兼容性配置文件,这意味着它不会在意您是否尝试使用已弃用的功能,但NVidia卡并不表示您的配置文件是Core还是兼容性。您应该确保您的代码明确要求兼容性配置文件。
答案 1 :(得分:1)
我想我发现了一个问题并解决了......问题是我启用了正常的指针:
glEnableClientState(GL_NORMAL_ARRAY)
但尚未定义任何普通指针。解决方案是使正常指针不可用:
glDisableClientState(GL_NORMAL_ARRAY)
或添加指向正常的指针,如:
glNormalPointer(GL_FLOAT, 0, ctypes.c_void_p(0))