尝试调用未定义的函数 glDetachShader

Attempt to call an undefined function glDetachShader

在我的 python 代码中,我有这些行:

def __del__(self):
    for shader in self.shaders:
        GL.glDetachShader(self.program, shader)
        GL.glDeleteShader(shader)

    GL.glDeleteProgram(self.program)

但是当代码执行这些行时,我最终看到了这个问题:

Exception ignored in: <bound method Shader.__del__ of <__main__.Shader object at 0x0000016E4AFFE550>>
Traceback (most recent call last):
  File "C:\Germano\Dev\Gartic\tests\modernOpenGL2.py", line 214, in __del__
    GL.glDetachShader(self.program, shader)
  File "C:\Users\Germano\AppData\Local\Programs\Python\Python36\lib\site-packages\OpenGL\platform\baseplatform.py", line 407, in __call__
    self.__name__, self.__name__,
OpenGL.error.NullFunctionError: Attempt to call an undefined function glDetachShader, check for bool(glDetachShader) before calling

这是怎么回事?我该如何解决这个问题??

__del__ 可能仅在 OpenGL 上下文被销毁后 被调用 ,导致 NullFunctionError。如果 Program/Shader class 在 window 被销毁后一直存活到应用程序生命周期结束时,当 Python 解释器调用所有自定义删除函数时,所有 gl* 函数调用基本上都不可用。在这种情况下,您可以依靠上下文破坏来删除所有与 OpenGL 关联的对象。

但是,当您不再使用 shader/program 对象 应用程序的生命周期中时,释放内存仍然是一个好主意,当上下文仍然存在(有关详细信息,请参阅 this answer)!在删除纹理或缓冲区时,我个人也 运行 遇到了类似的问题。我建议将您的代码包装在 try/except 块中,因此它看起来像这样:

def __del__(self):
    try:
        #if the context is alive, you want to try and delete shader/program stuff manually
        #this could be triggered with e.g. `del my_awesome_program_class_object`
        for shader in self.shaders:
            GL.glDetachShader(self.program, shader)
            GL.glDeleteShader(shader)
        GL.glDeleteProgram(self.program)
    except OpenGL.error.NullFunctionError as error:
        pass#do nothing; context already deleted my shader/program stuff!

希望这个解释能让事情更清楚,因为那些 NullFunctionErrors 在不知道 为什么 它们首先发生的情况下肯定很难理解!