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_idglDeleteBuffers.

同样