【发布时间】:2021-09-27 23:09:13
【问题描述】:
调用glDeleteVertexArrays(1, vao_id) 或glDeleteBuffers(1, vbo_id) 时会产生类型错误:
Traceback(最近一次调用最后一次): 调用中的文件“C:\Users\Ollie\AppData\Local\Programs\Python\Python39\lib\site-packages\OpenGL\latebind.py”,第 43 行 return 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,0.5,1)
vertices = [
-0.5, -0.5, 0.0,
0.5, -0.5, 0.0,
0.0, 0.5, 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, 0)
while not glfw.window_should_close(window):
glfw.poll_events()
glClear(GL_COLOR_BUFFER_BIT)
glBindVertexArray(vao_id)
glDrawArrays(GL_TRIANGLES, 0, 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()
【问题讨论】:
标签: python opengl vbo pyopengl vao