OpenGL使用简介
简介 OpenGL(Open Graphics Library)是个定义了一个跨编程语言、跨平台的编程接口的规格,是个专业的3D程序接口,是一个功能强大,调用方便的底层3D图形库。 OpenGL是个与硬件无关的软件接口,可以在不同的平台如Windows 95、Windows NT、Unix、Linux、MacOS、OS/2之间进行移植。 这个接口由近二百五十个不同的函数调用组成,用来从简单的图元绘制复杂的三维景象。在电子游戏工业里,它是颇普遍的,而另一种编程接口系统是仅用于Microsoft Windows上的Direct3D。 OpenGL常用于CAD、虚拟实境、科学视觉化程序和电子游戏开发。
发展历史 OpenGL的前身是SGI公司为其图形工作站开发的IRIS GL。1992年7月,SGI公司发布了OpenGL的1.0版本。 OpenGL历经2.0,1.5,1.4,1.3,1.2,1.1,or 1.0多个版本。现在最新的是在2006年8月3日公布的OpenGL version 2.1。 OpenGL规范由1992年成立的OpenGL架构评审委员会(ARB)维护。ARB由一些特别兴趣于建立一个统一的普遍可用的API的公司组成。根据OpenGL官方网站,2002年6月的ARB投票成员包括3Dlabs、Apple Computer、ATI Technologies、Dell Computer、Evans & Sutherland、Hewlett-Packard、IBM、Intel、Matrox 、NVIDIA、SGI和Sun Microsystems (Microsoft曾是创立成员之一,但已于2003年3月退出)。
GL的平台(1) 一般来说,VC6和VS.NET里面就带有GL的基本库 所以开发者在VC下可以使用 基于OpenGL标准开发的应用程序必须运行于32位Windows 平台下,如WindowsNT或Windows95环境;而且运行时还需有动态 链接库OpenGL32.DLL、Glu32.DLL,一般在…\WINDOWS\system32里面(注:window2000以上系统均带有OPENGL32.DLL和glu32.dll) 一般来说,VC6和VS.NET里面就带有GL的基本库 VC6:…\Microsoft Visual Studio\VC98\Include\GL VS.NET.2005:…\Microsoft Visual Studio 8\VC\PlatformSDK\Include\gl 一般是Gl.h,Glaux.h,Glu.h Lib里也有:OpenGL32.lib,GLu32.lib,GLaux.lib 所以开发者在VC下可以使用 #include <gl\gl.h> // Header File For The OpenGL32 Library #include <gl\glu.h> // Header File For The GLu32 Library #include <gl\glaux.h>// Header File For The Glaux Library
GL的平台(2) 同时OpenGL也适应别的OS和语言 在OpenGL的基础上还有Open Inventor、Cosmo3D、Optimizer等多种高级图形库,适应不同应用。可跟据需要下载相关的开发包。
OpenGL基本功能 模型绘制 模型观察 颜色模式的指定 光照应用 图象效果增强 位图和图象处理 纹理映射 实时动画 交互技术
一些命名规则 函数: OpenGL核心库(gl) OpenGL实用库(glu) 对X窗口系统的OpenGL扩展(glX) 举例: void glBegin(GLenum mode); void gluBeginCurve(GLUnurbs* nurb); void glXFreeContextEXT(Display * dpy, GLXContext ctx); 参数:GL_POINTS,GL_LINES,GL_LINE_STRIP,GL_LINE_LOOP,GL_TRIANGLES,GL_TRIANGLE_STRIP,GL_TRIAN,GL_QUADS,GL_QUAD_STRIP
数据类型名 void glVertex3s(GLshort x, GLshort y, GLshort z); void glVertex3i(GLint x, GLint y, GLint z); void glVertex3f(GLfloat x, GLfloat y, GLfloat z); void glVertex3d(GLdouble x, GLdouble y, GLdouble z);
设置Visual C/C++ 6.0 Visual C/C++的工程有两个重要选项: Console (控制台) 和 Win32应用程序将会有两个窗口: 一个控制台窗口, 以及一个 OpenGL 窗口。选择 Win32 仍然可以让你在不需要关心Windows程序设计的情况下编写 GLUT 程序. 你需要做以下设置: 选择 Project -> settings 选择 Link 选项卡 从 Category 中选择 Output 在 Entry-point synmbol 文本框中键入 mainCRTStartup 对于已存在的控制台工程, 有一个简单的办法将它转换成Win32应用程序: 根据上面的步骤修改入口点,在 Project options 文本框中用 subsystem:windows 覆盖 subsystem:console 或者你可以直接在你的源代码开头处添加: 代码 // #pragma comment( linker,"/subsystem:\"windows\"/entry:\"mainCRTStartup\"" )
在没使用GLUT的情况下(手动添加link): 在你文件头加上 #include <gl\gl.h> #include <gl\glu.h> #include <gl\glaux.h> 进入Project菜单,选Settings项,弹出 Settings 对话框,选Link项,在 Libraries 栏目中加入OpenGL库:opengl32.lib glu32.lib glaux.lib
GLUT GLUT ( OpenGL Utility Toolkit ) 安装:在windows下通过 C/C++语言编写 GLUT 程序, 你需要以下三个文件: GLUT.H - 你需要在你的源代码中包含这个文件。通常情况下,这个文件应该放在你系统的包含目录下的 GL 文件夹中。 GLUT.LIB (SGI windows版本) 以及 glut32.lib (微软版本) - 这个文件必须被连接到你的程序中, 确保它放在 LIB 目录中。 glut32.dll (Windows) 和 glut.dll (SGI Windows版本) - 根据你所使用的OpenGL选择一个,如果你正在使用微软公司的版本,那么你必须选择 glut32.dll。你应该把DLL放置在你的系统文件夹中。 举例:在window XP下使用VC6安装GLUT 下载glutdlls并解压 复制glut32.dll和glut.dll到…\windows\system32 复制glut.h到...\Microsoft Visual Studio\VC98\Include\GL 复制glut32.lib和glut.lib到…\Microsoft Visual Studio\VC98\Lib
#include <GL/glut.h> void renderScene(void) { //绘制一个简单的二维的三角形 glClear(GL_COLOR_BUFFER_BIT); glBegin(GL_TRIANGLES); glVertex3f(-0.5,-0.5,0.0); glVertex3f(0.5,0.0,0.0); glVertex3f(0.0,0.5,0.0); glEnd(); glFlush(); } void main(int argc, char **argv) { glutInit(&argc, argv); //初始化glut glutInitDisplayMode(GLUT_DEPTH | GLUT_SINGLE | GLUT_RGBA); //设置窗口的模式-深度缓存,单缓存,颜色模型 glutInitWindowPosition(100,100); //设置窗口的位置 glutInitWindowSize(320,320); //设置窗口的大小 glutCreateWindow(“3D Tech- GLUT Tutorial”); //创建窗口并赋予title glutDisplayFunc(renderScene);//调用renderScene把绘制传送到窗口 glutMainLoop(); //进入循环等待
通过定义 void glutReshapeFunc(void ( 通过定义 void glutReshapeFunc(void (*func)(int width, int height))来避免因窗口大小改变时图形的变形; 通过定义 void glutIdleFunc(void (*func)(void)); 使应用空闲时反复调用函数func 对于window的基本应用:mouse,keyboard,menu,sub window,font等glut里也提供了支持
#include<GL/glut.h> float angle = 0.0; void changeSize(int w, int h) { if(h == 0)h = 1; float ratio = 1.0* w / h; glMatrixMode(GL_PROJECTION); glLoadIdentity(); glViewport(0, 0, w, h); gluPerspective(45,ratio,1,1000); glMatrixMode(GL_MODELVIEW); gluLookAt(0.0,0.0,5.0, 0.0,0.0,-1.0, 0.0f,1.0f,0.0f); } void renderScene(void) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glPushMatrix(); glRotatef(angle,0.0,1.0,0.0); glBegin(GL_TRIANGLES); glVertex3f(-0.5,-0.5,0.0); glVertex3f(0.5,0.0,0.0); glVertex3f(0.0,0.5,0.0); glEnd(); glPopMatrix(); angle++; glutSwapBuffers();
void main(int argc, char **argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA); //设为双缓冲区, //平滑动画需要 glutInitWindowPosition(100,100); glutInitWindowSize(320,320); glutCreateWindow("Lighthouse 3D - GLUT Tutorial"); glutDisplayFunc(renderScene); glutIdleFunc(renderScene); //register a callback function to be called when the application is idle glutReshapeFunc(changeSize); //Preparing the window for a reshape glutMainLoop(); }
参考 web: specification : book: OpenGL 官方主页:http://www.opengl.org OpenGL 2.1 Reference:http://www.opengl.org/sdk/docs/man GLUT:http://www.opengl.org/resources/libraries/glut/ NEHE的在线GL教程:http://nehe.gamedev.net specification : The OpenGL Utility Toolkit (GLUT) Programming Interface (PDF) OpenGL 2.1 specification (PDF) book: OpenGL超级宝典(三版)(中文),人民邮电出版社 OpenGL编程指南(四版)(中文),人民邮电出版社 OpenGL Shading Language