【问题标题】:python - ctypes opengl functions loading error (OSError: exception: access violation writing 0x0000000000000000)python - ctypes opengl函数加载错误(OSError:异常:访问冲突写入0x0000000000000000)
【发布时间】:2018-07-11 22:20:57
【问题描述】:

我收到一个错误:

OSError: exception: access violation writing 0x0000000000000000

在尝试使用 python ctypes 加载 opengl 函数时,

from ctypes import *
gl = windll.opengl32
get_proc_addr_prototype = WINFUNCTYPE(WINFUNCTYPE(c_uint), c_char_p)
get_proc_addr_paramflags = (1, "Arg1"),
get_proc_addr = get_proc_addr_prototype(("wglGetProcAddress", gl), get_proc_addr_paramflags)
glCreateProgram = get_proc_addr(c_char_p(b"glCreateProgram"))
glCreateProgram()

我以为是因为我没有创建opengl上下文,所以我运行了这段代码:

from ctypes import *
gl = windll.opengl32
gl.glClear(0x00004000)    #    GL_COLOR_BUFFER_BIT = 0x00004000

这有效,但尝试这种方式:

from ctypes import *
gl = windll.opengl32
get_proc_addr_prototype = WINFUNCTYPE(WINFUNCTYPE(None, c_uint), c_char_p)
get_proc_addr_paramflags = (1, "Arg1"),
get_proc_addr = get_proc_addr_prototype(("wglGetProcAddress", gl), get_proc_addr_paramflags)
glClear = wgl_get_proc_addr(c_char_p(b"glClear"))
glClear(0x00004000)    #    GL_COLOR_BUFFER_BIT = 0x00004000

导致同样的错误。

【问题讨论】:

  • 当您查询函数指针时,您的 nmot 可能没有 GL 上下文,因此您得到的是 NULL。

标签: python opengl ctypes access-violation


【解决方案1】:

您永远不会创建 OpenGL 上下文。此外,如果 glCreateShader 完全可用,则取决于为其创建上下文的 OpenGL 版本。你为什么首先使用ctypes?有完美的 OpenGL Python 绑定可以为您抽象出所有繁琐的簿记代码。

http://pyopengl.sourceforge.net/

pip install PyOpenGL

【讨论】:

  • @rizo:如果 PyOpenGL 只给你 OpenGL-1.1,那么你的机器有问题。直到,包括 OpenGL-2.1,您总是可以获得支持的最高 OpenGL 配置文件。要手动加载函数指针,您必须首先创建一个 OpenGL 上下文……并检查它是否真的是您想要的版本。
  • @rizo 您是否尝试过更新显卡的驱动程序?另外,如果你真的想手工做,你可能想看看 wrapping glew。但是,PyOpenGL 已经使用 ctypes 来包装 OpenGL,因此您可能想看看它。 ModernGL 是另一个包装器的另一种选择。
  • @rizo:你能发布你的 SDL 实验的源代码吗?我想知道您是如何推断的,SDL 为您提供了 OpenGL-2.1 上下文。因为最后重要的是 GL_VERSION 字符串告诉你什么。
  • @rizo:我认为您误解了 SDL2 API。 sdl2.SDL_GL_GetAttribute(sdl2.SDL_GL_CONTEXT_…_VERSION, …) 的调用确实告诉你,SDL2 得到了哪个 OpenGL 版本。 它告诉您,在创建下一个新的 OpenGL 上下文时,SDL2 将询问操作系统使用哪个 OpenGL 版本。您实际得到的可能是一个非常不同的版本。
  • @rizo:在我看来,就好像你根本没有正确安装任何 OpenGL 驱动程序,并且被丢弃到所有 Windows 版本都附带的后备软件 OpenGL 实现中从 Windows-NT 4 和 Windows-95b 开始。我强烈建议您访问显卡 GPU 供应商的网站,下载与您的 GPU 匹配的最新驱动程序版本并安装它。 众所周知,Windows 自动驱动程序更新程序会跳过 OpenGL。
猜你喜欢
  • 2020-06-15
  • 2016-10-24
  • 2019-06-19
  • 2013-03-06
  • 2015-11-19
  • 2020-07-02
  • 1970-01-01
  • 2018-07-25
  • 1970-01-01
相关资源
最近更新 更多