Python PyOpenGL:glDrawArrays()-WindowsError:异常:访问冲突读取0x0000000000000000
我在绘制VBO时遇到了Python PyOpenGL:glDrawArrays()-WindowsError:异常:访问冲突读取0x0000000000000000,python,opengl,pyqt,vbo,pyopengl,Python,Opengl,Pyqt,Vbo,Pyopengl,我在绘制VBO时遇到了PyOpenGL函数glDrawArrays()的问题。我有一个对象(类)ContactGeometry,我使用方法create_VBO()创建VBO,并使用方法paintGL_VBO()显示VBO: 问题是程序在具有以下属性的平台上运行正常: PyOpenGL_version = 3.1.0a1 GL Version: 4.2.12217 Compatibility Profile Context 12.104.0.0 GL Vendor: ATI Technologie
PyOpenGL
函数glDrawArrays()
的问题。我有一个对象(类)ContactGeometry
,我使用方法create_VBO()
创建VBO,并使用方法paintGL_VBO()
显示VBO:
问题是程序在具有以下属性的平台上运行正常:
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
但在具有以下属性的平台上不正常:
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)上运行代码,有没有办法解决这个问题。这是非常不合理的,因为代码可以在旧版本的软件上运行,但不能在新版本上运行
在类的OpenGLWidget
I设置的init()
中:
class OpenGLWidget(QtOpenGL.QGLWidget):
def __init__(self, parent=None):
...
# core profile
glformat = QtOpenGL.QGLFormat()
glformat.setProfile(QtOpenGL.QGLFormat.CompatibilityProfile)
glEnableClientState在OpenGL的现代版本中似乎已被弃用。AMD卡绝对是给了你一个兼容性的配置文件,这意味着它不会在意你是否试图使用不受欢迎的功能,但是英伟达卡并不能说明你的配置文件是核心还是兼容。您应该确保您的代码明确要求提供兼容性配置文件。我想我发现了一个问题并解决了它。。。问题是我启用了普通指针:
glEnableClientState(GL_NORMAL_ARRAY)
glDisableClientState(GL_NORMAL_ARRAY)
但没有定义任何普通指针。解决方案是禁用普通指针:
glEnableClientState(GL_NORMAL_ARRAY)
glDisableClientState(GL_NORMAL_ARRAY)
或添加指向法线的指针,如:
glNormalPointer(GL_FLOAT, 0, ctypes.c_void_p(0))
检查self.contact_节点是否已正确分配。您收到的错误表明您试图读取空指针的值。@Xirema如果我将指针打印到
self。则会打印正确的数据。另外,如果我在两个平台上运行glIsBuffer(self.vbo\u id)
,它将返回1
。在glDrawArrays()前面的前一行将“length”指定为变量,如:“int length=len(self.contact\u节点)”,然后使用“glDrawArrays(GL\u三角形,0,length)”让我知道这是否改变了错误的位置。几分钟前我尝试了这一点,正如我所说,我成功地绘制了3D三角形网格,并在那里输入了长度作为对象属性,类似于self.N
。尽管在这里没有任何成功。你能看看全部代码吗?我还添加了我构建和绘制VBO的整个类。请查看主要问题,因为我在其中添加了设置配置文件的代码,问题没有得到解决。我忘了说,使用基本相同的代码逻辑,我可以毫无问题地显示3D三角形网格。但我在这方面有问题。。。