一文搞清楚opengl、openglES、GLEW、的关系GLUT、FreeGLUT、GLFW

简要来说,opengl、openglES、GLEW这三个都是一个图形库,可以理解为是在显卡驱动上给渲染用户一个统一的API;而GLUT、FreeGLUT、GLFW这三个是用于图形开发的辅助工具库,主要用于创建和管理OpenGL环境、操作窗口等。

1.1 OpenGL

OpenGL(Open Graphics Library)是一个跨语言,跨平台的应用程序接口,提供2D,3D图形渲染接口,操作在GPU之上,实现硬件加速渲染。OpenGL只是一个标准/规范,具体的实现是由驱动开发商针对特定显卡实现的。但是在你真正能够在程序中使用OpenGL之前,你需要对他进行初始化,但是由于OpenGL是跨平台的,所以也没有一个标准的方式进行初始化。OpenGL初始化分为两个阶段:

第一个阶段,你需要创建一个OpenGL上下文环境,这个上下文环境存储了所有与OpenGL相关的状态(OpenGL是一个状态机),上下文位于操作系统中某个进程中,一个进程可以创建多个上下文,每一个上下文都可以描绘一个不同的可视界面,就像应用程序中的窗口;简单来理解就是为了创建一个窗口;而GLUT、FreeGLUT、GLFW库就是用于干这件事的。

第二个阶段,你需要定位所有需要在OpenGL中使用的函数,而GLEW就是干这件事的。

1.2 GLEW

GLEW(The OpenGL Extension Wrangler Library )是一个基于OpenGL图形接口的跨平台的C++扩展库。由于OpenGL驱动版本众多,它大多数函数的位置都无法在编译时确定下来,需要在运行时查询。任务就落在了开发者身上,开发者需要在运行时获取函数地址并将其保存在一个函数指针中供以后使用。取得地址的方法因平台而异,在Windows上会是类似这样:

// 定义函数原型
typedef void (*GL_GENBUFFERS) (GLsizei, GLuint*);
// 找到正确的函数并赋值给函数指针
GL_GENBUFFERS glGenBuffers  = (GL_GENBUFFERS)wglGetProcAddress("glGenBuffers");
// 现在函数可以被正常调用了
GLuint buffer;
glGenBuffers(1, &buffer);

​​​可以看到代码非常复杂,而且很繁琐,我们需要对每个可能使用的函数都要重复这个过程,而GLEW就简化了这个过程。GLEW能自动识别当前平台所支持的全部OpenGL高级扩展涵数。只要包含glew.h头文件,就能使用gl,glu,glext,wgl,glx的全部函数。GLEW支持目前流行的各种操作系统。

1.3 OpenGL ES

OpenGL ES(OpenGL for Embedded Systems)是 OpenGL 三维图形API的子集,针对手机、PDA和游戏主机等嵌入式设备而设计,各显卡制造商和系统制造商来实现这组 API。

2.1 GLUT

GLUT(OpenGL Utility Toolkit)是一个闭源、跨平台的工具库,只不过它已经很久没有更新了。它包括了以下常见的功能:

  • 定义以及控制视窗
  • 侦测并处理键盘及滑鼠的事件
  • 以一个函数呼叫绘制某些常用的立体图形,例如长方体、球、以及犹他茶壶(实心或只有骨架,如glutWireTeapot()
  • 提供了简单选单列的实现

2.2 FreeGLUT

FreeGLUT(Free OpenGL Utility Toolkit)是一个开源的、跨平台的工具库,相比于GLUT在经常更新。

2.3 GLFW

GLFW(Graphics Library Framework)是继GLUT,FreeGLUT之后,当前最新的用来创建OpenGL(ES)上下文,以及操作窗口的开源、跨平台、轻量化第三方库。

,,,其他:GLM是一个OpenGL的数学库

你可能感兴趣的:(opengl)