opengl学习笔记(一)
ubuntu下opengl的安装及配置
OpenGL 是一套由SGI公司发展出来的绘图函数库,它是一组 C 语言的函数,用于 2D 与 3D 图形应用程序的开发上。OpenGL 让程序开发人员不需要考虑到各种显示卡底层运作是否相同的问题,硬件由 OpenGL 核心去沟通,因此只要显示卡支援 OpenGL,那么程序就不需要重新再移植,而程序开发人员也不需要重新学习一组函数库来移植程序。
安装
首先不可或缺的就是编译器与基本的函数库,如果系统没有安装的话,依照下面的方式安装:
sudo apt-get install build-essential
安装OpenGL Library
1 sudo apt-get install libgl1-mesa-dev
安装OpenGL Utilities
1 sudo apt-get install libglu1-mesa-dev
OpenGL Utilities 是一组建构于 OpenGL Library 之上的工具组,提供许多很方便的函数,使 OpenGL 更强大且更容易使用。
安装OpenGL Utility Toolkit
1 sudo apt-get install libglut-dev
OpenGL Utility Toolkit 是建立在 OpenGL Utilities 上面的工具箱,除了强化了 OpenGL Utilities 的不足之外,也增加了 OpenGL 对于视窗介面支援。
注意:在这一步的时候,可能会出现以下情况,shell提示:
将上述$ sudo apt-get install libglut-dev命令改成$ sudo apt-get install freeglut3-dev即可。
测试
示例test.c源码:
#include <GL/glut.h> void init(void) { glClearColor(0.0, 0.0, 0.0, 0.0); glMatrixMode(GL_PROJECTION); glOrtho(-5, 5, -5, 5, 5, 15); glMatrixMode(GL_MODELVIEW); gluLookAt(0, 0, 10, 0, 0, 0, 0, 1, 0); return; } void display(void) { glClear(GL_COLOR_BUFFER_BIT); glColor3f(1.0, 0, 0); glutWireTeapot(3); glFlush(); return; } int main(int argc, char *argv[]) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE); glutInitWindowPosition(0, 0); glutInitWindowSize(300, 300); glutCreateWindow("OpenGL 3D View"); init(); glutDisplayFunc(display); glutMainLoop(); return 0; }
编译程序时,执行以下指令:
$ gcc -o test test.c -lGL -lGLU -lglut
执行:
$ ./test
程序运行结果
初始化一个窗口,并在窗口中绘制一个茶壶
源码分析:
1.初始化和创建窗口
在打开窗口之前,必须指定窗口的特征。它是单缓存的还是双缓冲的?它把颜色存储为RGBA值还是颜色索引值?它应该出现在显示屏幕的什么位置?为了在应用程序中指定这些问题的答案,在使用glutCreateWindows()函数打开窗口之前,分别必须调用glutInit(),glutInitdisplayMode(),glutInitWindowSize(),和glutInitWindowPosition函数。
void glutInit( int argc, char** argv)
在调用其它任何GLUT函数之前首先要调用这个函数,它对GLUT函数库进行初始化。这个函数的参数值应与main()函数相同。
void glutInitDisplayMode(unsigned int mode);
指定glutCreateWindow()函数将要创建的的窗口的显示模式(例如使用RGBA还是颜色索引,使用单缓冲区还是双缓冲等)。另外,它还可以指定与这个窗口相关联的深度缓冲区,模板缓冲区,和累积缓冲区。mode参数的值是GLUT_RGBA(或GLUT_INDEX),GLUT_SINGLE(或GLUT_DOUBLE)以及缓冲区启用标记(GLUT_DEPTH, GLUT_STENCIL, GLUT_ACCUM)的按位OR组合。这个参数的默认值为GLUT_RGBA | GLUT_SINGLE(使用RGBA模式和单缓冲)。
void glutInitWindowPosition( int x, int y);
void glutInitWindowSize( int width, int height );
请求glutCreateWindow()函数创建的窗口具有指定的大小和位置。
int glutCreateWindow(char *name);
打开一个具有以上设置的特征(显示模式,宽度,高度等)的窗口。如果窗口系统支持,name字符串可以出现在窗口的标题栏上。进入glutMainLoop()之前,这个窗口并不会显示,因此在显示窗口之前不要在窗口中进行渲染。
2. 处理窗口和输入事件
在窗口创建之后,但是在进入主循环之前,应该使用下面这些函数注册相关的回调函数。
void glutDisplayFunc( void(*func)(void));
指定了当窗口的内容需要重新绘制时将要调用的函数。在发生下面这些情况时,窗口就需要进行重绘:窗口刚打开,窗口弹出,窗口的内容遭到破坏,以及显示的调用了glutPostRedisplay()函数。
3.初始化和绘制三维物体
GLUT提供了很多绘图函数。这些函数都是在立即模式下渲染所有的几何图形。每个三维物体可以采用以下两种风格之一:没有表面法线的线框模式和具有着色和法线的实心形式。需要使用光照的时候,必须使用实心模式。只有绘制茶壶模型的函数能够生成纹理坐标。
void glutWireTeapot(GLdouble size);
void glutWireTeapot(GLdouble size);
分别用来绘制茶壶的线框形式和实心形式。
4.运行程序
在完成设置之后,GLUT程序就进入事件处理循环glutMainLoop()