【pyopenGL编程手册- 01/20】pyopenGL安装和简要说明

2024-02-19 19:30

本文主要是介绍【pyopenGL编程手册- 01/20】pyopenGL安装和简要说明,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

  • 一、说明
  • 二、测试系统安装的健康性
  • 三、安装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

  步骤如下:

  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

  这样就完成安装,上面程序运行后:
在这里插入图片描述

四、写给程序员的

4. 1 函数库介绍

  常见的库前缀有 gl、glu、glut、aux、wgl、glx、agl 等。库前缀表示该函数属于 OpenGL 哪一个开发库。从函数名后面中还可以看出需要多少个参数以及参数的类型。I 代表 int 型,s短整型,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 *
...

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

这篇关于【pyopenGL编程手册- 01/20】pyopenGL安装和简要说明的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/725714

相关文章

揭秘Python Socket网络编程的7种硬核用法

《揭秘PythonSocket网络编程的7种硬核用法》Socket不仅能做聊天室,还能干一大堆硬核操作,这篇文章就带大家看看Python网络编程的7种超实用玩法,感兴趣的小伙伴可以跟随小编一起... 目录1.端口扫描器:探测开放端口2.简易 HTTP 服务器:10 秒搭个网页3.局域网游戏:多人联机对战4.

Linux系统中卸载与安装JDK的详细教程

《Linux系统中卸载与安装JDK的详细教程》本文详细介绍了如何在Linux系统中通过Xshell和Xftp工具连接与传输文件,然后进行JDK的安装与卸载,安装步骤包括连接Linux、传输JDK安装包... 目录1、卸载1.1 linux删除自带的JDK1.2 Linux上卸载自己安装的JDK2、安装2.1

Java并发编程必备之Synchronized关键字深入解析

《Java并发编程必备之Synchronized关键字深入解析》本文我们深入探索了Java中的Synchronized关键字,包括其互斥性和可重入性的特性,文章详细介绍了Synchronized的三种... 目录一、前言二、Synchronized关键字2.1 Synchronized的特性1. 互斥2.

Linux卸载自带jdk并安装新jdk版本的图文教程

《Linux卸载自带jdk并安装新jdk版本的图文教程》在Linux系统中,有时需要卸载预装的OpenJDK并安装特定版本的JDK,例如JDK1.8,所以本文给大家详细介绍了Linux卸载自带jdk并... 目录Ⅰ、卸载自带jdkⅡ、安装新版jdkⅠ、卸载自带jdk1、输入命令查看旧jdkrpm -qa

Tomcat版本与Java版本的关系及说明

《Tomcat版本与Java版本的关系及说明》:本文主要介绍Tomcat版本与Java版本的关系及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Tomcat版本与Java版本的关系Tomcat历史版本对应的Java版本Tomcat支持哪些版本的pythonJ

MySQL Workbench 安装教程(保姆级)

《MySQLWorkbench安装教程(保姆级)》MySQLWorkbench是一款强大的数据库设计和管理工具,本文主要介绍了MySQLWorkbench安装教程,文中通过图文介绍的非常详细,对大... 目录前言:详细步骤:一、检查安装的数据库版本二、在官网下载对应的mysql Workbench版本,要是

Linux安装MySQL的教程

《Linux安装MySQL的教程》:本文主要介绍Linux安装MySQL的教程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux安装mysql1.Mysql官网2.我的存放路径3.解压mysql文件到当前目录4.重命名一下5.创建mysql用户组和用户并修

Nginx指令add_header和proxy_set_header的区别及说明

《Nginx指令add_header和proxy_set_header的区别及说明》:本文主要介绍Nginx指令add_header和proxy_set_header的区别及说明,具有很好的参考价... 目录Nginx指令add_header和proxy_set_header区别如何理解反向代理?proxy

pip无法安装osgeo失败的问题解决

《pip无法安装osgeo失败的问题解决》本文主要介绍了pip无法安装osgeo失败的问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 进入官方提供的扩展包下载网站寻找版本适配的whl文件注意:要选择cp(python版本)和你py

Python异步编程中asyncio.gather的并发控制详解

《Python异步编程中asyncio.gather的并发控制详解》在Python异步编程生态中,asyncio.gather是并发任务调度的核心工具,本文将通过实际场景和代码示例,展示如何结合信号量... 目录一、asyncio.gather的原始行为解析二、信号量控制法:给并发装上"节流阀"三、进阶控制