OpenGL(Open Graphics Library)是个定义了一个跨编程语言、跨平台的编程接口的规格,它用于三维图象(二维的亦可)。OpenGL是个专业的图形程序接口,是一个功能强大,调用方便的底层图形库。
OpenGL是个与硬件无关的软件接口,可以在不同的平台如Windows 95、Windows NT、Unix、Linux、MacOS、OS/2之间进行移植。因此,支持OpenGL的软件具有很好的移植性,可以获得非常广泛的应用。
开发基于OpenGL的应用程序,必须先了解OpenGL的库函数。它采用C语言风格,提供大量的函数来进行图形的处理和显示OpenGL图形库一共有100多个函数,它们分别属于 OpenGL的基本库、实用库、辅助库等不同的库。
核心库gl,它们是最基本的函数,这部分函数用于常规的、核心的图形处理。
实用库glu(OpenGL utility library),包含的函数功能更高一些,如绘制复杂的曲线曲面、高级坐标变换、多边形分割等。Glu函数通过调用核心库的函数,为开发者提供相对简单的用法,实现一些较为复杂的操作。
辅助库glaux(OpenGL auxiliary library),包括简单的窗口管理、输入事件处理、某些复杂三维物体绘制等函数。
每个扩展都有一个扩展名,扩展名类似如下形式:
GL_ARB_multitexture
第一段GL,用来表示针对OpenGL哪部分开发的扩展,有以下几个值:
GL – 针对OpenGL核心的扩展
WGL – 针对Windows平台的扩展
GLX – 针对Unix / Linux平台的扩展
GLU – 针对OpenGL Utility Library的扩展
第二段ARB,用来表示是谁开发的这个扩展,常见以下几个值:
ARB – 经OpenGL Architecture Review Board(OpenGL管理机构)正式核准的扩展,往往由厂商开发的扩展发展而来,如果同时存在厂商开发的扩展和ARB扩展,应该优先使用ARB扩展
EXT – 被多个硬件厂商支持的扩展
NV – nVIDIA 公司开发的扩展
ATI – ATI公司开发的扩展
ATIX– ATI公司开发的实验性扩展
SGI – Silicon Graphics(SGI)公司开发的扩展
SGIX– Silicon Graphics(SGI)公司开发的实验性扩展
第三段multitexture就是真正的扩展名了,如multitexture就是多重纹理扩展。
OpenGL在windows的VS开发环境中已经有了第一版(OpenGL1.1)的头文件(gl.h、glu.h),导入库(opengl32.lib、glu32.lib),动态库(opengl32.dll、glu32.dll)
inc路径通常为C:\Program Files\Microsoft SDKs\Windows\v6.0A\Include\gl
lib路径通常为C:\Program Files\Microsoft SDKs\Windows\v6.0A\Lib
dll路径通常为C:\Windows\system32(32位系统)或C:\Windows\syswow64(64位系统)
glut(OpenGL Utility Toolkit)提供对窗口的封装,这是跨平台窗口的,我们就不必自己去编写烦琐的窗口代码。
它由Mark Kilgard在SGI时写的。作为AUX库的功能更强大的替代品,用于隐藏不同窗口系统API的复杂性。
是一个学习OpenGL编程的一个良好开端。
目前最新版本为3.7
1、下载glut:http://www.opengl.org/resources/libraries/glut/glutdlls37beta.zip
2、解压文件后你会得到5个文件,头文件glut.h、导入库glut32.lib和glut.lib、动态库glut32.dll和glut.dll
3、将glut.h放入inc路径
4、将glut32.lib和glut.lib放入lib路径
5、将glut32.dll和glut.dll放入dll路径
glee (OpenGL Easy Extension library),方便用来判断当前系统是不是支持某项OpenGL特性,我们就不用自己去写烦琐的先取函数地址然后再判断的代码了
下载glee:http://elf-stone.com/,同理,放入到inc路径,lib路径,dll路径
使用方式如下:
#include // (no need to link to gl.h)
...
if (GLEE_ARB_multitexture) //is multitexture support available?
{
glMultiTexCoord2fARB(...); //safe to use multitexture
}
else
{
//fallback
}
glew(OpenGL Extension Wrangler Library)因为windows默认只支持OpenGL 1.1,你要想用更高版本的OpenGL,你就需要安装它,它能自动识别你的平台所支持的全部OpenGL高级扩展函数
下载glew:http://glew.sourceforge.net/,同理,放入到inc路径,lib路径,dll路径
使用方式如下:
#include
...
if (GLEW_ARB_vertex_program)
{
/* It is safe to use the ARB_vertex_program extension here. */
glGenProgramsARB(...);
}
使用VS新建个空的控制台程序
增加main.cpp写入如下代码:
#include
void MyDisplay(){
glClear(GL_COLOR_BUFFER_BIT);
glRectf(-0.5f, -0.5f, 0.5f, 0.5f);
glFlush();
}
int main(int argc, char* argv[]){
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
glutInitWindowPosition(100, 100);
glutInitWindowSize(640, 480);
glutCreateWindow("glut window");
glutDisplayFunc(MyDisplay);
glutMainLoop();
return 0;
}
注意,打开glut.h文件,可以发现如下包含和导入:
#include
#include
#pragma comment (lib, "winmm.lib") /* link with Windows MultiMedia lib */
#pragma comment (lib, "opengl32.lib") /* link with Microsoft OpenGL lib */
#pragma comment (lib, "glu32.lib") /* link with OpenGL Utility lib */
#pragma comment (lib, "glut32.lib") /* link with Win32 GLUT lib */
所以我们只用简单的#include
就可以了,是不是很方便
glut的api就是以glut为前缀,函数作用基本看名字就能了解了
1、glutInit:初始化glut库,没有反初始化函数
2、glutInitDisplayMode:初始化显示模式
3、glutInitWindowPosition:初始化窗口位置
4、glutInitWindowSize:初始化窗口大小
5、glutCreateWindow:创建窗口
6、glutDisplayFunc:设置显示函数
7、glutMainLoop:窗口消息循环
8、glClear清屏,全0为黑色
9、glRectf画个矩形,四个参数分别表示了位于对角线上的两个点的横、纵坐标
10、glFlush:保证前面的OpenGL命令立即执行(而不是让它们在缓冲区中等待),其作用跟fflush(stdout)类似