python之OpenGL应用(1)入门篇
儿子:爸爸,你能帮我编程序吗?
爸爸:你不是学了python吗,不会自己编吗?
儿子:游戏,就像《我的世界》的那种?
爸爸:好吧,不过需要时间。
儿子:需要多长时间呀,我都跟同学说啦,我爸一定能编。
爸爸:啊!你这不是先斩后奏吗?
儿子:求求你啦,老爸!
爸爸:哎!老爸试试吧,不过需要学习、从头开始学,当然,我们可以一起学。
儿子:哈哈,我就知道老爸一定行......
爸爸:(又被套路啦)
1. OpenGL(ES)概述
- OpenGL(Open Graphics Library,开放图形库)是用于渲染2D、3D矢量图形的跨语言、跨平台的应用程序编程接口(API)。这个接口由近350个不同的函数调用组成,用来绘制从简单的图形到比较复杂的三维景象。
- OpenGL ES 是 OpenGL 的子集,是针对手机和游戏主机等嵌入式设备而设计,去除了许多不必要和性能较低的 API 接口。
OpenGL规范严格规定了每个函数该如何执行,以及它们的输出值。至于内部具体每个函数是如何实现(Implement)的,将由OpenGL库的开发者自行决定(译注:这里开发者是指编写OpenGL库的人)。因为OpenGL规范并没有规定实现的细节,具体的OpenGL库允许使用不同的实现,只要其功能和结果与规范相匹配(亦即,作为用户不会感受到功能上的差异)。
实际的OpenGL库的开发者通常是显卡的生产商。你购买的显卡所支持的OpenGL版本都为这个系列的显卡专门开发的。当你使用Apple系统的时候,OpenGL库是由Apple自身维护的。在Linux下,有显卡生产商提供的OpenGL库,也有一些爱好者改编的版本。这也意味着任何时候OpenGL库表现的行为与规范规定的不一致时,基本都是库的开发者留下的bug。
作为独立于操作系统的开放的三维图形的软件开发包,在OpenGL基础上开发的应用程序能够简单方便的移植于各种平台。其具有七大功能:
1. 建立3D模型:OpenGL除了能够处理一般的2D图形,即点、线、面的绘制外,主要任务是集合了3D立体的物体绘制函数。
2. 图形变换:OpenGL利用基本变换以及投影变换处理图形。所谓的基本变换就是在处理2D平面图形时的平移、旋转、变比、镜像变换。投影变换就是在处理3D立体图形时的平行投影以及透视投影。通过变换方式,可以将2D的平面图形清晰明了的变换成3D的立体图形,从而在减少计算时间的同时就能够提高图形显示的速度。
3. 颜色模式:OpenGL库中使用较为广泛的颜色模式是RGBA模式以及颜色索引模式(color index)。
4. 光照、材质的设置:OpenGL库中包含了多种光照的类型。材质是用光反射率来表示的。其原理是基于人眼的原理,场景中的物体是由光的红绿蓝的分量以及材质的红绿蓝的反射率的乘积后所形成的颜色值。
5. 纹理映射:纹理指的是物体表面的花纹。OpenGL库中集合了对于物体纹理的映射处理方式,能够十分完整的复现物体表面的真实纹理。
6. 图像增强功能和位图显示的扩展功能:除了包括像素的读写、复制外,OpenGL还包括一些特殊的图像处理功能,如融合、反走样、对图像的重现和处理等。
7. 双缓存功能:OpenGL创新性的运用了双缓存形式。计算场景、生成画面图像、显示画面图像分别将其由前台缓存和后台缓存分开处理,大大提高了计算机的运算能力以及画面的显示速度。
更多内容请查看文后参考资料。
2. GLFW
GLFW是一个开源的多平台库,用于桌面上的OpenGL,OpenGL ES和Vulkan开发。它提供了一个简单的API,用于创建窗口、上下文、接收输入和事件。
GLFW的官网:An OpenGL library | GLFW
GLFW的GitHub地址:glfw/glfw: A multi-platform library for OpenGL, OpenGL ES, Vulkan, window and input (github.com)
GLFW的Python绑定:glfw · PyPI
GLFW、GLUT、freeglut都是OpenGL相关的窗口管理库,GLFW有着更为完善的功能。
三者的的对比可以参考:
- 请问现在glut和glfw应该学哪个呢? - 知乎 (zhihu.com)
- freeglut与GLFW介绍及其不同 (qq.com)
- OpenGL之gult/freeglut/glew/glfw/glad的联系与区别_无名小卒000001的博客-CSDN博客
GLFW有着丰富的官方文档,本文结合官方示例搭建GLFW与OpenGL的Python开发环境。
3. GLFW的安装
GLFW的Python开发环境搭建可以参考:glfw · PyPI
Windows上GLFW的Python包自带了DLL,可以不用再额外安装,其余平台需要额外将DLL文件加入环境变量。
使用Pip安装:
$ pip install glfw
使用Python开发还需安装OpenGL库的Python绑定。
PyOpenGL的安装参考:PyOpenGL的安装与错误解决 - 当时明月在曾照彩云归 - 博客园 (cnblogs.com)
使用Pip安装:
$ pip install PyOpenGL PyOpenGL_accelerate
4. GLFW(Python)的使用
Python环境中的GLFW库与原始C编写的GLFW库的API基本相同,流程也基本一致,所以,创建一个简单的OpenGL的步骤也是一样的:
- 初始化GLFW
- 创建窗体
- 获取上下文环境
- 循环绘制、监听事件直至关闭
4.1 导入相关包
导入GLFW与OpenGL
import glfw
from OpenGL.GL import *
4.2 初始化GLFW
调用glfw.init()
进行初始化GLFW,还可以设置一些相关的初始化配置,例如OpenGL版本等。
glfw.init()
'''
初始化相关的函数
'''
4.3 创建窗体
调用glfw.create_window()
创建一个窗体。
window = glfw.create_window(800, 600, "glfw first", None, None)
- 第一个参数是宽
- 第二个参数是高
- 第三个参数是窗口标题
- 后两个可以先不用管,具体可查GLFWAPI文档
4.4 获取上下文环境
调用glfw.make_context_current()
获取上下文环境。
glfw.make_context_current(window)
- 传入参数是获取上下文的窗体
4.5 循环绘制、监听事件直至关闭
GLFW会轮询事件与窗体状态
glfw.window_should_close()
获得窗体是否关闭的状态,点击窗口的关闭按钮时会改变为True
glfw.swap_buffers()
交换缓存数据进行绘制
glfw.poll_events()
轮询事件,检测是否有键鼠指令
while not glfw.window_should_close(window):glClear(GL_COLOR_BUFFER_BIT)'''OpenGL绘制函数'''glfw.swap_buffers(window)glfw.poll_events()
4.6 代码总结
把上述的代码总结一下,整合在一起,就可以创建一个GLFW窗体来编写OpenGL。
import glfw
from OpenGL.GL import *glfw.init()
window = glfw.create_window(800, 600, "glfw first", None, None)
glfw.make_context_current(window)while not glfw.window_should_close(window):glClearColor(0.2, 0.3, 0.3, 1.0)glClear(GL_COLOR_BUFFER_BIT)#这里可以添加OpenGL的绘制代码glfw.swap_buffers(window)glfw.poll_events()
进而,试着添加绘制三角形的代码:
import glfw
from OpenGL.GL import *glfw.init()
window = glfw.create_window(800, 600, "glfw first", None, None)
glfw.make_context_current(window)while not glfw.window_should_close(window):glClearColor(0.2, 0.3, 0.3, 1.0)glClear(GL_COLOR_BUFFER_BIT)#开始绘制三角形glColor3f(1.0, 1.0, 1.0)glBegin(GL_TRIANGLES)glVertex3f(-0.5, -0.5, 0.0)glVertex3f(0.5, -0.5, 0.0)glVertex3f(0.0, 0.5, 0.0)#结束绘制glEnd()glfw.swap_buffers(window)glfw.poll_events()
上面的代码运行后,就是下图所示的样子:
参考资料:
一看就懂的 OpenGL 基础概念丨音视频基础-腾讯云开发者社区-腾讯云
基于GLFW的PyOpenGL的使用 - 当时明月在曾照彩云归 - 博客园
OpenGL - LearnOpenGL CN