OpenGL中的freeglut和glew的作用和区别

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/z_dmsd/article/details/70949102

这两个库都是用于让OpenGL程序编写更简单,下载链接:freeglut和glew

一,为什么需要freeglut和glew

	OpenGL官方文档中提到	Before you can actually use OpenGL in a program, you must first initialize it. Because OpenGL is platform-independent,
there is not a standard way to initialize OpenGL; each platform handles it differently. Non-C/C++ language bindings can also
 handle these differently.There are two phases of OpenGL initialization. The first phase is the creation of an OpenGL context;
the second phase is to load all of the necessary functions to use OpenGL. Some non-C/C++ language bindings merge these into one.
	大概意思就是说,在你真正能够在程序中使用OpenGL之前,你需要对他进行初始化,但是由于OpenGL是跨平台的,所以也没有一个标准的方式
进行初始化。OpenGL初始化分为两个阶段:
	第一个阶段,你需要创建一个OpenGL上下文环境,这个上下文环境存储了所有与OpenGL相关的状态(OpenGL是一个状态机),上下文位于操作
系统中某个进程中,一个进程可以创建多个上下文,每一个上下文都可以描绘一个不同的可视界面,就像应用程序中的窗口;简单来理解就是为了创建
一个窗口;
	第二个阶段,你需要定位所有需要在OpenGL中使用的函数,这是为什么呢?后面会继续讨论;
	自然,freeglut和glew就是用来解决这两个问题的;
二,freeglut的作用
	因为OpenGL是跨平台的,这给开发者带来了方便,但是在创建上下文时这也是一个麻烦的地方,因为不同平台的窗口系统和API都是不一样的
freeglut就是一个openGL的工具库,封装了各个平台初始化窗口的过程,开发者只需要调用这个库中的初始化函数即可创建一个上下文;
三,glew的作用
	因为OpenGL只是一个标准/规范,具体的实现是由驱动开发商针对特定显卡实现的。由于OpenGL驱动版本众多,它大多数函数的
位置都无法在编译时确定下来,需要在运行时查询。任务就落在了开发者身上,开发者需要在运行时获取函数地址并将其保存在一个函数指
针中供以后使用。取得地址的方法因平台而异,在Windows上会是类似这样:
// 定义函数原型typedef void (*GL_GENBUFFERS) (GLsizei, GLuint*);// 找到正确的函数并赋值给函数指针GL_GENBUFFERS glGenBuffers  = (GL_GENBUFFERS)wglGetProcAddress("glGenBuffers");// 现在函数可以被正常调用了GLuint buffer;glGenBuffers(1, &buffer);	你可以看到代码非常复杂,而且很繁琐,我们需要对每个可能使用的函数都要重复这个过程。幸运的是,有些库能简化此过程,
GLEW是目前最新,也是最流行的库。
参考资料:
https://www.khronos.org/opengl/wiki/Getting_Started#Writing_an_OpenGL_Application
https://learnopengl-cn.github.io/01%20Getting%20started/02%20Creating%20a%20window/

 

猜你喜欢

转载自blog.csdn.net/z_dmsd/article/details/70949102
今日推荐