Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python PyOpenGL:glDrawArrays()-WindowsError:异常:访问冲突读取0x0000000000000000_Python_Opengl_Pyqt_Vbo_Pyopengl - Fatal编程技术网

Python PyOpenGL:glDrawArrays()-WindowsError:异常:访问冲突读取0x0000000000000000

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

我在绘制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 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三角形网格。但我在这方面有问题。。。