概述
这两个库都是用于让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/
最后
以上就是天真冷风为你收集整理的OpenGL中的freeglut和glew的作用和区别的全部内容,希望文章能够帮你解决OpenGL中的freeglut和glew的作用和区别所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复