GLFW初步接触

来源:互联网 发布:js 数组 json 编辑:程序博客网 时间:2024/04/30 02:04

计算机系的同学帮忙写的程序用的是freeglut。这是一个完全兼容于原来的glut库的开源库,不过我之前也没接触过glut,只知道是一个能用来创建窗口(后来大概知道还有些诸如“上下文”的专业名词)的库。但是这个库在实际使用当中有个非常严重的问题:没办法把窗口的边框和标题栏去掉。当时写的一个程序需要申请一个超过了32位系统允许的最大内存的空间,只能用64位程序实现,于是网上下了一个64位的源代码编译了一下(说起来这个库也很久没人维护了吧,最后一个版本已经是2010年的了)。可是在使用过程中死活找不到关掉边框和标题栏的选项。我很奇怪的是计算机系他们给我的程序是没有标题栏的,答曰:自己改了源代码。这我没辙了,同时不想自己再去改freeglut的源代码,不然使用起来太不方便。最后在网上找OpenGL的其他资料时看到了GLFW,感觉还不错。这也是个开源库,跨平台,并且不断地再完善,用起来也比较方便。

GLFW的官方网站上有技术文档,写明了如何配置。首先需要include它的头文件。如果需要GLEW,则要把GLEW在其之前包括进去。我用的是VS2010的环境,在工程选项里把lib也链接好之后,却发现默认的静态链接库运行程序马上出错,连官网的例子都没法运行。后来试了一下用动态链接的方式,加了一句:#define GLFW_DLL,发现好使了。也许是因为下载的预编译库实际上是给VS2012用的缘故?

在https://open.gl上的OpenGL的教程里,创建窗口之前还有这么几句:

glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 2);glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);

说是让程序支持OpenGL 3.2的新特性。后来发现,这几句代码实际上限制死了程序使用OpenGL 3.2版本。但实际上实验室的显卡已经支持到OpenGL 4.4,有一些新特性在3.2下反而无法使用。最后注释了这几句,发现反而没有了限制,也没有出现其他问题。

下面两句就很重要了:

glfwWindowHint(GLFW_RESIZABLE, GL_FALSE);//不可改变大小glfwWindowHint(GLFW_DECORATED, GL_FALSE);//没有边框和标题栏

我需要的程序并不允许改变窗口大小,也不应该显示边框和标题栏。

最后使用glfwCreateWindow创建一个窗口。原本这个程序应该是个全屏程序(这也是为什么不需要边框和标题栏的原因),但是由于是创建一个跨越了若干屏幕的大全屏程序,普通的全屏方式只能缩到一个屏幕里。GLFW能做到多窗口,但是实际测试时发现这几个窗口没有办法同时全屏,当焦点放在某一个全屏窗口时,其他窗口会自动最小化。我对窗口的创建实在是不熟悉,不知道如何解决,于是干脆做一个大的跨多屏的无边框窗口,省事。

窗口创建完毕之后还要初始化一下GLEW,然后跟窗口打交道的部分就基本完成了,主函数里用一个while循环,把自己写的绘制程序写进去,swapbuffers一下再pollevents一下。总体流程跟freeglut很像,不过freeglut主循环是用了一个反馈函数,并不是写的while。我并不了解其中的工作原理,写死的while如何在其中得到键盘等反馈?是消息机制之类的?那么GLFW的while循环和freeglut的反馈函数这两种方式孰优孰劣呢?


参考:

http://www.glfw.org

https://open.gl

0 0
原创粉丝点击