首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >PyOpenGL: glDrawArrays() - WindowsError:异常:访问冲突读取0x0000000000000000

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

Stack Overflow用户
提问于 2015-08-25 15:29:33
回答 2查看 1.1K关注 0票数 1

在绘制VBO时,PyOpenGL函数glDrawArrays()有问题。我有一个对象(类) ContactGeometry,我用方法create_VBO()创建VBO,用方法paintGL_VBO()显示VBO。

代码语言:javascript
复制
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)

问题是程序在带有属性的平台上运行正常:

代码语言:javascript
复制
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

但在具有属性的平台上却不确定:

代码语言:javascript
复制
PyOpenGL_version = 3.0.2
GL Version: 4.3.0
GL Vendor: NVIDIA Corporation
GL Renderer: Quadro 600/PCIe/SSE2

因为它返回以下错误:

代码语言:javascript
复制
WindowsError: exception: access violation reading 0x0000000000000000

任何想法,如何解决这个问题,因为我想运行的代码在多个平台(与不同的GPU)。这是非常不合理的,因为代码工作在旧版本的软件,但不是在较新的版本.

init() of class OpenGLWidget中,我设置:

代码语言:javascript
复制
class OpenGLWidget(QtOpenGL.QGLWidget):
    def __init__(self, parent=None):
        ...
        # core profile
        glformat = QtOpenGL.QGLFormat()
        glformat.setProfile(QtOpenGL.QGLFormat.CompatibilityProfile)
EN

Stack Overflow用户

回答已采纳

发布于 2015-08-25 19:23:16

我想我找到了一个问题并解决了它..。问题是我启用了普通指针:

代码语言:javascript
复制
glEnableClientState(GL_NORMAL_ARRAY)

但没有定义任何普通指针。解决方案是取消普通指针:

代码语言:javascript
复制
glDisableClientState(GL_NORMAL_ARRAY)

或者添加指向普通类的指针:

代码语言:javascript
复制
glNormalPointer(GL_FLOAT, 0, ctypes.c_void_p(0))
票数 1
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32208109

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档