微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

PyOpenGL glDeleteBuffers 和 glDeleteVertexArrays 产生错误

如何解决PyOpenGL glDeleteBuffers 和 glDeleteVertexArrays 产生错误

调用 glDeleteVertexArrays(1,vao_id)glDeleteBuffers(1,vbo_id) 时产生类型错误

回溯(最近一次调用最后一次): 文件“C:\Users\Ollie\AppData\Local\Programs\Python\python39\lib\site-packages\OpenGL\latebind.py”,第 43 行,调用 返回 self._finalCall( *args,**named ) TypeError: 'nonetype' 对象不可调用

但是,当我将行更改为 glDeleteVertexArrays(1,[vao_id])(对于 vbo 也是如此)时,错误就会消失。这种方法是否仍然正确释放内存?有没有不同的方法解决这个问题?为什么我需要将它作为列表传递?

我的完整代码

import numpy
import glfw
from OpenGL.GL import *

if not glfw.init():
    raise Exception("glfw Failed")

glfw.window_hint(glfw.CONTEXT_VERSION_MAJOR,3)
glfw.window_hint(glfw.CONTEXT_VERSION_MInor,3)
glfw.window_hint(glfw.OPENGL_PROFILE,glfw.OPENGL_CORE_PROFILE)
glfw.window_hint(glfw.OPENGL_FORWARD_COMPAT,GL_TRUE)
glfw.window_hint(glfw.VISIBLE,GL_TRUE)
glfw.window_hint(glfw.RESIZABLE,GL_FALSE)

window = glfw.create_window(720,480,"triangle",None,None)

if not window:
    glfw.Terminate()
    raise Exception("window Failed to create!")

glfw.make_context_current(window)

glClearColor(0.5,0.5,1)

vertices = [
    -0.5,-0.5,0.0,0.0
    ]

vao_id = glGenVertexArrays(1)
glBindVertexArray(vao_id)
glEnabLevertexAttribArray(0)


vbo_id = glGenBuffers(1)
glBindBuffer(GL_ARRAY_BUFFER,vbo_id)

vertices = numpy.array(vertices,dtype=numpy.float32)
glBufferData(GL_ARRAY_BUFFER,vertices.nbytes,vertices,GL_STATIC_DRAW)

glVertexAttribPointer(0,3,GL_FLOAT,False,0)

while not glfw.window_should_close(window):
    glfw.poll_events()
    glClear(GL_COLOR_BUFFER_BIT)

    glBindVertexArray(vao_id)
    glDrawArrays(GL_TRIANGLES,3)
    
    glfw.swap_buffers(window)

#no error
glDeleteVertexArrays(1,[vao_id])
glDeleteBuffers(1,[vbo_id])

#error:
#glDeleteVertexArrays(1,vao_id)
#glDeleteBuffers(1,vbo_id)

glfw.terminate()

解决方法

C API documentation 你会看到...

void glDeleteVertexArrays(GLsizei n,const GLuint *arrays);

所以第二个参数需要是一个 GLuint * —— 通常是指向单个 GLuint 的指针或 GLuint 数组的名称。

翻译成 python 这意味着你需要为它提供一个 python 数组。如果 vao_id 是单个 VAO id,则将第二个参数从 vao_id 更改为 [vao_id] 会创建一个具有单个元素的临时数组——即 vao_idglDeleteBuffers 也类似。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。