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有着更为完善的功能

三者的的对比可以参考:

GLFW有着丰富的官方文档,本文结合官方示例搭建GLFW与OpenGL的C++与Python开发环境

2. GLFW的安装

GLFW的C++开发环境搭建可以参考:

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. 参考资料

[1]Documentation | GLFW

[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的使用的更多相关文章

  1. OpenGL学习——搭建OpenGL运行环境——生成一个空白视口——基于GLFW&GLEW

    最近学习OpenGL,读OpenGL宝典一头蒙,各种gl函数不知所云.逐决定先搭OpenGL运行环境,详细如下. 1.首先OpenGL是什么?是一个标准规范,是一个巨大的状态机,并无具体实现,大多数实 ...

  2. Vulkan Tutorial 02 编写Vulkan应用程序框架原型

    操作系统:Windows8.1 显卡:Nivida GTX965M 开发工具:Visual Studio 2017 General structure 在上一节中,我们创建了一个正确配置.可运行的的V ...

  3. OCCT 7.4.0 beta version is available

    OpenCASCADE 7.4.0测试版本发布 OCC在9月16号发布了opencascade740 beta测试版本,新版本里面做了如下一些重点修改如下: 造型算法部分主要对网格化算法BRepMes ...

  4. 从新建文件夹开始构建ShadowPlay Engine游戏引擎(3)

    本篇序言 各位可能看到博文的名字换了,也就是引擎名字换了,其实是在下想到了一个更棒的名字:皮影戏(ShadowPlay),取这个名字的含义是因为,游戏中的角色(Puppet)不也是由于我们的操作而动起 ...

  5. OpenGL2.0及以上版本中glm,glut,glew,glfw,mesa等部件的关系

    OpenGL2.0及以上版本中gl,glut,glew,glfw,mesa等部件的关系 一.OpenGL OpenGL函数库相关的API有核心库(gl),实用库(glu),辅助库(aux).实用工具库 ...

  6. 【游戏开发】基于VS2017的OpenGL开发环境搭建

    一.简介 最近,马三买了两本有关于“计算机图形学”的书籍,准备在工作之余鼓捣鼓捣图形学和OpenGL编程,提升自己的价值(奔着学完能涨一波工资去的).俗话说得好,“工欲善其事,必先利其器”.想学习图形 ...

  7. 【OpenGL】glsl、glew、glfw

    glsl: OpenGL着色语言(OpenGL Shading Language)是用来在OpenGL中着色编程的语言,也即开发人员写的短小的自定义程序,他们是在图形卡的GPU (Graphic Pr ...

  8. 初试PyOpenGL一 (Python+OpenGL)

    很早就一直想学Python,看到一些书都有介绍,不管是做为游戏的脚本语言,还是做为开发项目的主要语言都有提及(最主要的CUDA都开始支持Python,CUDA后面一定要学),做为先熟悉一下Python ...

  9. opengl库区分:glut、freeglut、glfw、glew、gl3w、glad

    //oepngl库 opengl原生库 gl* 随opengl一起发布 opengl实用库 glu* 随opengl一起发布 opengl实用工具库glut glut* 需要下载配置安装(太老了!) ...

  10. GLFW+GLAD OpenGL Mac开发环境搭建

    前言 OpenGL 是什么?The Industry Standard for High Performance Graphics 这是官方解释.说白了他就是一套标准接口.对,是接口,并没有实现具体的 ...

随机推荐

  1. 【Spark】Day04-Spark Streaming:与离线批量比较、架构特点、入门案例、创建(队列、数据源)、转换(有状态、无状态)、输出方式、进阶(累加、转换为DF、缓存持久化)、实战(窗口统计)

    一.概述 1.离线和实时计算 离线:数据量大,数据不会变化,MapReduce 实时:数据量小,计算过程要短 2.批量和流式处理 批量:冷数据,数据量大,速度慢 流:在线.实时产生的数据(快速持续到达 ...

  2. 为什么推荐Kestrel作为网络开发框架

    为什么推荐Kestrel 网络框架千千万万,在dotnet平台,我们可以直接手撸Socket,也可以基于dotnetty来开发,或者选择某些第三方类似于dotnetty的网络库,为何我要推荐Kestr ...

  3. JS基本数据类型——BigInt

    一.JS基本数据类型--BigInt BigInt是ES11引入的新的基本数据类型.BigInt数据类型的目的是比Number数据类型支持的范围更大的整数值,以任意精度表示整数.使用 BigInt解决 ...

  4. Java基础类String学习分析

    目录 1 String不可变性 2 不可变的好处 3 String+和StringBuilder效率差异 4 String, StringBuffer and StringBuilder 5 Stri ...

  5. [python] 基于paramiko库操作远程服务器

    SSH(Secure Shell)是一种网络安全协议,能够使两台计算机安全地通信和共享数据.目前,SSH协议已在世界各地广泛使用,大多数设备都支持SSH功能.SSH的进一步说明见:深入了解SSH.SS ...

  6. 使用Zolom内存解析运行python脚本(不落地)

    在目标机器运行python工具 好多工具都是python写的,如果目标机器是linux的话自带python环境可以很方便的运行这些工具,但是windows下是不自带python环境的,所以一种办法是直 ...

  7. C++Vector源码解析(侯捷STL)

    vector是动态空间,随着元素的加入,它的内部机制会自行扩充空间以容纳新的元素.vector的实现技术,关键在于对大小的控制以及重新配置时的数据移动效率. 一.vector的数据结构 vector采 ...

  8. WPF中下拉框即可以选择项也可以作为只读文本框使用

    1.需求 当前在开发的系统需要一个这样的控件. (1)可以选择已有的选择项,类似于ComboBox选择: (2)可以通过其他按钮点击,选择一个文件,选择后,把文件路径显示到控件上,并且处于只读状态,行 ...

  9. antd 3.x升4.x踩坑之路~

    我们是袋鼠云数栈 UED 团队,致力于打造优秀的一站式数据中台产品.我们始终保持工匠精神,探索前端道路,为社区积累并传播经验价值. 兼容性问题 第三方依赖兼容问题 React - 最低 v16.9,部 ...

  10. 练习_使用递归计算1-n之间的和-练习_使用递归计算阶乘

    练习_使用递归计算1-n之间的和 定义一个方法,使用递归计算1-n之间的和 1+2+3+. . .+n n+(n-1)+(n-2)+...+1 已知: 最大值:n 最小值:1 使用递归必须明确: 1. ...