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