【问题标题】:PyOpenGL glDeleteBuffers and glDeleteVertexArrays produces an errorPyOpenGL glDeleteBuffers 和 glDeleteVertexArrays 产生错误
【发布时间】: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


    【解决方案1】:

    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 也是如此。

    【讨论】:

      猜你喜欢
      • 2019-09-16
      • 2013-09-14
      • 1970-01-01
      • 2020-08-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-31
      • 2021-04-30
      相关资源
      最近更新 更多