在Windows下使用freeglut来开发OpenGL应用过程中,有诸多不便:
笔者使用Cygwin而非MinGW,且钟情于NetBeans而非Visual Studio,经过一番研究,找出了在基于Cygwin的NetBeans中使用freeglut来开发OpenGL应用的方法。
通过Cygwin安装完opengl及win32api组件后,在 %CygwinRoot%\usr\include\win32api\GL路径下面将出现gl.h, glaux.h, glew.h, glu.h, wglew.h等几个文件,当然,还没有freeglut.h头文件。
Transmission Zero维护着freeglut的MSVC及MinGW两个版本。MSVC版本专门针对微软的Visual Studio而设计,我们下载其MinGW版本。
为避免我们自行下载的freeglut与cygwin的组件混杂,可另外新建一个目录,如C:\freeglut。然后,将freeglut-MinGW.zip压缩文件中的include及lib两个文件夹复制到该目录中。bin文件夹下各有一个32位及64位的freeglut.dll文件。根据操作系统是32位或64位,将其复制到相应位置。对于32位的Windows,将bin\freeglut.dll复制到C:\windows\system32中。对于64位的Windows,将bin\x64\freeglut.dll复制到C:\Windows\SysWOW64中。
然后,确保C:\windows\system32或C:\Windows\SysWOW64已经出现在系统的环境变量中。
在NetBeans中新建一个C/C++应用程序,在main.cpp中输入下面的代码:
/* * File: main.cpp * Author: Sarkuya * * Created on 2015年4月13日, 下午23:13 */
#include <GL/freeglut.h>
void display() {
glClear(GL_COLOR_BUFFER_BIT);
glBegin(GL_POLYGON);
glVertex2f(-0.5, -0.5);
glVertex2f(-0.5, 0.5);
glVertex2f( 0.5, 0.5);
glVertex2f( 0.5, -0.5);
glEnd();
glFlush();
}
int main(int argc, char** argv) {
glutInit(&argc, argv);
glutCreateWindow("Freeglut Demo");
glutDisplayFunc(display);
glutMainLoop();
}
在Cygwin的两种OpenGL实现中,我们将使用win32api的方式。
点击NetBeans的菜单工具->选项,在弹出的窗口中选择C/C++,代码帮助->C++编译器的包含目录下,依据下图的最后四行进行设置:
在最后四行中,C:\cygwin64\usr\include\w32api及C:\cygwin64\include\w32api必须先出现在C:\cygwin64\usr\include之前,这样,可确保我们优先使用win32api的实现方式。倒数第2行直接将我们手工设置的freeglut的include目录添加进来,当我们在代码中包含”GL/freeglut.h”时,NetBeans自动在此目录下查找该文件。
将freeglut的包含目录设进NetBeans的环境而非特定项目属性的好处在于,以后在NetBeans中新建每个OpenGL应用,均可直接在代码中编写glut的语句了。
在NetBeans中对项目按右键,点属性,在弹出的窗口中依下图设置链接属性:
上图中,其他库目录选%FreeglutRoot%\lib\x64,告诉NetBeans,freeglut的库所在的目录。在编译行的其他选项中,需要设置四个选项。其中前面三个是与OpenGL相关的,表示链接时需使用freeglut, glu32, opengl32这三个库。第四个选项”-Wl,–subsystem,windows”Windows下独有的选项,表示此应用将以窗口方式而非命令行的方式来运行。
上面的配置,产生了下面的g++在链接时所用的命令行:
g++ -o dist/Debug/Cygwin_4.x-Windows/opengltest build/Debug/Cygwin_4.x-Windows/main.o -L../../../../Tools/Programming/FreeGlut/lib/x64 -lfreeglut -lglu32 -lopengl32 -Wl,--subsystem,windows
两相结合,更易于理解NetBeans的配置原理。
运行此应用程序,将出现经典的OpenGL应用窗口:
虽说这已经是OpenGL过时的未使用Shading Language的编程方式了,但本文的目的在于强调在特定环境中进行OpenGL应用开发。明白了这个原理,可帮助我们方便地进一步学习OpenGL编程。