基于GLFW的PyOpenGL的使用
1. GLFW概述
OpenGL只是一种规范,不仅语言无关,而且平台无关。规范只字未提获得和管理OpenGL上下文相关的内容,而是将这些作为细节交给底层的窗口系统。出于同样的原因,OpenGL纯粹专注于渲染,而不提供输入、音频以及窗口相关的API
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的C++与Python开发环境
2. GLFW的安装
GLFW的C++开发环境搭建可以参考:
- Windows:GLFW安装配置_assjaa的博客-CSDN博客_glfw安装
- Linux:基于Ubuntu搭建OpenGL开发环境 - 当时明月在曾照彩云归 - 博客园 (cnblogs.com)
GLFW的Python开发环境搭建可以参考:glfw · PyPI
Windows上GLFW的Python包自带了DLL,可以不用再额外安装,其余平台需要额外将DLL文件加入环境变量
使用Pip安装:
$ pip install glfw
使用Python开发还需安装OpenGL库的Python绑定,这里笔者使用的是PyOpenGL
PyOpenGL的安装参考:PyOpenGL的安装与错误解决 - 当时明月在曾照彩云归 - 博客园 (cnblogs.com)
使用Pip安装:
$ pip install PyOpenGL PyOpenGL_accelerate
基于C++语言的GLFW的资料广泛,尤其是官方资料详细,这里笔者主要讲述的是Python平台
3. GLFW(C++)的使用
GLFW官网给出了简单的示例代码:Documentation | GLFW
其流程是:
- 初始化GLFW
- 创建窗体
- 获取上下文环境
- 循环绘制、监听事件直至关闭
代码如下:
#include <GLFW/glfw3.h>
int main(void)
{
GLFWwindow* window;
/* Initialize the library */
if (!glfwInit())
return -1;
/* Create a windowed mode window and its OpenGL context */
window = glfwCreateWindow(640, 480, "Hello World", NULL, NULL);
if (!window)
{
glfwTerminate();
return -1;
}
/* Make the window's context current */
glfwMakeContextCurrent(window);
/* Loop until the user closes the window */
while (!glfwWindowShouldClose(window))
{
/* Render here */
glClear(GL_COLOR_BUFFER_BIT);
/* Swap front and back buffers */
glfwSwapBuffers(window);
/* Poll for and process events */
glfwPollEvents();
}
glfwTerminate();
return 0;
}
更详细的函数解释请参考官网文档:GLFW: Getting started
4. GLFW(Python)的使用
Python环境中的GLFW库是GLFW(C编写)的绑定,提供的API接口大致相同,但也存在着一点区别
参考官方说明:glfw · PyPI
可以知道主要区别有:
- 函数名使用下划线的风格而不是原来的驼峰命名
GLFW_
和glfw
前缀被删除- 带有指针的函数往往将指针作为返回值
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()
创建一个窗体
- 第一个参数是宽
- 第二个参数是高
- 第三个参数是窗口标题
- 后两个可以先不用管,具体可查GLFWAPI文档
window = glfw.create_window(800, 600, "glfw first", None, None)
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
为了测试环境,笔者加入一个清洗的背景颜色glClearColor(0.2, 0.3, 0.3, 1.0)
(大约为深青色)
代码如下:
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)
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的代码正确绘制
5. 参考资料
[2]GLFW: Introduction to the API
[3]glfw · PyPI
[4]GLFW入门学习 - 简书 (jianshu.com)
[5]PyOpenGL的安装与错误解决 - 当时明月在曾照彩云归 - 博客园 (cnblogs.com)
[6]你好,窗口 - LearnOpenGL CN (learnopengl-cn.github.io)
基于GLFW的PyOpenGL的使用的更多相关文章
- OpenGL学习——搭建OpenGL运行环境——生成一个空白视口——基于GLFW&GLEW
最近学习OpenGL,读OpenGL宝典一头蒙,各种gl函数不知所云.逐决定先搭OpenGL运行环境,详细如下. 1.首先OpenGL是什么?是一个标准规范,是一个巨大的状态机,并无具体实现,大多数实 ...
- Vulkan Tutorial 02 编写Vulkan应用程序框架原型
操作系统:Windows8.1 显卡:Nivida GTX965M 开发工具:Visual Studio 2017 General structure 在上一节中,我们创建了一个正确配置.可运行的的V ...
- OCCT 7.4.0 beta version is available
OpenCASCADE 7.4.0测试版本发布 OCC在9月16号发布了opencascade740 beta测试版本,新版本里面做了如下一些重点修改如下: 造型算法部分主要对网格化算法BRepMes ...
- 从新建文件夹开始构建ShadowPlay Engine游戏引擎(3)
本篇序言 各位可能看到博文的名字换了,也就是引擎名字换了,其实是在下想到了一个更棒的名字:皮影戏(ShadowPlay),取这个名字的含义是因为,游戏中的角色(Puppet)不也是由于我们的操作而动起 ...
- OpenGL2.0及以上版本中glm,glut,glew,glfw,mesa等部件的关系
OpenGL2.0及以上版本中gl,glut,glew,glfw,mesa等部件的关系 一.OpenGL OpenGL函数库相关的API有核心库(gl),实用库(glu),辅助库(aux).实用工具库 ...
- 【游戏开发】基于VS2017的OpenGL开发环境搭建
一.简介 最近,马三买了两本有关于“计算机图形学”的书籍,准备在工作之余鼓捣鼓捣图形学和OpenGL编程,提升自己的价值(奔着学完能涨一波工资去的).俗话说得好,“工欲善其事,必先利其器”.想学习图形 ...
- 【OpenGL】glsl、glew、glfw
glsl: OpenGL着色语言(OpenGL Shading Language)是用来在OpenGL中着色编程的语言,也即开发人员写的短小的自定义程序,他们是在图形卡的GPU (Graphic Pr ...
- 初试PyOpenGL一 (Python+OpenGL)
很早就一直想学Python,看到一些书都有介绍,不管是做为游戏的脚本语言,还是做为开发项目的主要语言都有提及(最主要的CUDA都开始支持Python,CUDA后面一定要学),做为先熟悉一下Python ...
- opengl库区分:glut、freeglut、glfw、glew、gl3w、glad
//oepngl库 opengl原生库 gl* 随opengl一起发布 opengl实用库 glu* 随opengl一起发布 opengl实用工具库glut glut* 需要下载配置安装(太老了!) ...
- GLFW+GLAD OpenGL Mac开发环境搭建
前言 OpenGL 是什么?The Industry Standard for High Performance Graphics 这是官方解释.说白了他就是一套标准接口.对,是接口,并没有实现具体的 ...
随机推荐
- 【大数据面试】【数仓项目】分层:ODS层、DWD层、DWS层、ADS层构成、操作
一.ODS层 1.保持数据原貌,不做任何修改 2.数据压缩:LZO压缩,减少磁盘空间 3.创建的是分区表:可以防止后续的全表扫描 包括 用户行为:string line dt ods_start ...
- K8S的架构及工作原理
1.Master和Node 1).Master K8S中的Master是集群控制节点,负责整个集群的管理和控制 在Master上运行着以下关键进程: kube-apiserver:提供了HTTP Re ...
- HDOJFatmouse肥鼠交易//c++控制保留小数
贪心算法.我就不贴题了//no.1009 但是我的代码运行超时了-改了好久都不对- 看别人代码,顺便学习c++控制保留小数怎么操作; 我的错误代码:(时间占用可能是多次调用findmax造成的) #i ...
- yolov5数据集制作 数据集分割+voc格式转txt格式代码
先上数据集分割代码 网上没找到合适的 自己写了一个 分割比例为0.6 :0.2 :0.2 import os import random oriImgDir = "./change14img ...
- 物以类聚人以群分,通过GensimLda文本聚类构建人工智能个性化推荐系统(Python3.10)
众所周知,个性化推荐系统能够根据用户的兴趣.偏好等信息向用户推荐相关内容,使得用户更感兴趣,从而提升用户体验,提高用户粘度,之前我们曾经使用协同过滤算法构建过个性化推荐系统,但基于显式反馈的算法就会有 ...
- 用云服务器搭建frp服务(超详细)
初学.没有云服务器的时候总想着怎样才能让别人访问到自己的项目. 在查阅了百度,逛过了一些论坛之后,了解到了 内网穿透 这个词. 经过一番钻研,通过 手机 + KSWEB + 电脑 成功将内网服务映射出 ...
- vue多界面开发
1. 安装 vue-cli,已有的请跳过这一步 npm install -g @vue/cli 若已安装旧版 vue-cli 则需要先卸载 vue-cli npm uninstall -g vue-c ...
- 单向绑定vs双向绑定、单向数据流vs双向数据流
参考文章:http://www.qb5200.com/article/482839.html 单双向绑定指的是View层跟Model层之间的映射关系 单向绑定vs双向绑定 react采用单向绑定,vu ...
- angular + ng-zorro 表格后台分页及排序功能实现,angular + ng-zorro 表格排序不起作用解决办法
angular + ng-zorro 表格排序不起作用是因为数据是从后端获取的,也是后端分页,所以要自己写排序啦~~~~ 举例:HTML <nz-table #basicTable nzBord ...
- pycharm编辑器下载与使用
pycharm编辑器下载与使用 一.pycharm编辑器 1.pycharm编辑器 PyCharm是一种Python IDE,带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具.比如调 ...