TAG:
一、前言
科学计算可视化、计算机动画、虚拟现实是计算机图形学领域内三大活跃的发展方向,它们的技术核心都是三维真实感图形。而OpenGL就是这三维真实感图形的构造之一。
二、概述
1、Direct3D & OpenGL
Direct3D是Microsoft的DirectX其中的一个COM组件,目前最新版本是Direct9.0c;OpenGL最初由SGI 开发,目前由OpenGL体系结构审核委员会(ARB)所维护。OpenGL ARB是个行业协会,负责OpenGL以及相关技术的发展和演变。OpenGL ARB由下面这些计算机图形行业的领先企业所组成:3Dlabs、Apple、ATI、Dell、IBM、Intel、NVIDIA、SGI和Sun Microsystems。最新的规范是2.0。有两套实现,一套是SGI的OpenGL实现,一套是Microsoft的OpenGL实现。目前Microsoft的OpenGL只支持1.1规范。
Direct3D: 1、适合做游戏开发。DirectX是非常成熟的游戏开发的组件,辅助的功能库、数学库都很强大和成熟,如D3DX.lib中包含的大量辅助函数,而OpenGL没有这些相关的东西,它只专注于3d的渲染,辅助的东西不得不由第三方提供,或者自己开发...而且DirectX更新比较快。2、Direct3D是面向对象的COM实现。OpenGL只是一套面向结构的图形API。3、OpenGL不支持一些低端显卡。
OpenGL:1、跨平台性。可应用在Windows、OS/2、Unix、Max等系统上。2、在光源和纹理的处理上性能比较优秀。
2、OpenGL的发展
OpenGL(Open Graphics Library),开放图形程序接口。
1、1992年7月,SGI公司发布OpenGL1.0。
2、1995年,SGI发布OpenGL1.1 。
3、2001年8月,ARB发布OpenGL1.3规范。
4、2003年7月,ARB公布OpenGL1.5规范。
5、2004年8月,ARB发布OpenGL2.0规范。
3、OpenGL的工作结构
OpenGL DLL:opengl32.dll,glu.dll
Server DLL:Winsrv.dll
Win32 DDI:Win32设备驱动接口
三、OpenGL基本功能
(1) 建模功能(点、线、复杂曲线、曲面)
(2) 变换功能(模型变换:平移、旋转、缩放等;投影变换:透视投影、正射投影)
(3) 颜色模式(RGBA颜色模式、索引颜色模式)
(4) 光照材质(光照模型:辐射光、环境光、漫反射光、镜面光。材质:光的反射率)
(5) 图像处理(图象显示、增加)
(6) 纹理映射(包含颜色、alpha值、亮度等数据的矩形数据)
(7) 动画制作(双缓存动画:后台缓存计算场景、生成动画,前台缓存显示后台缓存已画好的画面)
(8) 交互技术(选择、拾取、反馈三种机制)
四、OpenGL的组成
1、(1)OpenGL核心函数(115个函数,函数名前缀为gl) opengl32.dll
(2)OpenGL实用库函数(43个函数,函数名前缀为 glu) glu.dll
(3)OpenGL辅助库函数(31个函数,函数名前缀为 aux) glaux.dll
(4)Windows专用函数
(5)Win32 API函数
(6)OpenGL状态变量
2、学习界面库:Glut32.dll
五、OpenGL变换
1、三维图形的输出过程
计算机屏幕上只能表现二维图象,在三维图形到二维平面之间,需要什么样的变换,才能真实反映
世界。我们用照相机来模拟这一个过程。首先,在相机的前面是真实的三维世界,而在相机的取景器上出现的是二维平面。 投影变换---使用变焦镜头,可以在不改变相机与被摄物体之间的空间距离的情况下,改变被摄物体在取景器中投影的大小。
模型变换---改变被摄物体在取景器中的位置。
视点变换---人通过改变相机的方向和位置,可以改变出现在取景器中的景物;改变相机与被摄物体之间的空间距离,使被摄物体在取景器中的大小变化。
视口变换---冲洗相片底片时,还可以调整成像的位置,仅仅使照片中的影像的一部分显现出来。
2、坐标系和坐标变换
三维世界使用世界坐标系,屏幕使用屏幕坐标系。
3、投影变换 (1) 平行投影
Void glOrtho(Left, Right, Bottom, Top, Near, Far);
(2) 透视投影
Void glFrustum(Left, Right, Bottom, Top, Near, Far);
4、模型变换
(1)平移
//将原点向Z负方向移动4.5,所有的Z坐标被加了4.5 glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glTranslatef(0.0f,0.0f, -4.5f);
// 绘制图形;
glFinish();
(2)旋转
glRotatef(60.0f,0.0f, 1.0f,0.0f);
(3)缩放
glScalef(1.5f,1.0f,1.0f) 5、视口变换
glViewPoint(x, y, width, height)
六、绘制图形
1、绘制
(1)、画点
glBegin( GL_POINTS);
glVertex2f( 0.0f, 0.0f);
glEnd();
glFinish();
(2)、画线
glBegin( GL_LINES);
glVertex2f( 0.5f, 0.0f);
glVertex2f( -0.5f, 0.0f);
glEnd();
glFinish();
2、消隐:清除一个物体被其他物体挡住的部分的操作称做消隐。
3、显示列表
显示列表由一组预先定义并储存起来可以在以后执行的OpenGL函数组成。
3.1 为什么要有显示列表
提高应用程序的运行性能。
3.2 如何使用显示列表
glNewList(1, GL_COMPILE)
glBegin();
…
glEnd();
glEndList();
…
glCallList(1);
七、真实感世界生成
1、光源材质
光从物体表面反射形成反射光;光穿透物体,形成透射光;光被物体吸收,转换称为物体的内能。OPENGL的光照模型分为4个独立组成部分:辐射光、环境光、漫反射光、镜面反射光。材质是物体对光的反射率。 示例代码:
GLfloat mat_specular[] = { 1.0, 1.0, 1.0, 1.0};
GLfloat light_postion[] = {1.0, 1.0, 1.0, 1.0};
glMaterialfv( GL_FRONT, GL_SPECULAR, mat_specular);
glLightfv( GL_LIGHT0, GL_POSITION, light_postion);
glEnable(GL_LIGHT0);
2、纹理映射
纹理是包含颜色、alpha值、亮度等数据的矩形数据。将纹理数据贴在多边形上,多边型在变换时,仍保证纹理的图案与多边形保持一致性。例如:采用透视投影观察墙面的时候,远端的砖会变小,而近处的砖会变大。
glTextImage2D(GL_TEXTURE_2D, level, components, width, height, border, format, type, pixels);
......
十、OpenGL动画
应用程序绘制动画时,可以先将图象绘制到后台缓冲区中,绘制结束后可以通过交换缓冲区,将后台缓冲区已经绘制好的图象直接送到前台缓冲区中,由系统显示功能完成屏幕的显示,此时应用程序已经开始在后台缓冲区中绘制下一幅图象了。
auxSwapBuffers();
(still05017) |