一、说明

  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主循环

如果出现下列错误提示,一点也不奇怪:

  这一般是因为库文件freeglut_ DLL 找不到引起,也有说是32位版本,需要用64位版本去替换。

三、安装64位的openGL

  步骤如下:

  1. pip uninstall pyopengl // 先卸载老程序
  2. 再下载一个weel文件,(先检查python版本)在这个地址去找:https://drive.google.com/drive/folders/1mz7faVsrp0e6IKCQh8MyZh-BcCqEGPwx
  3. pip install .\PyOpenGL-3.1.7-cp310-cp310-win_amd64.whl

  这样就完成安装,上面程序运行后:
【pyopenGL编程手册- 01/20】pyopenGL安装和简要说明-LMLPHP

四、写给程序员的

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 *
...

这非常慢,但在调试过程中通常很有用。

02-17 18:06