第二章图形学编程_第1页
第二章图形学编程_第2页
第二章图形学编程_第3页
第二章图形学编程_第4页
第二章图形学编程_第5页
已阅读5页,还剩60页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第二章图形学编程API的早期历史 IFIPS (1973) 组织了两个委员会建立图形API的标准 图形核心系统(Graphical Kernel System, GKS) 二维,同时包含很好的工作站模型 Core: 同时应用于二维和三维 GKS成为ISO标准,稍后成为ANSI标准(1980s) GKS很难推广到三维(GKS-3D) 远远落后于硬件的发展PHIGS与X API的早期历史 IFIPS (1973) 组织了两个委员会建立图形 API的标准 图形核心系统(Graphical Kernel System, GKS) 二维,同时包含很好的工作站模型 Core: 同时应用于二维和三维 GKS

2、成为ISO标准,稍后成为ANSI标准(1980s) GKS很难推广到三维(GKS-3D) 远远落后于硬件的发展SGI和GL Silicon Graphics (SGI) 通过硬件实现流水 线体系,改良了图形工作站 (1982) 应用程序通过一个称为GL的库与系统通 讯 借助于GL,可以非常简单地设计出三维 交互图形应用程序OpenGL GL的成功导致了OpenGL的出现(1992), 这是一个与平台无关的API: 易于使用 与硬件非常贴近,从而可以充分发挥其功能 着重在于渲染 (rendering) 没有提供窗口和输入接口,从而避免依赖于具 体的窗口系统OpenGL的发展 早期是由Archit

3、ectural Review Board (ARB)掌握其发展的 成员包括SGI, Microsoft, Nvidia, HP, 3DLabs, IBM, 相对稳定(版本序列为1.0 - 1.5, 2.0, 2.1,) 发展反映了新的硬件能力 3D纹理映射和纹理对象 顶点编程 通过扩展可以指定具体平台相应的功能 现在ARB被Kronos取代OpenGL库 OpenGL核心库 Windows: OpenGL32 大多数Unix/Linux系统:GL库(libGL.a) OpenGL实用库(Utility Library, GLU) 利用OpenGL核心库提供一些功能,从而避免重复编写 代码 与窗

4、口系统的连接 X Windows系统:GLX Windows: WGL Macintosh: AGLGLUT OpenGL实用工具库(OpenGL Utility Toolkit Library, GLUT) 提供所有窗口系统的共同功能 打开窗口 从鼠标和键盘获取输入 弹出菜单 事件驱动 代码可以在平台间移植,但是GLUT缺乏在特定 平台上优秀工具包所具有的功能 滚动条软件组织VideoControllerMonitorCPUFrame bufferSystemmemoryPeripheral devicesSystem busDisplay processorOpenGL的函数 基本几何形状

5、 点 线段 多边形 属性 变换 视图 Viewing 建模 控制(GLUT) 输入(GLUT) 查询OpenGL的状态 OpenGL是一个状态机(state machine) OpenGL函数具有两种类型 生成基本形状 如果形状可见,可以得到输出 顶点如何被处理,基本形状的外观由状态控制 改变状态 变换函数 属性函数面向对象方面的缺陷 OpenGL不是面向对象的,因此逻辑上的 一个函数却对应着多个OpenGL函数: glVertex3f glVertex2i glVertex3dv 内在存贮模式是相同的 在C+中很容易创建重载函数,但效率却 成为主要问题OpenGL函数名称的格式 函数的功能

6、glVertex3f(x, y, z) 属于GL库参数个数 x, y, z为float glVertex3fv(p) 注意每部分的大小写 p为指向float的指针OpenGL中的#define 绝大多数常数采用define在头文件 gl.h, glu.h和glut.h中定义 注意#include 会自动包含其它两 个头文件 例如: glBegin(GL_POLYGON); glClear(GL_COLOR_BUFFER_BIT); 在头文件中也定义了OpenGL数据类型: GLfloat, GLdouble, 如何获取OpenGL? OpenGL核心库与实用库:Windows 98, NT 3

7、.5后系统自带 C/C+语言编程库:VC 6 or higher GLUT: 课程网页 安装:编译其中的工程文件。在VC7中需要手 工复制相应文件glut.h, glut32.lib, glut32.dll到 特定位置。如何编译VC 6 创建一个win32 console application类型的 workspace文件 创建一个C/C+文件,包含前面的代码,并把这 个文件插入到workspace文件中 进入菜单Project Settings, 选择Link标签, 在Object/library modules文本框中加上 opengl32.lib, glu32.lib, glut32.

