opengl关于glut, freeglut, glfw, glew, glad, gl3w库的说明

刚入门opengl的时候最烦的就是各种库的配置,glut, freeglut, glfw, glew, glad, gl3w 等等,简直要晕了. 最后查阅网上的资料大概得出了这样的结论:


opengl仅仅是一个标准/规范,但是具体利用opengl开发对应的应用则需要依赖具体的开发环境例如windows, linux等, 而最常见的就是窗口, IO控制等交互逻辑,因此glut, freeglut, glfw这类的库便产生了


  • glut (Opengl Utility Tool)

    • 定义以及控制视窗
    • 侦测并处理键盘和鼠标事件
    • 以一个函数呼叫绘制某些常用立体图形,如长方体,球,犹他茶壶
    • 提供了简单选单列的实现

    所有glut的库函数均已glut开头, 例如glutPostRedisplay(). 后来以及停止维护了

  • freeglut

    glut的替代品,最新稳定的版本是Freeglut3.0.0 (2015年3月7日)

  • glfw (Graphics Library Framework)

    • 创建管理窗口和opengl的上下文
    • 处理手柄,键盘,鼠标输入

    目前glfw还在维护,可以说glfw库可以是代替glut和freeglut的库的


opengl是一个标准/规范, 具体的实现是由驱动开发商针对特定的显卡而实现.支持opengl的驱动版本众多,大多数函数的地址(内存地址)无法在编译时候确定下来,需要运行的时候查询.所以在运行的时候获取函数的内存地址并把其保存在一个函数指针中供后续使用. glew, glad, gl3w基本都是实现类似的功能


  • glad

    //glad.h
    ///////////////////////////////////////////////////////////////////
    /*#55 定义一个函数指针,为GLADloadproc类型,这种函数是以一个const char*为参数并返回void*的类型,在glad.c中便用GLADloadproc load来声明了一个GLADloadproc 类型的函数load, 所以load函数的参数为(const char *name)返回值为void*
    */
    typedef void* (* GLADloadproc)(const char *name);
    
    ////////////////////////////////////////////////////////////////////////
    //这里的APIENTRYP(API_entry_pointer即api条目指针) 表示 APIENTRY *, 而APIENTRY表示 __stdcall
    #define GLAPI extern
    #define APIENTRY __stdcall
    #define APIENTRYP APIENTRY *
    
    ///////////////////////////////////////////////////////////////////////
    /*#1806, 定义函数指针,为PFNGLGENBUFFERSPROC类型,参数为(GLsizei n, GLuint *buffers), 返回值为void的类型*/
    typedef void (APIENTRYP PFNGLGENBUFFERSPROC)(GLsizei n, GLuint *buffers);
    /*用为PFNGLGENBUFFERSPROC类型来定义一个函数指针名字为glad_glGenBuffers, 类型是extern*/
    GLAPI PFNGLGENBUFFERSPROC glad_glGenBuffers;
    #define glGenBuffers glad_glGenBuffers // glGenBuffers的宏定义,使用glGenBuffers函数时候其实就是调用的glad_glGenBuffers
    
    ////////////////////////////////////////////////////////////////////////
    //glad.c
    PFNGLGENBUFFERSPROC glad_glGenBuffers = NULL;//#452 声明和定义glad_glGenBuffers这个函数指针为NULL
    glad_glGenBuffers = (PFNGLGENBUFFERSPROC)load("glGenBuffers");//#1086, 使用glad_glGenBuffers函数的时候就去load名字为glGenBuffers的函数
    

    具体怎么找函数的流程:

    1. openg工程中main函数里面有gladLoadGLLoader, gladLoadGLLoader里面把从opengl1.0到目前最高opengl4.6的函数都读入

    2. 在glad.c中有一个函数

      static int open_gl(void) {
      #ifndef IS_UWP
          libGL = LoadLibraryW(L"opengl32.dll");
          if(libGL != NULL) {
              void (* tmp)(void);
              tmp = (void(*)(void)) GetProcAddress(libGL, "wglGetProcAddress");
              gladGetProcAddressPtr = (PFNWGLGETPROCADDRESSPROC_PRIVATE) tmp;
              return gladGetProcAddressPtr != NULL;
          }
      #endif
      

      去系统中加载opengl32.dll这个库,然后GetProcAddress检索指定的动态链接库(DLL)中的输出库函数地址.

    3. 而[根据某位知乎网友的解答][https://www.zhihu.com/question/30130562/answer/46983748] ,opengl32.dll仅仅为用户提供了统一API的接口以及扩展这些接口的可能, opengl32.dll被加载后尝试调用更底层的ICD驱动程序,从而完成具体的图形操作. 而GLEW这些库,根据opengl的接口说明,从动态库(opengl32.dll)中请求对应的函数接口,如果能得到有效地址,那么这个函数是被当前驱动所支持的,就可以用,否则就无法支持.实际上,你也可以根据你当前应用中使用到的函数(通常一个小的演示demo,如显示一个三角形,并没有使用到很多的gl函数)而获取函数接口也是完全可行的. glew,glad,gl3w这些库帮助用户完成了所有接口的查询和获取.

  • glad, gl3w的作用类似不做更多叙述.
    但是gl3w是利用python开发的, 因此需要安装python库进行编译生成相关的文件,具体的流程可以参考基于GLFW和GL3W库的OPEN GL环境配置


结论: 可以用上面两类的库进行组合,例如我自己常用的是glfw + glad来进行opengl的开发, 也有很多开发者使用的是glfw + gl3w, 或者 glfw + glew

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,904评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,581评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,527评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,463评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,546评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,572评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,582评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,330评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,776评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,087评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,257评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,923评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,571评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,192评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,436评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,145评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,127评论 2 352

推荐阅读更多精彩内容