PyOpenGL的安装与错误解决

1. 引言

OpenGL,一般它被认为是一个API(Application Programming Interface, 应用程序编程接口),包含了一系列可以操作图形、图像的函数。然而,OpenGL本身并不是一个API,它仅仅是一个由Khronos组织制定并维护的规范(Specification)

OpenGL规范严格规定了每个函数该如何执行,以及它们的输出值。至于内部具体每个函数是如何实现(Implement)的,将由OpenGL库的开发者自行决定(译注:这里开发者是指编写OpenGL库的人)。因为OpenGL规范并没有规定实现的细节,具体的OpenGL库允许使用不同的实现,只要其功能和结果与规范相匹配(亦即,作为用户不会感受到功能上的差异)

OpenGL只是一种规范,不仅语言无关,而且平台无关。规范只字未提获得和管理OpenGL上下文相关的内容,而是将这些作为细节交给底层的窗口系统。出于同样的原因,OpenGL纯粹专注于渲染,而不提供输入、音频以及窗口相关的API

PyOpenGL是常见的跨平台语言Python与OpenGL和相关API的绑定,支持:

  • OpenGL v1.1 to 4.4
  • GLES 1 to 3.1 (Experimental)
  • GLU
  • EGL, WGL, GLX
  • GLUT, FreeGLUT
  • GLE 3 (GL Extrusion Library)
  • hundreds of extensions to GL, GLES, EGL, WGL and GLX

OpenGL_accelerate,PyOpenGL的cython编码加速器模块,可选,但建议在可用的情况下使用

2. 安装使用

诚然,直接使用Pip进行安装是最简便的,但是往往存在问题(当然,不妨试试)

按照PyOpenGL官网PyOpenGL -- The Python OpenGL Binding (sourceforge.net)的指导,使用以下命令安装:

$ pip install PyOpenGL PyOpenGL_accelerate

不妨按照示例代码测试一下:

from OpenGL.GL import *
from OpenGL.GLUT import *

def drawFunc():
  glClear(GL_COLOR_BUFFER_BIT)
  glRotatef(1, 1, 1, 0)
  glutWireTeapot(0.5)
  glFlush()

glutInit()
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGBA)
glutInitWindowSize(400, 400)
#参数为b类型而不是string
glutCreateWindow(b"First")
glutDisplayFunc(drawFunc)
glutMainLoop()

如果顺利的话,应该会出现一个茶壶:

image-20220704112715631

但是,往往会出现这个错误:Attempt to call an undefined function glutInit, check for bool(glutInit) before calling

大部分博客都有说到这个问题:

这些博客基本都提到了动态链接库与32/64位库的问题,采取的问题基本都是去下载whl文件再安装:

下载地址:Archived: Python Extension Packages for Windows - Christoph Gohlke (uci.edu)

选择对应的版本进行安装,可以参考:Python安装配置OpenGL环境的全过程记录--易采站长站 (easck.com)

3. 错误解决

使用pip安装的方式错在哪里呢?

笔者下载Archived: Python Extension Packages for Windows - Christoph Gohlke (uci.edu)的安装文件,使用解压软件打开,可以发现里面GLUT对应含有DLL文件:

image-20220704141650332

然而,通过pip方式安装的whl文件却不包含DLL文件:

image-20220704142059478

笔者下载源码安装包,可以看到源码里面包含了DLL文件:

image-20220704142231188

所以问题的根源就显而易见了:通过pip方式安装的whl文件却不包含DLL文件所以无法直接执行

解决的方法有很多:

  • 下载对应的DLL添加到PATH(环境变量)中,无需纠结放在那个文件
  • 下载包含DLL的whl安装包,本地安装
  • 下载源码进行安装

以下对上述三种方法进行进一步叙述:

下载对应的DLL添加到PATH(环境变量)

获取glut或者freeglut的对应的dll文件,然后将dll文件添加到PATH(环境变量),DLL可以去官网下载,也可以从PyOpenGL源码包、包含DLL的whl安装包中等获取,可以参考:

下载包含DLL的whl安装包本地安装

下载包含DLL的whl安装包,本地安装,就解决了DLL缺失的问题,可以参考:

下载源码进行安装

下载PyOpenGL源码(包含DLL),进行本地安装,可以参考:

推荐:下载包含DLL的whl安装包本地安装

从上图中,我们可以看到PyOpenGL 3.1.6 版本中使用的是freeglut,在 3.1.5 中是glut和freeglut都有,笔者发现在3.1.1版本中用的是glut(如下图所示),可以看到glut逐渐被废弃,如果搞不清楚需要什么DLL,那就下载包含DLL的whl安装包本地安装

image-20220704153621812

一些想法:

笔者看到pip源上有源码包,那能否跳过whl文件直接使用源码安装呢?

image-20220704153955280

经过笔者搜索,在没有whl文件的情况下,pip就会下载源码进行安装,然而,在有whl文件的情况下,pip似乎没有办法跳过whl文件直接源码安装,先下载源码再本地安装就显得麻烦

4. 参考资料

[1][OpenGL - LearnOpenGL CN (learnopengl-cn.github.io)](https://learnopengl-cn.github.io/01 Getting started/01 OpenGL/)

[2]OpenGL_百度百科 (baidu.com)

[3]PyOpenGL -- The Python OpenGL Binding (sourceforge.net)

[4]超简单的PyOpenGL安装教程,我竟然还要总结一下,有毒!!!_光子俊的博客-CSDN博客_pyopengl安装

[5]Python安装配置OpenGL环境的全过程记录--易采站长站 (easck.com)

[6]尝试调用未定义的函数 glutInit - IT宝库 (itbaoku.cn)

[7]PyOpenGL Installation (sourceforge.net)

[8]python opengl安装提示没有glutinit的解决方法。_ljhhh7890的博客-CSDN博客

posted @ 2022-07-04 16:09  当时明月在曾照彩云归  阅读(1139)  评论(0编辑  收藏  举报