目录
- 一、说明
- 二、测试系统安装的健康性
- 三、安装64位的openGL
- 四、写给程序员的
- 4. 1 函数库介绍
- 4.2 库内函数的命名
- 五、常见库的函数介绍
- 5.1 OpenGL 核心库 GL
- 5.2 OpenGL 实用库 GLU
- 5.3 OpenGL 工具库 GLUT
- 5.4 Windows 专用库 WGL
- 六、错误引发点和异常追踪
- 6.1 错误检查开关
- 6.2 错误发源地
- 6.3 日志记录
一、说明
OpenGL(Open Graphics Library,译为“开放式图形库”) 是用于渲染2D、3D矢量图形的跨语言、跨平台的应用程序编程接口(API)。这个接口由近350个不同的函数调用组成,用来绘制从简单的图形元件到复杂的三维景象。OpenGL常用于CAD、虚拟现实、科学可视化程序和电子游戏开发。
二、测试系统安装的健康性
如果您的pyopenGL系统安装方法是:
$ pip install PyOpenGL PyOpenGL_accelerate
这是一个平庸的安装,那么,测试一下吧!执行下列代码:
# -*- coding: utf-8 -*-
# -------------------------------------------
# quidam_01.py 三维空间的世界坐标系和三角形
# -------------------------------------------
from OpenGL.GL import *
from OpenGL.GLUT import *
def draw():
# ---------------------------------------------------------------
glBegin(GL_LINES) # 开始绘制线段(世界坐标系)
# 以红色绘制x轴
glColor4f(1.0, 0.0, 0.0, 1.0) # 设置当前颜色为红色不透明
glVertex3f(-0.8, 0.0, 0.0) # 设置x轴顶点(x轴负方向)
glVertex3f(0.8, 0.0, 0.0) # 设置x轴顶点(x轴正方向)
# 以绿色绘制y轴
glColor4f(0.0, 1.0, 0.0, 1.0) # 设置当前颜色为绿色不透明
glVertex3f(0.0, -0.8, 0.0) # 设置y轴顶点(y轴负方向)
glVertex3f(0.0, 0.8, 0.0) # 设置y轴顶点(y轴正方向)
# 以蓝色绘制z轴
glColor4f(0.0, 0.0, 1.0, 1.0) # 设置当前颜色为蓝色不透明
glVertex3f(0.0, 0.0, -0.8) # 设置z轴顶点(z轴负方向)
glVertex3f(0.0, 0.0, 0.8) # 设置z轴顶点(z轴正方向)
glEnd() # 结束绘制线段
# ---------------------------------------------------------------
glBegin(GL_TRIANGLES) # 开始绘制三角形(z轴负半区)
glColor4f(1.0, 0.0, 0.0, 1.0) # 设置当前颜色为红色不透明
glVertex3f(-0.5, -0.366, -0.5) # 设置三角形顶点
glColor4f(0.0, 1.0, 0.0, 1.0) # 设置当前颜色为绿色不透明
glVertex3f(0.5, -0.366, -0.5) # 设置三角形顶点
glColor4f(0.0, 0.0, 1.0, 1.0) # 设置当前颜色为蓝色不透明
glVertex3f(0.0, 0.5, -0.5) # 设置三角形顶点
glEnd() # 结束绘制三角形
# ---------------------------------------------------------------
glFlush() # 清空缓冲区,将指令送往硬件立即执行
if __name__ == "__main__":
glutInit() # 1. 初始化glut库
glutCreateWindow('Quidam Of OpenGL') # 2. 创建glut窗口
glutDisplayFunc(draw) # 3. 注册回调函数draw()
glutMainLoop() # 4. 进入glut主循环
如果出现下列错误提示,一点也不奇怪:
And the error I receive is OpenGL.error.NullFunctionError: Attempt to call an undefined function glutInit, check for bool(glutInit) before calling
这一般是因为库文件freeglut_ DLL 找不到引起,也有说是32位版本,需要用64位版本去替换。
三、安装64位的openGL
步骤如下:
- pip uninstall pyopengl // 先卸载老程序
- 再下载一个weel文件,(先检查python版本)在这个地址去找:https://drive.google.com/drive/folders/1mz7faVsrp0e6IKCQh8MyZh-BcCqEGPwx
- pip install .\PyOpenGL-3.1.7-cp310-cp310-win_amd64.whl
这样就完成安装,上面程序运行后:
四、写给程序员的
4. 1 函数库介绍
常见的库前缀有 gl、glu、glut、aux、wgl、glx、agl 等。库前缀表示该函数属于 OpenGL 哪一个开发库。从函数名后面中还可以看出需要多少个参数以及参数的类型。I 代表 int 型,f 代表 float 型,d 代表 double 型,u 代表无符号整型。例如 glColor3f() 表示了该函数属于gl库,参数是三个浮点数。
OpenGL 函数库相关的 API 有核心库(gl)、实用库(glu)、实用工具库(glut)、辅助库(aux)、窗口库(glx、agl、wgl)和扩展函数库等。gl是核心,glu是对gl的部分封装。glut是为跨平台的OpenGL程序的工具包,比aux功能强大。glx、agl、wgl 是针对不同窗口系统的函数。扩展函数库是硬件厂商为实现硬件更新利用OpenGL的扩展机制开发的函数。
4.2 库内函数的命名
OpenGL函数的命名格式如下:
<库前缀><根命令><可选的参数个数><可选的参数类型>
比如:glBufferData
常见的库前缀有 gl、glu、glut、aux、wgl、glx、agl 等。库前缀表示该函数属于 OpenGL 哪一个开发库。从函数名后面中还可以看出需要多少个参数以及参数的类型。I 代表 int 型,f 代表 float 型,d 代表 double 型,u 代表无符号整型。例如 glColor3f() 表示了该函数属于gl库,参数是三个浮点数。
五、常见库的函数介绍
OpenGL 函数库相关的 API 有核心库(gl)、实用库(glu)、实用工具库(glut)、辅助库(aux)、窗口库(glx、agl、wgl)和扩展函数库等。gl是核心,glu是对gl的部分封装。glut是为跨平台的OpenGL程序的工具包,比aux功能强大。glx、agl、wgl 是针对不同窗口系统的函数。扩展函数库是硬件厂商为实现硬件更新利用OpenGL的扩展机制开发的函数。本文仅对常用的四个库做简单介绍。
5.1 OpenGL 核心库 GL
核心库包含有115个函数,函数名的前缀为gl。这部分函数用于常规的、核心的图形处理。此函数由gl.dll来负责解释执行。由于许多函数可以接收不同数以下几类。据类型的参数,因此派生出来的函数原形多达300多个。核心库中的函数主要可以分为以下几类函数:
1. 绘制基本几何图元的函数:
glBegain()、glEnd()、glNormal*()、glVertex*()
2. 矩阵操作、几何变换和投影变换的函数:
如矩阵入栈函数glPushMatrix(),矩阵出栈函数glPopMatrix(),装载矩阵函数glLoadMatrix(),矩阵相乘函数glMultMatrix(),当前矩阵函数glMatrixMode()和矩阵标准化函数glLoadIdentity(),几何变换函数glTranslate*()、glRotate*()和glScale*(),投影变换函数glOrtho()、glFrustum()和视口变换函数glViewport()
3.颜色、光照和材质的函数:
如设置颜色模式函数glColor*()、glIndex*(),设置光照效果的函数glLight*() 、glLightModel*()和设置材质效果函数glMaterial()
4.显示列表函数:
主要有创建、结束、生成、删除和调用显示列表的函数glNewList()、glEndList()、glGenLists()、glCallList()和glDeleteLists()
5.纹理映射函数:
主要有一维纹理函数glTexImage1D()、二维纹理函数glTexImage2D()、设置纹理参数、纹理环境和纹理坐标的函数glTexParameter*()、glTexEnv*()和glTetCoord*()
6.特殊效果函数:
融合函数glBlendFunc()、反走样函数glHint()和雾化效果glFog*()
7.光栅化、象素操作函数:
如象素位置glRasterPos*()、线型宽度glLineWidth()、多边形绘制模式glPolygonMode(),读取象素glReadPixel()、复制象素glCopyPixel()
8.选择与反馈函数:
主要有渲染模式glRenderMode()、选择缓冲区glSelectBuffer()和反馈缓冲区glFeedbackBuffer()
9.曲线与曲面的绘制函数:
生成曲线或曲面的函数glMap*()、glMapGrid*(),求值器的函数glEvalCoord*() glEvalMesh*()
10.状态设置与查询函数:
glGet*()、glEnable()、glGetError()
5.2 OpenGL 实用库 GLU
包含有43个函数,函数名的前缀为glu。OpenGL提供了强大的但是为数不多的绘图命令,所有较复杂的绘图都必须从点、线、面开始。Glu 为了减轻繁重的编程工作,封装了OpenGL函数,Glu函数通过调用核心库的函数,为开发者提供相对简单的用法,实现一些较为复杂的操作。此函数由glu.dll来负责解释执行。OpenGL中的核心库和实用库可以在所有的OpenGL平台上运行。主要包括了以下几种:
1.辅助纹理贴图函数:
gluScaleImage() 、gluBuild1Dmipmaps()、gluBuild2Dmipmaps()
2.坐标转换和投影变换函数:
定义投影方式函数gluPerspective()、gluOrtho2D() 、gluLookAt(),拾取投影视景体函数gluPickMatrix(),投影矩阵计算gluProject()和gluUnProject()
3.多边形镶嵌工具:
gluNewTess()、gluDeleteTess()、gluTessCallback()、gluBeginPolygon()、gluTessVertex()、gluNextContour()、gluEndPolygon()
4.二次曲面绘制工具:
主要有绘制球面、锥面、柱面、圆环面gluNewQuadric()、gluSphere()、gluCylinder()、gluDisk()、gluPartialDisk()、gluDeleteQuadric()
5.非均匀有理B样条绘制工具:
主要用来定义和绘制Nurbs曲线和曲面,包括gluNewNurbsRenderer()、gluNurbsCurve()、gluBeginSurface()、gluEndSurface()、gluBeginCurve()、gluNurbsProperty()
6.错误反馈工具:
获取出错信息的字符串gluErrorString()
5.3 OpenGL 工具库 GLUT
包含大约30多个函数,函数名前缀为glut。glut是不依赖于窗口平台的OpenGL工具包,由Mark KLilgrad在SGI编写(现在在Nvidia),目的是隐藏不同窗口平台API的复杂度。函数以glut开头,它们作为aux库功能更强的替代品,提供更为复杂的绘制功能,此函数由glut.dll来负责解释执行。由于glut中的窗口管理函数是不依赖于运行环境的,因此OpenGL中的工具库可以在X-Window, Windows NT, OS/2等系统下运行,特别适合于开发不需要复杂界面的OpenGL示例程序。对于有经验的程序员来说,一般先用glut理顺3D图形代码,然后再集成为完整的应用程序。这部分函数主要包括:
1.窗口操作函数:
窗口初始化、窗口大小、窗口位置函数等 glutInit()、glutInitDisplayMode()、glutInitWindowSize()、glutInitWindowPosition()
2.回调函数:
响应刷新消息、键盘消息、鼠标消息、定时器函数 GlutDisplayFunc()、glutPostRedisplay()、glutReshapeFunc()、glutTimerFunc()、glutKeyboardFunc()、glutMouseFunc()
3.创建复杂的三维物体:
这些和aux库的函数功能相同
4.菜单函数:
创建添加菜单的函数 GlutCreateMenu()、glutSetMenu()、glutAddMenuEntry()、glutAddSubMenu() 和 glutAttachMenu()
5.程序运行函数:
glutMainLoop()
5.4 Windows 专用库 WGL
针对windows平台的扩展,包含有16个函数,函数名前缀为wgl。这部分函数主要用于连接OpenGL和Windows ,以弥补OpenGL在文本方面的不足。 Windows专用库只能用于Windows环境中。这类函数主要包括以下几类:
1. 绘图上下文相关函数:
wglCreateContext()、wglDeleteContext()、wglGetCurrentContent()、wglGetCurrentDC()、wglDeleteContent()
2. 文字和文本处理函数:
wglUseFontBitmaps()、wglUseFontOutlines()
3. 覆盖层、地层和主平面层处理函数:
wglCopyContext()、wglCreateLayerPlane()、wglDescribeLayerPlane()、wglReakizeLayerPlatte()
4. 其他函数:
wglShareLists()、wglGetProcAddress()
六、错误引发点和异常追踪
6.1 错误检查开关
PyOpenGL通常使用“严格”的OpenGL操作,这更接近Python本身的操作,即将错误作为异常引发,而不是要求用户手动检查返回值和/或调用glCheckError。
您可以在导入任何子模块之前通过在 OpenGL 包中设置模块级标志来禁用 PyOpenGL 的错误检查,如下所示:
import OpenGL
OpenGL.ERROR_CHECKING = False
from OpenGL.GL import *
from OpenGL.GLU import *
这往往会导致代码速度大幅提高,因为与同一脚本的错误检查版本相比,发出的 OpenGL 调用数量大致减半。您通常希望在开发时启用错误检查,并且仅在生产/发布代码时将其关闭。
但请注意,大多数 PyOpenGL 代码(包括 PyOpenGL 本身中的帮助程序代码)都是在错误引发异常的假设下编写的,因此您必须检查使用的所有代码以确保在适当的情况下调用 glGetError。
6.2 错误发源地
-
PyOpenGL 通常引发的异常有:
GL.GLerror 除 WGL 之外的所有模块引发
GLU.GLUerror 由 GLU 函数引发. GLU 也可引发 GL.GLerror
WindowsError/SystemError 由 WGL引发
TypeError/ValueError :例如错误数据类型问题
GL.GLerror 是 GL.Error 的子类,具有大量有关调用包装过程的额外信息: -
err – OpenGL 错误代码
result – 操作的 OpenGL 结果代码
baseOperation——被调用的基本 OpenGL 函数
pyArgs——传递给函数的顶级参数集
cArgs——从 pyArgs 扩展而来的 Python 级对象集
cArguments——从 cArgs 转换而来的 C 级对象集
description——错误的文本 OpenGL 描述(通常非常简洁,主要用于查看文档)
6.3 日志记录
默认情况下,PyOpenGL 会将错误记录到 Python 日志模块。您可以通过在导入 OpenGL 子模块之前设置标志来禁用此功能:
import OpenGL
OpenGL.ERROR_LOGGING = False
from OpenGL.GL import *
...
这将为非开发代码提供性能改进。
相反,如果您发现代码崩溃并且需要跟踪 PyOpenGL 的操作,那么可以指示 PyOpenGL 跟踪对 OpenGL 的调用到日志记录模块:
import OpenGL
OpenGL.ERROR_LOGGING = True
from OpenGL.GL import *
...
这非常慢,但在调试过程中通常很有用。