PyOpenGL glDeleteBuffers 和 glDeleteVertexArrays 产生错误
PyOpenGL glDeleteBuffers and glDeleteVertexArrays produces an error
当调用 glDeleteVertexArrays(1, vao_id)
或 glDeleteBuffers(1, vbo_id)
产生类型错误时:
回溯(最后一次调用):
文件“C:\Users\Ollie\AppData\Local\Programs\Python\Python39\lib\site-packages\OpenGL\latebind.py”,第 43 行,在 call 中
return self._finalCall( *args, **named )
类型错误:'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()
从 C
API documentation 你会看到...
void glDeleteVertexArrays(GLsizei n, const GLuint *arrays);
所以第二个 arg 需要是 GLuint *
——通常是指向单个 GLuint
的指针或 GLuint
.
数组的名称
翻译为 python 这意味着您需要为其提供一个 python 数组。如果 vao_id
是单个 VAO id,则将第二个参数从 vao_id
更改为 [vao_id]
会创建一个具有单个元素的临时数组——即 vao_id
。 glDeleteBuffers
.
同样
当调用 glDeleteVertexArrays(1, vao_id)
或 glDeleteBuffers(1, vbo_id)
产生类型错误时:
回溯(最后一次调用): 文件“C:\Users\Ollie\AppData\Local\Programs\Python\Python39\lib\site-packages\OpenGL\latebind.py”,第 43 行,在 call 中 return self._finalCall( *args, **named ) 类型错误:'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()
从 C
API documentation 你会看到...
void glDeleteVertexArrays(GLsizei n, const GLuint *arrays);
所以第二个 arg 需要是 GLuint *
——通常是指向单个 GLuint
的指针或 GLuint
.
翻译为 python 这意味着您需要为其提供一个 python 数组。如果 vao_id
是单个 VAO id,则将第二个参数从 vao_id
更改为 [vao_id]
会创建一个具有单个元素的临时数组——即 vao_id
。 glDeleteBuffers
.