8、lib, 注意用空格分 开一个简单的示例程序glBegin( GL_LINES); glVertex2f( 0.0, 0.0); glVertex2f( 1.0, 1.0); glEnd();glBegin( GL_LINES); double t = 0.;for (int i=0; i 11; +i) glVertex2f( 0., 0.); glVertex2f( cos(t), sin(t) ); t = t + 0.05 * 3.14159; glEnd();程序结构 绝大多数OpenGL程序具有类似的结构,包含下 述函数 main(): 定义回调函数 打开一个或多个具有指定属性的窗

9、口 进入事件循环(最后一条可执行语句) init(): 设置状态变量设置状态变量 视图 属性 回调 显示函数 输入和窗口函数 #include / glut.h includes gl.h and glu.h void display() . . . void init() . . . int main( int argc, char *argv) . . . void display() glClear( GL_COLOR_BUFFER_BIT); / Clear the frame buffer glColor3f( 0.0, 1.0, 0.0); / Set current color

10、to green glBegin( GL_POLYGON); / Draw the triangle glVertex2f( -0.7, -0.7); glVertex2f( 0.7, -0.7); glVertex2f( 0, 0.7); glEnd(); glFlush(); / Force to display the new drawings immediatelyvoid init() glClearColor( 0.0, 0.0, 0.0, 0.0); / Set the clear color to black / Specify the boundaries of the vi

11、ewing window glMatrixMode(GL_PROJECTION); glLoadIdentity();gluOrtho2D(-1.0, 1.0, -1.0, 1.0); / The para are: (left, right, bottom, top) glMatrixMode(GL_MODELVIEW);int main( int argc, char *argv) glutInit( &argc, argv); / Initialize GLUT function callings/ Set window size (width, height) in number of

12、 pixels glutInitWindowSize( 400, 400); / Set window position, from the left and top of the screen, glutInitWindowPosition( 200, 100); / in numbers of pixels / Specify a window creation event glutCreateWindow( Green Triangle); / Specify the drawing function that is called when the window glutDisplayF

13、unc( display); / is created or re-drew init(); / Invoke this function for initializationglutMainLoop(); / Enter the event processing loop return 0; / Indicate normal termination / (Required by ANSI C)Main.c#include main(int argc 这自动包含了gl.hint argc, char* argv)glutInit(&argc,argv);glutInitDisplayMode

14、(GLUT_SINGLE|GLUT_RGB);glutInitWindowSize(500,500);glutInitWindowPosition(0,0);glutCreateWindow(“简单示例”);定义窗口属性glutCreateWindow( );glutDisplayFunc(mydisplay);init();显示回调函数glutMainLoop();设置OpenGL状态进入事件循环GLUT函数glutInit使得应用程序可以获取命令行参数并初始化系统 glutInitDisplayMode设置窗口的属性 RGB颜色 单缓冲区 属性按照逻辑或组合在一起 glutWindowSi

15、ze 以像素为单位定义窗口的尺寸 glutWindowPosition 定义窗口左上角在显示器上的位置 glutCreateWindow创建窗口,标题来自于参数值 glutDisplayFunc定义显示回调函数 glutMainLoop进入无穷的事件循环init.c void init() glClearColor(0.0, 0.0, 0.0, 1.0);/清除色(背景色)为黑色, 不透明窗口 glColor3f(1.0, 1.0, 1.0);/GL 矩形填充以白色 glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(-1.0, 1.0

16、, -1.0, 1.0, -1.0, 1.0);/视景体 坐标系 在glVertex中的单位是由应用程序确定 的,称为对象(世界)坐标系 视景体也是相对于世界坐标系指定的,视 景体确定出现在图像中的对象 在OpenGL内部,会把世界坐标转化为照 相机(视点)坐标,稍后转化为屏幕坐标 实际上,OpenGL也用到一些内部表示, 其对应用程序是不可见的OpenGL中的照相机 照相机被放置在对象坐标系的原点,指向z 轴的负方向默认的视景体是一个中心在 原点,边长为2的立方体变换与视图 在OpenGL中投影是利用投影矩阵乘法(变换)进 行的 由于只存在一个变换函数系列,因此必须先设 置矩阵模式 glMa

17、trixMode(GL_PROJECTION); 变换函数是累加在一起的,因此需要从单位阵 开始,然后把它改变为一个投影矩阵以定义视 景体 glLoadIdentity(); glOrtho(-1.0, 1.0, -1.0, 1.0, -1.0, 1.0);二维与三维视图 在glOrtho(左,右,底,顶,近,远)中的近与 远是相对于照相机的距离而言的 二维顶点命令把所有的顶点放在z=0的平面上 如果应用程序处于二维状态,那么可以使用下 述函数设置正交视景体: gluOrtho2D(左,右,底,顶) 对于二维情形,视景体或裁剪体退化为裁剪窗 口mydisplay.c void mydispla

18、y() glClear(GL_COLOR_BUFFER_BIT); glBegin(GL_POLYGON); glVertex2d(-0.5,-0.5); glVertex2d(-0.5,0.5); glVertex2d(0.5,0.5); glVertex2d(0.5,-0.5); glEnd(); glFlush(); OpenGL的基本几何形状属性 属性是OpenGL中状态的一部分,确定对 象的外观 颜色(点、线、多边形) 点的大小 线段的宽度与实虚模式 多边形的模式 前后面 填充模式:颜色或模式 显示为实心多边形或者只显示边界RGB颜色 颜色的每个分量在帧缓冲区中是分开存贮的 在缓冲区

19、中通常每个分量占用8位字节 注意在函数glColor3f中颜色值的变化范围是 从0.0(无)到1.0(全部), 而在glColor3ub中颜色 值的变化范围是从0到255索引颜色 由一组RGB值构成一张表,“颜色”是表中项 的索引 需要更少的内存 索引通常只有8位 现在重要性下降 内存价格下降 需要更多的颜色颜色与状态 由glColor*设置的颜色成为状态的一部分,后 续构造过程将使用这一颜色,直至它被修改为 止 颜色与其它属性不是对象的一部分,但是在渲染对象时 要把这些属性赋给对象 可以按下述过程创建具有不同颜色的顶点 glColor glVertex glColor glVertex颜色的

20、光滑化过渡 默认状态是光滑过渡 OpenGL根据多边形顶点的颜色插值 出来内部的颜色 另外一种状态是平坦过渡 第一个顶点的颜色确定填充颜色 glShadeModel(GL_SMOOTH) 或 glShadeModel(GL_FLAT)视窗 并不需要把整个当前窗口用来显示图像: glViewport(x,y,w,h) 参数值以像素为单位(屏幕坐标)三维图形 提供一个更复杂的三维图形示例 分形:Sierpinski垫 gasket 介绍隐藏面消除 在OpenGL中二维应用程序是三维应用程 序的特殊情形 要得到三维图形应用程序 只需对前面程序进行很小的修改 使用glVertex3*( ) 必须考虑多

21、边形绘制的顺序或者启用隐藏面消 除功能 只考虑平面的简单凸多边形Sierpinski Gasket (2D) 从一个三角形开始 连接三边的中点并去掉中间的三角形 重复上述过程分形 考虑黑色填充区域的面积与周长(即包含填充 区域的所有线段总长) 当持续细分时 面积趋向于零 但周长趋向于无穷 因此无穷细分后的结果不是通常的几何形状 它的维数既不是一维的,也不是二维的 我们称之为分形程序开头 #include / a point data type typedef GLfloat point22; /initial triangle point2 v = -1.0, -0.58, 1.0, -0.5

22、8, 0.0, 1.15; int n; / number of recursive steps三角形细分void divide_triangle(point2 a, point2 b, point2 c, int m)/ triangle subdivision using vertex numberspoint2 v0, v1, v2;int j;if(m0) for(j=0; j2; j+) v0j=(aj+bj)/2;for(j=0; j2; j+) v1j=(aj+cj)/2;for(j=0; j0) for(j=0; j3; j+) v1j=(aj+bj)/2;for(j=0; j

23、3; j+) v2j=(aj+cj)/2;for(j=0; j0) /* compute six midpoints */for(j=0; j3; j+) mid0j=(aj+bj)/2;for(j=0; j3; j+) mid1j=(aj+cj)/2;for(j=0; j3; j+) mid2j=(aj+dj)/2;for(j=0; j3; j+) mid3j=(bj+cj)/2;for(j=0; j3; j+) mid4j=(cj+dj)/2;for(j=0; j3; j+) mid5j=(bj+dj)/2;/* create 4 tetrahedrons by subdivision */divide_tetra(a, mid0, mid1, mid2, m-1);divide_tetra(mid0, b, mid3, mid5, m-1);divide_tetra(mid1, mid3, c, mid4, m-1);divide_tetra(mid2, mid4, d, mid5, m-1);else(tetra(a,b,c,d); /* draw tetrahedron at end of recursion

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论